From a75ebc25f0df9677040360a46086a2ea0a92490d Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 15 Sep 2013 14:38:01 +0200 Subject: [PATCH 01/20] update to 2012.09.0 --- .gitignore | 1 + .tarball-version | 2 +- config/busybox/Config.in | 15 +- config/busybox/coreutils/Config.in | 8 +- config/busybox/editors/Config.in | 8 - config/busybox/networking/Config.in | 8 +- config/busybox/networking/udhcp/Config.in | 9 +- config/busybox/procps/Config.in | 107 +- config/busybox/sysklogd/Config.in | 3 + config/busybox/util-linux/Config.in | 16 +- config/setup/Kconfig | 28 +- config/setup/ptxdistrc.default | 6 +- configure | 7733 ----------------- configure.ac | 2 +- generic/etc/prelink.conf.d/gstreamer1 | 1 + generic/lib/init/nm-unmanage.sh | 4 + generic/lib/systemd/ifupdown-prepare | 5 + .../lib/systemd/system/NetworkManager.service | 8 + generic/lib/systemd/system/ntpd.service | 8 + patches/DeviceKit-disks-009/autogen.sh | 2 +- patches/DirectFB-1.4.3/autogen.sh | 2 +- patches/Frodo-4.1b/autogen-generic.sh | 2 +- patches/MesaLib-8.0.3/autogen.sh | 2 +- ...socketcan-to-the-python-socket-modul.patch | 224 + ...EOF-rather-than-AC_TRY_COMPILE-for-l.patch | 37 + ..._DOUBLE-to-detect-long-double-suppor.patch | 35 + .../0004-use-PGEN_FOR_BUILD.patch | 32 + ...eak-host-path-into-cross-compilation.patch | 40 + .../0006-add-cross-compilation-support.patch | 61 + ...-python-don-t-add-rpaths-in-setup.py.patch | 31 + .../0008-add-more-search-paths.patch | 28 + patches/Python-2.7.5/autogen.sh | 14 + patches/Python-2.7.5/series | 11 + patches/at-3.1.12/autogen.sh | 2 +- patches/audiofile-0.3.4/autogen.sh | 2 +- patches/aumix-2.9.1/autogen.sh | 2 +- patches/bridge-utils-1.5/autogen.sh | 2 +- ...-include-sys-resource.h-where-needed.patch | 103 - ...e-pkg-config-to-look-up-selinux-libs.patch | 63 - .../0100-Fix-compilation-on-Darwin.patch | 25 - ...n_code-don-t-fail-on-Linux-version-s.patch | 38 - .../0200-reactivate-check-for-tty.patch | 2 +- ...arning-when-building-applets-usage_p.patch | 2 +- ...-only-pass-real-libs-to-SELINUX_LIBS.patch | 6 +- ...honour-SKIP_STRIP-and-don-t-strip-if.patch | 2 +- .../{busybox-1.20.2 => busybox-1.21.0}/series | 6 +- patches/cgicc-3.2.9/autogen.sh | 2 +- .../0001-Fix-cross-compilation.patch | 22 + patches/comgt.0.32/series | 4 + patches/cppunit-1.12.1/autogen.sh | 2 +- .../0001-Pregenerate-keys-ssl.c.patch | 0 patches/{crda-1.1.2 => crda-1.1.3}/series | 0 .../0001-Fix-build-on-Darwin.patch | 1 - .../series | 0 patches/eggdbus-0.6/autogen.sh | 2 +- patches/evtest-1.25/autogen.sh | 2 +- patches/fam-2.7.0/autogen.sh | 2 +- patches/fcgi-2.4.0/autogen.sh | 2 +- .../flup-1.0.2/0001-support-python2.7.patch | 31 + patches/flup-1.0.2/autogen.sh | 2 +- patches/flup-1.0.2/series | 4 + .../flup-1.0.2/setuptools-0.6c11-py2.7.egg | Bin 0 -> 332005 bytes patches/fontconfig-2.6.0/autogen.sh | 2 +- patches/glademm-2.6.0/autogen.sh | 2 +- patches/glib-2.34.3/autogen.sh | 2 +- ...cumentation-generator-tools-with-CC_.patch | 99 - patches/gnuplot-4.4.3/series | 5 - ...-when-building-the-documentation-ge.patch} | 8 +- ...2-Don-t-build-and-install-info-pages.patch | 31 + patches/gnuplot-4.6.2/series | 5 + patches/grub-0.97/autogen.sh | 2 +- .../0001-remove-endianness-swapping.patch | 42 + .../0002-add-rgb666-support.patch | 49 + patches/gst-plugins-bad-1.0.8/series | 5 + patches/gst-plugins-base-0.11.3/autogen.sh | 2 +- patches/ima-evm-utils-0.2/autogen.sh | 1 + patches/inotify-tools-3.13/autogen.sh | 2 +- patches/iozone3_327/autogen.sh | 2 +- .../0001-remove-duplicate-limits.h.patch | 28 - patches/iproute2-2.6.39/0002-remove_arpd.diff | 48 - patches/iproute2-2.6.39/series | 2 - .../0001-build-system-fixes.patch | 33 + patches/iproute2-3.9.0/series | 4 + .../0001-install_json_object_iterator-h.patch | 21 + patches/json-c-0.10/series | 4 + .../0001-kexec-ppc-elf-remove-bogus.patch | 28 + patches/kexec-tools-2.0.4/series | 4 + ...-Don-t-call-syscall-with-syscallno-1.patch | 40 + patches/kmod-13/series | 4 + patches/libdbus-c++-r9139/autogen.sh | 2 +- patches/libdmtx-0.7.2/autogen.sh | 2 +- .../libffi-3.0.11/0001-fix-powerpc-case.patch | 33 - patches/libffi-3.0.11/autogen.sh | 6 - patches/libffi-3.0.11/series | 5 - ...les-to-includedir-and-adjust-libffi.patch} | 4 +- patches/libffi-3.0.13/autogen.sh | 1 + patches/libffi-3.0.13/series | 4 + patches/libical-0.46/autogen.sh | 2 +- patches/libmad-0.15.1b/autogen.sh | 2 +- ...ached-for-setsockopt-in-configure.ac.patch | 80 + .../0002-Add-required-files.patch | 38 + ...PC-issues-with-undefined-__USE_POSIX.patch | 52 + .../0004-remove-broken-inline.patch | 66 + patches/libmemcache-1.4.0.rc2/autogen.sh | 2 +- patches/libmemcache-1.4.0.rc2/series | 11 +- patches/libmemcached-0.44/autogen.sh | 2 +- patches/libmng-1.0.10/autogen.sh | 2 +- patches/libnet-1.1.4/autogen.sh | 2 +- .../libpng-1.2.50/libpng_config_sysroot.diff | 35 + patches/libpng-1.2.50/series | 1 + patches/lmbench-3.0-a9/autogen.sh | 2 +- ...izoordinator-Fixes-to-error-handling.patch | 50 + ...lude-dependency-and-remove-redefined.patch | 109 + ...003-configure.ac-check-for-python2.x.patch | 32 + ...004-m4-add-py_check_major_version.m4.patch | 44 + ...ck-that-the-python-version-is-indeed.patch | 27 + ...-ID-short-address-and-channel-manual.patch | 126 + ...-Handle-return-code-from-set-command.patch | 43 + patches/lowpan-tools-0.3/autogen.sh | 11 + patches/lowpan-tools-0.3/series | 8 +- patches/lua-5.1.4/autogen.sh | 2 +- patches/mod_python-3.3.1/autogen-generic.sh | 2 +- ...Ixoff_t-and-PRIdoff_t-printf-helpers.patch | 51 + ...ency-between-u_int32_t-off_t-off64_t.patch | 434 + .../0003-make-ubifs-optional.patch | 23 + ...Make-liblzo-optional-for-ubifs-tools.patch | 68 + ...fix-writing-to-NAND-in-presence-of-p.patch | 65 + ...fix-a-buffer-overflow-on-NAND-with-w.patch | 39 + ...ild-and-install-flash_otp_lock-and-f.patch | 46 + patches/mtd-utils-1.5.0/series | 15 +- patches/mxs-utils-2011.06.0/autogen.sh | 2 +- patches/mysql-5.1.14-beta/autogen.sh | 2 +- patches/net-snmp-5.6.1/series | 1 - ...-net-snmp-config-add-SYSROOT-support.patch | 30 +- ...p-and-tcp-when-disable-agentx-dom-so.patch | 37 + .../autogen.sh | 0 patches/net-snmp-5.7.2/series | 5 + .../0001-debian-ca.patch | 0 .../0002-debian-config-hurd.patch | 0 .../0003-debian-debian-targets.patch | 0 .../0004-debian-engines-path.patch | 0 .../0005-debian-make-targets.patch | 0 .../0006-debian-man-dir.patch | 0 .../0007-debian-man-section.patch | 0 .../0008-debian-no-rpath.patch | 0 .../0009-debian-no-symbolic.patch | 0 .../0010-debian-pic.patch | 0 .../0011-debian-valgrind.patch | 0 .../0012-debian-rehash-crt.patch | 0 .../0013-debian-rehash_pod.patch | 0 .../0014-debian-shared-lib-ext.patch | 0 .../0015-debian-stddef.patch | 0 .../0016-debian-version-script.patch | 0 .../0017-debian-gnu_source.patch | 0 .../{openssl-1.0.0j => openssl-1.0.0k}/series | 0 patches/opkg-0.1.8/autogen.sh | 2 +- patches/owfs-2.8p6/autogen.sh | 2 +- patches/polkit-0.96/autogen.sh | 2 +- patches/poppler-0.18.0/autogen.sh | 2 +- .../0001-mkspec-for-ptxdist.patch | 0 .../0002-disable-ordered-compiling.patch | 0 ...0003-Hack-hide-cursor-during-startup.patch | 0 .../0004-add-missing-subdirs.patch | 0 .../0005-Fix-dnd-issue-on-QWS.patch | 0 ...e-sure-local-include-dirs-come-first.patch | 0 ...ix-colors-for-video-on-qgraphicsview.patch | 0 .../0008-don-t-build-webkit-tests.patch | 0 .../series | 0 patches/rt-tests-0.73/add-extra-cflags.patch | 32 - patches/rt-tests-0.73/fix_3_0_issue.diff | 62 - patches/rt-tests-0.73/series | 2 - ...-init-child-s-struct-before-using-it.patch | 57 + patches/rt-tests-0.85/series | 4 + patches/serdisplib-1.97.9/autogen.sh | 2 +- patches/splashutils-1.5.4.3/autogen.sh | 2 +- .../0001-use-LDFLAGS-for-linking.patch | 25 + .../0002-use-DESTDIR-when-installing.patch | 72 + ...0003-make-installing-non-interactive.patch | 34 + ...using-ssl-link-against-libcrypto-too.patch | 35 + patches/ssmtp-2.64/autogen.sh | 1 + patches/ssmtp-2.64/series | 10 +- patches/tslib-1.0/autogen.sh | 2 +- patches/udisks-1.0.0/autogen.sh | 2 +- ...3-build-with-recent-versions-of-flex.patch | 22 + patches/unfs3-0.9.22/series | 3 +- patches/usplash_0.5.49/autogen.sh | 2 +- .../0003-replace-index-with-strchr.patch | 33 - ...ntax.c-fix-for-missing-program_invoc.patch | 36 - ...lbacks-for-old-systems-without-umoun.patch | 12 +- .../0002-__progname-redefinition-fix.patch | 28 +- .../series | 4 +- patches/valgrind-3.8.1/autogen.sh | 2 +- patches/wireshark-1.2.5/autogen-generic.sh | 2 +- patches/xmlstarlet-1.0.1/autogen.sh | 2 +- patches/xorg-server-1.12.2/autogen.sh | 2 +- platforms/dtc.in | 2 +- rules/Kconfig | 3 + rules/avahi.in | 1 + rules/barebox.make | 2 +- rules/bash.in | 2 + rules/busybox.make | 11 +- rules/classpath.in | 1 + rules/classpath.make | 8 - rules/comgt.in | 7 + rules/comgt.make | 63 + rules/commoncpp2.in | 6 - rules/commoncpp2.make | 7 +- rules/crda.in | 2 +- rules/crda.make | 4 +- rules/cross-insight.make | 4 + rules/cross-nasm.in | 1 + rules/cvs.in | 1 + rules/dbus.make | 4 +- rules/devicekit-disks.in | 12 +- rules/dropbear.in | 33 +- rules/dropbear.make | 45 +- rules/dtc.make | 31 +- rules/e2fsprogs.make | 4 +- rules/evtest.in | 9 +- rules/evtest.make | 7 + rules/fake-overlayfs.in | 4 + rules/gettext.in | 10 - rules/gnuplot.make | 35 +- rules/graphics_and_multimedia.in | 3 + rules/gst-plugins-bad1.in | 743 ++ rules/gst-plugins-bad1.make | 254 + rules/gst-plugins-base1.in | 188 + rules/gst-plugins-base1.make | 136 + rules/gst-plugins-gl.in | 2 + rules/gst-plugins-gl.make | 1 + rules/gst-plugins-good1.in | 342 + rules/gst-plugins-good1.make | 178 + rules/gst-plugins-ugly1.in | 101 + rules/gst-plugins-ugly1.make | 111 + rules/gstreamer.make | 1 + rules/gstreamer1.in | 50 + rules/gstreamer1.make | 126 + rules/gtk.in | 6 +- rules/host-apr-util.in | 1 + rules/host-apr-util.make | 1 + rules/host-autotools-autoconf.in | 1 + rules/host-autotools-automake.in | 1 + rules/host-bzip2.in | 1 + rules/host-cdrkit.in | 1 + rules/host-ckermit.make | 14 +- rules/host-cmake.in | 1 + rules/host-cmake.make | 4 +- rules/host-cramfs.in | 1 + rules/host-cramfs.make | 4 +- rules/host-dosfstools.in | 1 + rules/host-e2fsprogs.in | 1 + rules/host-genext2fs.in | 1 + rules/host-genimage.in | 1 + rules/host-genimage.make | 4 +- rules/host-genpart.in | 1 + rules/host-gettext.in | 1 + rules/host-intltool.in | 2 + rules/host-intltool.make | 18 +- rules/host-libblkid.in | 1 + rules/host-libcap.in | 1 + rules/host-libconfuse.in | 1 + rules/host-libiconv.in | 1 + rules/host-libkmod.in | 1 + rules/host-libkmod.make | 1 + rules/host-liblzo.in | 1 + rules/host-libpcre.in | 2 +- rules/host-libuuid.in | 1 + rules/host-lzop.in | 1 + rules/host-mkelfImage.in | 1 + rules/host-mkelfImage.make | 7 +- rules/host-mtd-utils.in | 1 + rules/host-mtools.in | 1 + rules/host-openssl.in | 1 + rules/host-qemu.in | 19 + rules/host-qemu.make | 93 + rules/host-squashfs-tools.in | 1 + rules/host-system-jdk.in | 12 + rules/host-system-jdk.make | 38 + rules/host-system-perl.in | 12 + rules/host-system-perl.make | 34 + rules/host-system-python.in | 11 + rules/host-system-python.make | 34 + rules/host-system-ruby.in | 4 + rules/host-system-ruby.make | 28 + rules/host-systemd.in | 8 + rules/host-systemd.make | 74 + rules/host-u-boot-tools.in | 1 + rules/host-util-linux-ng.in | 1 + rules/host-util-linux-ng.make | 46 +- rules/host-wayland.in | 6 + rules/host-wayland.make | 30 + rules/host-xl-tools.in | 1 + rules/host-xz.in | 1 + rules/host-zlib.in | 1 + rules/ima-evm-utils.in | 11 + rules/ima-evm-utils.make | 50 + rules/inetutils.in | 12 + rules/inetutils.make | 5 + rules/ipkg.in | 3 +- rules/iproute2.in | 6 + rules/iproute2.make | 29 +- rules/iptables.in | 2 +- rules/json-c.make | 8 +- rules/jvisu.in | 2 + rules/jvisu.make | 13 - rules/kernel-header.in | 5 +- rules/kernel-header.make | 1 + rules/kernel.make | 2 - rules/kexec-tools.make | 4 +- rules/keyutils.in | 8 + rules/keyutils.make | 59 + rules/lame.make | 5 +- rules/libezv24.make | 6 +- rules/libffi.make | 26 +- rules/libftdi1.in | 43 + rules/libftdi1.make | 82 + rules/libgsf.in | 3 +- rules/libiodbc.in | 2 + rules/libkmod.make | 5 +- rules/libmikmod.make | 4 + rules/libnl3.make | 4 +- rules/libsoup.in | 1 + rules/libxcb.make | 1 + rules/libxkbcommon.in | 9 + rules/libxkbcommon.make | 63 + rules/lm_sensors.in | 2 +- rules/lm_sensors.make | 18 +- rules/lpc21isp.make | 4 +- rules/ltp.in | 1 + rules/lua-filesystem.in | 8 + rules/lua-filesystem.make | 60 + rules/luaexpat.in | 9 + rules/luaexpat.make | 65 + rules/mesalib.in | 2 + rules/mesalib.make | 7 - rules/mtdev.in | 7 + rules/mtdev.make | 59 + rules/ncurses.make | 1 + rules/net-snmp.in | 7 +- rules/net-snmp.make | 74 +- rules/networkmanager.in | 2 +- rules/networkmanager.make | 33 +- rules/ntp.in | 6 + rules/ntp.make | 6 + rules/openntpd.in | 1 + rules/openntpd.make | 19 +- rules/openssl.make | 4 +- rules/opkg.in | 2 + rules/opus.in | 7 + rules/opus.make | 67 + rules/orc.make | 4 +- rules/owfs.in | 9 + rules/pciutils.make | 2 - rules/php5.in | 2 +- rules/php5.make | 2 +- rules/pixman.make | 12 +- rules/policycoreutils.in | 2 + rules/portmap.make | 2 +- rules/pre/kernel.make | 10 +- rules/pyside.make | 4 +- rules/python.make | 75 +- rules/qt4-demos.in | 1 + rules/qt4.make | 10 +- rules/rootfs.in | 2 +- rules/rsync.in | 1 + rules/rsync3.in | 1 + rules/rt-tests.make | 8 +- rules/rxtx.in | 1 + rules/rxtx.make | 8 - rules/serdisplib.make | 4 + rules/sqlite.make | 4 +- rules/strongswan.in | 46 + rules/strongswan.make | 265 + rules/systemd.in | 10 +- rules/systemd.make | 44 +- rules/templates/template-barebox-make | 2 +- rules/templates/template-kernel-make | 2 +- rules/tomoyo-tools.in | 8 + rules/tomoyo-tools.make | 88 + rules/tree.in | 9 + rules/tree.make | 59 + rules/u-boot-tools.make | 2 + rules/udev.in | 11 +- rules/udev.make | 9 +- rules/udisks.in | 12 +- rules/usb-modeswitch.in | 10 + rules/usb-modeswitch.make | 58 + rules/util-linux-ng.in | 22 +- rules/util-linux-ng.make | 60 +- rules/v4l-utils.make | 4 +- rules/vo-aacenc.in | 11 + rules/vo-aacenc.make | 62 + rules/wayland.in | 11 + rules/wayland.make | 63 + rules/wpa_supplicant.in | 6 + rules/wpa_supplicant.make | 4 +- rules/xorg-app-xkbcomp.in | 1 + rules/xorg-driver-video-fbdev.make | 7 + rules/xorg-font-micro-misc.make | 2 + rules/xorg-lib-X11.in | 2 +- rules/xorg-lib-Xfont.in | 2 + rules/xorg-options.in | 3 +- rules/xorg-server.in | 3 +- rules/zlib.make | 18 +- scripts/git-ptx-patches | 7 + scripts/kconfig/conf.c | 19 +- scripts/kconfig/confdata.c | 59 +- scripts/kconfig/expr.c | 10 +- scripts/kconfig/expr.h | 6 +- scripts/kconfig/gconf.c | 2 +- scripts/kconfig/list.h | 131 + scripts/kconfig/lkc.h | 8 + scripts/kconfig/lkc_proto.h | 4 +- scripts/kconfig/lxdialog/check-lxdialog.sh | 7 +- scripts/kconfig/lxdialog/dialog.h | 8 +- scripts/kconfig/lxdialog/inputbox.c | 121 +- scripts/kconfig/lxdialog/menubox.c | 29 +- scripts/kconfig/lxdialog/util.c | 45 +- scripts/kconfig/mconf.c | 145 +- scripts/kconfig/menu.c | 64 +- scripts/kconfig/merge_config.sh | 28 +- scripts/kconfig/nconf.c | 340 +- scripts/kconfig/nconf.gui.c | 2 +- scripts/kconfig/qconf.cc | 1 + scripts/kconfig/symbol.c | 12 +- scripts/kconfig/util.c | 23 +- scripts/kconfig/zconf.l | 8 +- scripts/kconfig/zconf.lex.c_shipped | 8 +- scripts/lib/ptxd_lib_dgen.awk | 10 +- scripts/lib/ptxd_lib_kgen.sh | 3 +- scripts/lib/ptxd_make_00-init.sh | 3 + scripts/lib/ptxd_make_get.sh | 170 + scripts/lib/ptxd_make_world_patchin.sh | 5 +- scripts/lib/ptxd_make_xpkg_pkg.sh | 2 +- scripts/migrate/migrate_ptx | 8 + ...on-to-output-the-dependency-informat.patch | 17 +- ...002-conf-don-t-output-autoconf-stuff.patch | 11 +- ...ake-comments-stand-out-in-menuconfig.patch | 7 +- ...nfig-ignore-select-of-unknown-symbol.patch | 7 +- ...conf-remove-special-P_COMMENT-output.patch | 5 +- .../0006-mconf-fix-comment-on-exit.patch | 7 +- scripts/ptx-modifications/series | 1 - tests/libptxdisttest.sh | 2 + 443 files changed, 8556 insertions(+), 9335 deletions(-) delete mode 100755 configure create mode 100644 generic/etc/prelink.conf.d/gstreamer1 create mode 100644 generic/lib/systemd/system/ntpd.service create mode 100644 patches/Python-2.7.5/0001-Add-support-for-socketcan-to-the-python-socket-modul.patch create mode 100644 patches/Python-2.7.5/0002-use-AC_CHECK_SIZEOF-rather-than-AC_TRY_COMPILE-for-l.patch create mode 100644 patches/Python-2.7.5/0003-use-AC_TYPE_LONG_DOUBLE-to-detect-long-double-suppor.patch create mode 100644 patches/Python-2.7.5/0004-use-PGEN_FOR_BUILD.patch create mode 100644 patches/Python-2.7.5/0005-setup.py-don-t-leak-host-path-into-cross-compilation.patch create mode 100644 patches/Python-2.7.5/0006-add-cross-compilation-support.patch create mode 100644 patches/Python-2.7.5/0007-python-don-t-add-rpaths-in-setup.py.patch create mode 100644 patches/Python-2.7.5/0008-add-more-search-paths.patch create mode 100755 patches/Python-2.7.5/autogen.sh create mode 100644 patches/Python-2.7.5/series delete mode 100644 patches/busybox-1.20.2/0001-include-sys-resource.h-where-needed.patch delete mode 100644 patches/busybox-1.20.2/0002-build-system-use-pkg-config-to-look-up-selinux-libs.patch delete mode 100644 patches/busybox-1.20.2/0100-Fix-compilation-on-Darwin.patch delete mode 100644 patches/busybox-1.20.2/0101-get_linux_version_code-don-t-fail-on-Linux-version-s.patch rename patches/{busybox-1.20.2 => busybox-1.21.0}/0200-reactivate-check-for-tty.patch (96%) rename patches/{busybox-1.20.2 => busybox-1.21.0}/0201-Fix-the-format-warning-when-building-applets-usage_p.patch (96%) rename patches/{busybox-1.20.2 => busybox-1.21.0}/0202-build-system-only-pass-real-libs-to-SELINUX_LIBS.patch (86%) rename patches/{busybox-1.20.2 => busybox-1.21.0}/0203-scripts-trylink-honour-SKIP_STRIP-and-don-t-strip-if.patch (97%) rename patches/{busybox-1.20.2 => busybox-1.21.0}/series (58%) create mode 100644 patches/comgt.0.32/0001-Fix-cross-compilation.patch create mode 100644 patches/comgt.0.32/series rename patches/{crda-1.1.2 => crda-1.1.3}/0001-Pregenerate-keys-ssl.c.patch (100%) rename patches/{crda-1.1.2 => crda-1.1.3}/series (100%) rename patches/{dropbear-2012.55 => dropbear-2013.56}/0001-Fix-build-on-Darwin.patch (95%) rename patches/{dropbear-2012.55 => dropbear-2013.56}/series (100%) create mode 100644 patches/flup-1.0.2/0001-support-python2.7.patch create mode 100644 patches/flup-1.0.2/series create mode 100644 patches/flup-1.0.2/setuptools-0.6c11-py2.7.egg delete mode 100644 patches/gnuplot-4.4.3/0001-gnuplot-build-documentation-generator-tools-with-CC_.patch delete mode 100644 patches/gnuplot-4.4.3/series rename patches/{gnuplot-4.4.3/0002-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch => gnuplot-4.6.2/0001-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch} (86%) create mode 100644 patches/gnuplot-4.6.2/0002-Don-t-build-and-install-info-pages.patch create mode 100644 patches/gnuplot-4.6.2/series create mode 100644 patches/gst-plugins-bad-1.0.8/0001-remove-endianness-swapping.patch create mode 100644 patches/gst-plugins-bad-1.0.8/0002-add-rgb666-support.patch create mode 100644 patches/gst-plugins-bad-1.0.8/series create mode 120000 patches/ima-evm-utils-0.2/autogen.sh delete mode 100644 patches/iproute2-2.6.39/0001-remove-duplicate-limits.h.patch delete mode 100644 patches/iproute2-2.6.39/0002-remove_arpd.diff delete mode 100644 patches/iproute2-2.6.39/series create mode 100644 patches/iproute2-3.9.0/0001-build-system-fixes.patch create mode 100644 patches/iproute2-3.9.0/series create mode 100644 patches/json-c-0.10/0001-install_json_object_iterator-h.patch create mode 100644 patches/json-c-0.10/series create mode 100644 patches/kexec-tools-2.0.4/0001-kexec-ppc-elf-remove-bogus.patch create mode 100644 patches/kexec-tools-2.0.4/series create mode 100644 patches/kmod-13/0001-missing-Don-t-call-syscall-with-syscallno-1.patch create mode 100644 patches/kmod-13/series delete mode 100644 patches/libffi-3.0.11/0001-fix-powerpc-case.patch delete mode 100755 patches/libffi-3.0.11/autogen.sh delete mode 100644 patches/libffi-3.0.11/series rename patches/{libffi-3.0.11/0002-install-header-files-to-includedir-and-adjust-libffi.patch => libffi-3.0.13/0001-install-header-files-to-includedir-and-adjust-libffi.patch} (94%) create mode 120000 patches/libffi-3.0.13/autogen.sh create mode 100644 patches/libffi-3.0.13/series create mode 100644 patches/libmemcache-1.4.0.rc2/0001-use-cached-for-setsockopt-in-configure.ac.patch create mode 100644 patches/libmemcache-1.4.0.rc2/0002-Add-required-files.patch create mode 100644 patches/libmemcache-1.4.0.rc2/0003-Fix-PowerPC-issues-with-undefined-__USE_POSIX.patch create mode 100644 patches/libmemcache-1.4.0.rc2/0004-remove-broken-inline.patch create mode 100644 patches/libpng-1.2.50/libpng_config_sysroot.diff create mode 100644 patches/libpng-1.2.50/series create mode 100644 patches/lowpan-tools-0.3/0001-izoordinator-Fixes-to-error-handling.patch create mode 100644 patches/lowpan-tools-0.3/0002-addrdb-fix-include-dependency-and-remove-redefined.patch create mode 100644 patches/lowpan-tools-0.3/0003-configure.ac-check-for-python2.x.patch create mode 100644 patches/lowpan-tools-0.3/0004-m4-add-py_check_major_version.m4.patch create mode 100644 patches/lowpan-tools-0.3/0005-configure.ac-Check-that-the-python-version-is-indeed.patch create mode 100644 patches/lowpan-tools-0.3/0006-Allow-to-set-PAN-ID-short-address-and-channel-manual.patch create mode 100644 patches/lowpan-tools-0.3/0007-iz-mac-Handle-return-code-from-set-command.patch create mode 100755 patches/lowpan-tools-0.3/autogen.sh create mode 100644 patches/mtd-utils-1.5.0/0001-introduce-PRIxoff_t-and-PRIdoff_t-printf-helpers.patch create mode 100644 patches/mtd-utils-1.5.0/0002-consistency-between-u_int32_t-off_t-off64_t.patch create mode 100644 patches/mtd-utils-1.5.0/0003-make-ubifs-optional.patch create mode 100644 patches/mtd-utils-1.5.0/0004-Make-liblzo-optional-for-ubifs-tools.patch create mode 100644 patches/mtd-utils-1.5.0/0005-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch create mode 100644 patches/mtd-utils-1.5.0/0006-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch create mode 100644 patches/mtd-utils-1.5.0/0007-Makefile-also-build-and-install-flash_otp_lock-and-f.patch delete mode 100644 patches/net-snmp-5.6.1/series rename patches/{net-snmp-5.6.1 => net-snmp-5.7.2}/0001-net-snmp-config-add-SYSROOT-support.patch (72%) create mode 100644 patches/net-snmp-5.7.2/0002-Don-t-disable-udp-and-tcp-when-disable-agentx-dom-so.patch rename patches/{gnuplot-4.4.3 => net-snmp-5.7.2}/autogen.sh (100%) create mode 100644 patches/net-snmp-5.7.2/series rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0001-debian-ca.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0002-debian-config-hurd.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0003-debian-debian-targets.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0004-debian-engines-path.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0005-debian-make-targets.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0006-debian-man-dir.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0007-debian-man-section.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0008-debian-no-rpath.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0009-debian-no-symbolic.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0010-debian-pic.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0011-debian-valgrind.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0012-debian-rehash-crt.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0013-debian-rehash_pod.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0014-debian-shared-lib-ext.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0015-debian-stddef.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0016-debian-version-script.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/0017-debian-gnu_source.patch (100%) rename patches/{openssl-1.0.0j => openssl-1.0.0k}/series (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/0001-mkspec-for-ptxdist.patch (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/0002-disable-ordered-compiling.patch (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/0003-Hack-hide-cursor-during-startup.patch (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/0004-add-missing-subdirs.patch (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/0005-Fix-dnd-issue-on-QWS.patch (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/0006-qmake-make-sure-local-include-dirs-come-first.patch (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/0007-phonon-fix-colors-for-video-on-qgraphicsview.patch (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/0008-don-t-build-webkit-tests.patch (100%) rename patches/{qt-everywhere-opensource-src-4.8.4 => qt-everywhere-opensource-src-4.8.5}/series (100%) delete mode 100644 patches/rt-tests-0.73/add-extra-cflags.patch delete mode 100644 patches/rt-tests-0.73/fix_3_0_issue.diff delete mode 100644 patches/rt-tests-0.73/series create mode 100644 patches/rt-tests-0.85/0001-hackbench-init-child-s-struct-before-using-it.patch create mode 100644 patches/rt-tests-0.85/series create mode 100644 patches/ssmtp-2.64/0001-use-LDFLAGS-for-linking.patch create mode 100644 patches/ssmtp-2.64/0002-use-DESTDIR-when-installing.patch create mode 100644 patches/ssmtp-2.64/0003-make-installing-non-interactive.patch create mode 100644 patches/ssmtp-2.64/0004-configure-if-using-ssl-link-against-libcrypto-too.patch create mode 120000 patches/ssmtp-2.64/autogen.sh create mode 100644 patches/unfs3-0.9.22/0002-fix-unfs3-build-with-recent-versions-of-flex.patch delete mode 100644 patches/util-linux-2.21.2/0003-replace-index-with-strchr.patch delete mode 100644 patches/util-linux-2.21.2/0004-text-utils-hexsyntax.c-fix-for-missing-program_invoc.patch rename patches/{util-linux-2.21.2 => util-linux-2.23.1}/0001-libmount-add-fallbacks-for-old-systems-without-umoun.patch (88%) rename patches/{util-linux-2.21.2 => util-linux-2.23.1}/0002-__progname-redefinition-fix.patch (81%) rename patches/{util-linux-2.21.2 => util-linux-2.23.1}/series (50%) create mode 100644 rules/comgt.in create mode 100644 rules/comgt.make create mode 100644 rules/gst-plugins-bad1.in create mode 100644 rules/gst-plugins-bad1.make create mode 100644 rules/gst-plugins-base1.in create mode 100644 rules/gst-plugins-base1.make create mode 100644 rules/gst-plugins-good1.in create mode 100644 rules/gst-plugins-good1.make create mode 100644 rules/gst-plugins-ugly1.in create mode 100644 rules/gst-plugins-ugly1.make create mode 100644 rules/gstreamer1.in create mode 100644 rules/gstreamer1.make create mode 100644 rules/host-qemu.in create mode 100644 rules/host-qemu.make create mode 100644 rules/host-system-jdk.in create mode 100644 rules/host-system-jdk.make create mode 100644 rules/host-system-perl.in create mode 100644 rules/host-system-perl.make create mode 100644 rules/host-system-python.in create mode 100644 rules/host-system-python.make create mode 100644 rules/host-system-ruby.in create mode 100644 rules/host-system-ruby.make create mode 100644 rules/host-systemd.in create mode 100644 rules/host-systemd.make create mode 100644 rules/host-wayland.in create mode 100644 rules/host-wayland.make create mode 100644 rules/ima-evm-utils.in create mode 100644 rules/ima-evm-utils.make create mode 100644 rules/keyutils.in create mode 100644 rules/keyutils.make create mode 100644 rules/libftdi1.in create mode 100644 rules/libftdi1.make create mode 100644 rules/libxkbcommon.in create mode 100644 rules/libxkbcommon.make create mode 100644 rules/lua-filesystem.in create mode 100644 rules/lua-filesystem.make create mode 100644 rules/luaexpat.in create mode 100644 rules/luaexpat.make create mode 100644 rules/mtdev.in create mode 100644 rules/mtdev.make create mode 100644 rules/opus.in create mode 100644 rules/opus.make create mode 100644 rules/strongswan.in create mode 100644 rules/strongswan.make create mode 100644 rules/tomoyo-tools.in create mode 100644 rules/tomoyo-tools.make create mode 100644 rules/tree.in create mode 100644 rules/tree.make create mode 100644 rules/usb-modeswitch.in create mode 100644 rules/usb-modeswitch.make create mode 100644 rules/vo-aacenc.in create mode 100644 rules/vo-aacenc.make create mode 100644 rules/wayland.in create mode 100644 rules/wayland.make create mode 100644 scripts/kconfig/list.h diff --git a/.gitignore b/.gitignore index c0f9476..4c878bb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ /.done /.tarball-version +.directory *.orig *.swp *~ diff --git a/.tarball-version b/.tarball-version index ebc5094..52b3b75 100644 --- a/.tarball-version +++ b/.tarball-version @@ -1 +1 @@ -2013.03.0 \ No newline at end of file +2013.09.0 \ No newline at end of file diff --git a/config/busybox/Config.in b/config/busybox/Config.in index c5ad600..8cf459d 100644 --- a/config/busybox/Config.in +++ b/config/busybox/Config.in @@ -310,7 +310,18 @@ config BUSYBOX_FEATURE_PIDFILE default y help This option makes some applets (e.g. crond, syslogd, inetd) write - a pidfile in /var/run. Some applications rely on them. + a pidfile at the configured PID_FILE_PATH. It has no effect + on applets which require pidfiles to run. + +config BUSYBOX_PID_FILE_PATH + string "Path to directory for pidfile" + default "/var/run" + depends on BUSYBOX_FEATURE_PIDFILE + help + This is the default path where pidfiles are created. Applets which + allow you to set the pidfile path on the command line will override + this value. The option has no effect on applets that require you to + specify a pidfile path. config BUSYBOX_FEATURE_SUID bool "Support for SUID/SGID handling" @@ -321,7 +332,7 @@ config BUSYBOX_FEATURE_SUID root-level operations even when run by ordinary users (for example, mounting of user mounts in fstab needs this). - Busybox will automatically drop priviledges for applets + Busybox will automatically drop privileges for applets that don't need root access. If you are really paranoid and don't want to do this, build two diff --git a/config/busybox/coreutils/Config.in b/config/busybox/coreutils/Config.in index 3c33a53..36e51e0 100644 --- a/config/busybox/coreutils/Config.in +++ b/config/busybox/coreutils/Config.in @@ -655,7 +655,7 @@ config BUSYBOX_SHA3SUM bool "sha3sum" default y help - Compute and check SHA3 message digest + Compute and check SHA3 (512-bit) message digest config BUSYBOX_SLEEP bool "sleep" @@ -909,13 +909,13 @@ config BUSYBOX_FEATURE_HUMAN_READABLE help Allow df, du, and ls to have human readable output. -comment "Common options for md5sum, sha1sum, sha256sum, sha512sum" - depends on BUSYBOX_MD5SUM || BUSYBOX_SHA1SUM || BUSYBOX_SHA256SUM || BUSYBOX_SHA512SUM +comment "Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum" + depends on BUSYBOX_MD5SUM || BUSYBOX_SHA1SUM || BUSYBOX_SHA256SUM || BUSYBOX_SHA512SUM || BUSYBOX_SHA3SUM config BUSYBOX_FEATURE_MD5_SHA1_SUM_CHECK bool "Enable -c, -s and -w options" default y - depends on BUSYBOX_MD5SUM || BUSYBOX_SHA1SUM || BUSYBOX_SHA256SUM || BUSYBOX_SHA512SUM + depends on BUSYBOX_MD5SUM || BUSYBOX_SHA1SUM || BUSYBOX_SHA256SUM || BUSYBOX_SHA512SUM || BUSYBOX_SHA3SUM help Enabling the -c options allows files to be checked against pre-calculated hash values. diff --git a/config/busybox/editors/Config.in b/config/busybox/editors/Config.in index 39a1e0c..a3840d4 100644 --- a/config/busybox/editors/Config.in +++ b/config/busybox/editors/Config.in @@ -127,14 +127,6 @@ config BUSYBOX_FEATURE_VI_ASK_TERMINAL This is not clean but helps a lot on serial lines and such. -config BUSYBOX_FEATURE_VI_OPTIMIZE_CURSOR - bool "Optimize cursor movement" - default y - depends on BUSYBOX_VI - help - This will make the cursor movement faster, but requires more memory - and it makes the applet a tiny bit larger. - config BUSYBOX_AWK bool "awk" default y diff --git a/config/busybox/networking/Config.in b/config/busybox/networking/Config.in index f623567..7e6cc25 100644 --- a/config/busybox/networking/Config.in +++ b/config/busybox/networking/Config.in @@ -175,12 +175,12 @@ config BUSYBOX_FEATURE_BRCTL_FANCY This adds about 600 bytes. config BUSYBOX_FEATURE_BRCTL_SHOW - bool "Support show, showmac and showstp" + bool "Support show" default y depends on BUSYBOX_BRCTL && BUSYBOX_FEATURE_BRCTL_FANCY help Add support for option which prints the current config: - showmacs, showstp, show + show config BUSYBOX_DNSD bool "dnsd" @@ -1038,8 +1038,8 @@ config BUSYBOX_WGET bool "wget" default y help - wget is a utility for non-interactive download of files from HTTP, - HTTPS, and FTP servers. + wget is a utility for non-interactive download of files from HTTP + and FTP servers. config BUSYBOX_FEATURE_WGET_STATUSBAR bool "Enable a nifty process meter (+2k)" diff --git a/config/busybox/networking/udhcp/Config.in b/config/busybox/networking/udhcp/Config.in index 6ece730..58a7d48 100644 --- a/config/busybox/networking/udhcp/Config.in +++ b/config/busybox/networking/udhcp/Config.in @@ -5,10 +5,11 @@ # config BUSYBOX_UDHCPC6 - bool "udhcp client for DHCPv6 (udhcpc6)" - default n # not yet ready - help - udhcpc6 is a DHCPv6 client + bool "udhcp client for DHCPv6 (udhcpc6)" + default n # not yet ready + depends on BUSYBOX_FEATURE_IPV6 + help + udhcpc6 is a DHCPv6 client config BUSYBOX_UDHCPD bool "udhcp server (udhcpd)" diff --git a/config/busybox/procps/Config.in b/config/busybox/procps/Config.in index 2e11bd0..56b9150 100644 --- a/config/busybox/procps/Config.in +++ b/config/busybox/procps/Config.in @@ -53,6 +53,59 @@ config BUSYBOX_SMEMCAP help smemcap is a tool for capturing process data for smem, a memory usage statistic tool. +config BUSYBOX_TOP + bool "top" + default y + help + The top program provides a dynamic real-time view of a running + system. + +config BUSYBOX_FEATURE_TOP_CPU_USAGE_PERCENTAGE + bool "Show CPU per-process usage percentage" + default y + depends on BUSYBOX_TOP + help + Make top display CPU usage for each process. + This adds about 2k. + +config BUSYBOX_FEATURE_TOP_CPU_GLOBAL_PERCENTS + bool "Show CPU global usage percentage" + default y + depends on BUSYBOX_FEATURE_TOP_CPU_USAGE_PERCENTAGE + help + Makes top display "CPU: NN% usr NN% sys..." line. + This adds about 0.5k. + +config BUSYBOX_FEATURE_TOP_SMP_CPU + bool "SMP CPU usage display ('c' key)" + default y + depends on BUSYBOX_FEATURE_TOP_CPU_GLOBAL_PERCENTS + help + Allow 'c' key to switch between individual/cumulative CPU stats + This adds about 0.5k. + +config BUSYBOX_FEATURE_TOP_DECIMALS + bool "Show 1/10th of a percent in CPU/mem statistics" + default y + depends on BUSYBOX_FEATURE_TOP_CPU_USAGE_PERCENTAGE + help + Show 1/10th of a percent in CPU/mem statistics. + This adds about 0.3k. + +config BUSYBOX_FEATURE_TOP_SMP_PROCESS + bool "Show CPU process runs on ('j' field)" + default y + depends on BUSYBOX_TOP + help + Show CPU where process was last found running on. + This is the 'j' field. + +config BUSYBOX_FEATURE_TOPMEM + bool "Topmem command ('s' key)" + default y + depends on BUSYBOX_TOP + help + Enable 's' in top (gives lots of memory info). config BUSYBOX_UPTIME bool "uptime" default y @@ -202,60 +255,6 @@ config BUSYBOX_BB_SYSCTL help Configure kernel parameters at runtime. -config BUSYBOX_TOP - bool "top" - default y - help - The top program provides a dynamic real-time view of a running - system. - -config BUSYBOX_FEATURE_TOP_CPU_USAGE_PERCENTAGE - bool "Show CPU per-process usage percentage" - default y - depends on BUSYBOX_TOP - help - Make top display CPU usage for each process. - This adds about 2k. - -config BUSYBOX_FEATURE_TOP_CPU_GLOBAL_PERCENTS - bool "Show CPU global usage percentage" - default y - depends on BUSYBOX_FEATURE_TOP_CPU_USAGE_PERCENTAGE - help - Makes top display "CPU: NN% usr NN% sys..." line. - This adds about 0.5k. - -config BUSYBOX_FEATURE_TOP_SMP_CPU - bool "SMP CPU usage display ('c' key)" - default y - depends on BUSYBOX_FEATURE_TOP_CPU_GLOBAL_PERCENTS - help - Allow 'c' key to switch between individual/cumulative CPU stats - This adds about 0.5k. - -config BUSYBOX_FEATURE_TOP_DECIMALS - bool "Show 1/10th of a percent in CPU/mem statistics" - default y - depends on BUSYBOX_FEATURE_TOP_CPU_USAGE_PERCENTAGE - help - Show 1/10th of a percent in CPU/mem statistics. - This adds about 0.3k. - -config BUSYBOX_FEATURE_TOP_SMP_PROCESS - bool "Show CPU process runs on ('j' field)" - default y - depends on BUSYBOX_TOP - help - Show CPU where process was last found running on. - This is the 'j' field. - -config BUSYBOX_FEATURE_TOPMEM - bool "Topmem command ('s' key)" - default y - depends on BUSYBOX_TOP - help - Enable 's' in top (gives lots of memory info). - config BUSYBOX_FEATURE_SHOW_THREADS bool "Support for showing threads in ps/pstree/top" default y diff --git a/config/busybox/sysklogd/Config.in b/config/busybox/sysklogd/Config.in index b415a35..e6e9cbb 100644 --- a/config/busybox/sysklogd/Config.in +++ b/config/busybox/sysklogd/Config.in @@ -136,6 +136,9 @@ config BUSYBOX_KLOGD you wish to record the messages produced by the kernel, you should enable this option. +comment "klogd should not be used together with syslog to kernel printk buffer" + depends on BUSYBOX_KLOGD && BUSYBOX_FEATURE_KMSG_SYSLOG + config BUSYBOX_FEATURE_KLOGD_KLOGCTL bool "Use the klogctl() interface" default y diff --git a/config/busybox/util-linux/Config.in b/config/busybox/util-linux/Config.in index b5a3b27..87d7d3c 100644 --- a/config/busybox/util-linux/Config.in +++ b/config/busybox/util-linux/Config.in @@ -802,11 +802,13 @@ config BUSYBOX_FEATURE_VOLUMEID_FAT TODO config BUSYBOX_FEATURE_VOLUMEID_EXFAT - bool "exfat filesystem" + bool "exFAT filesystem" default y depends on BUSYBOX_VOLUMEID help - TODO + exFAT (extended FAT) is a proprietary file system designed especially + for flash drives. It has many features from NTFS, but with less + overhead. exFAT is used on most SDXC cards for consumer electronics. config BUSYBOX_FEATURE_VOLUMEID_HFS bool "hfs filesystem" @@ -906,6 +908,16 @@ config BUSYBOX_FEATURE_VOLUMEID_ROMFS help TODO +config BUSYBOX_FEATURE_VOLUMEID_SQUASHFS + bool "SquashFS filesystem" + default y + depends on BUSYBOX_VOLUMEID && BUSYBOX_FEATURE_BLKID_TYPE + help + Squashfs is a compressed read-only filesystem for Linux. Squashfs is + intended for general read-only filesystem use and in constrained block + device/memory systems (e.g. embedded systems) where low overhead is + needed. + config BUSYBOX_FEATURE_VOLUMEID_SYSV bool "sysv filesystem" default y diff --git a/config/setup/Kconfig b/config/setup/Kconfig index 266e942..8d98697 100644 --- a/config/setup/Kconfig +++ b/config/setup/Kconfig @@ -56,6 +56,27 @@ config SETUP_HTTP_PROXY http://your.proxy.org:80 +config SETUP_HTTPS_PROXY + prompt "HTTPS Proxy" + string + default "" + help + If you have to use a proxy for HTTPS transfers, please add the + proxy URL here. Example: + + http://your.proxy.org:80 + +config SETUP_NO_PROXY + prompt "Proxy Exceptions" + string + default "" + help + If you generally require a proxy, but need to add exceptions for + certain hosts, please add those as a comma-separated list here. + Example: + + .localdomain,127.0.0.1 + endmenu menu "Project Searchpath" @@ -151,7 +172,7 @@ config SETUP_XORGMIRROR config SETUP_KERNELMIRROR string - default "http://www.kernel.org/pub/linux" + default "https://www.kernel.org/pub/linux" prompt "kernel.org Mirror" help For all kernel.org related packages enter an available mirror here. @@ -204,12 +225,15 @@ menu "Java SDK " config SETUP_JAVA_SDK string - default "/usr" + default "/usr/lib/jvm/default-java" prompt "Java SDK" help Specify the path to your Java SDK; this is needed if Java programs are being compiled by PTXdist, for example if you have selected JVisu. + This must not be '/usr' but the actual SDK path, + e.g. '/usr/lib/jvm/default-java'. + Make sure the selected directory contains bin/javac. endmenu diff --git a/config/setup/ptxdistrc.default b/config/setup/ptxdistrc.default index 53fbaf6..882552d 100644 --- a/config/setup/ptxdistrc.default +++ b/config/setup/ptxdistrc.default @@ -18,6 +18,8 @@ PTXCONF_SETUP_USER_EMAIL="" # PTXCONF_SETUP_FTP_PROXY="" PTXCONF_SETUP_HTTP_PROXY="" +PTXCONF_SETUP_HTTPS_PROXY="" +PTXCONF_SETUP_NO_PROXY="" # # Project Searchpath @@ -39,7 +41,7 @@ PTXCONF_SETUP_DEBMIRROR="http://ftp.uni-kl.de/debian" PTXCONF_SETUP_SFMIRROR="http://downloads.sourceforge.net/sourceforge" PTXCONF_SETUP_GNUMIRROR="http://ftp.uni-kl.de/pub/gnu" PTXCONF_SETUP_XORGMIRROR="http://ftp.sunet.se/pub/X11/ftp.x.org" -PTXCONF_SETUP_KERNELMIRROR="http://www.kernel.org/pub/linux" +PTXCONF_SETUP_KERNELMIRROR="https://www.kernel.org/pub/linux http://www.linux-mips.org/pub/linux/mips" PTXCONF_SETUP_CHECK_ALWAYS=y # PTXCONF_SETUP_CHECK_NOTEMPTY is not set # PTXCONF_SETUP_CHECK_NEVER is not set @@ -53,7 +55,7 @@ PTXCONF_SETUP_IPKG_REPOSITORY="/var/www/ipkg-repository" # # Java SDK # -PTXCONF_SETUP_JAVA_SDK="/usr" +PTXCONF_SETUP_JAVA_SDK="/usr/lib/jvm/default-java" # # Developer Options diff --git a/configure b/configure deleted file mode 100755 index add4632..0000000 --- a/configure +++ /dev/null @@ -1,7733 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for ptxdist 2013.03.0. -# -# Report bugs to . -# -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: ptxdist@pengutronix.de about your system, including any -$0: error possibly output before this message. Then install -$0: a modern shell, or manually run the script under such a -$0: shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='ptxdist' -PACKAGE_TARNAME='ptxdist' -PACKAGE_VERSION='2013.03.0' -PACKAGE_STRING='ptxdist 2013.03.0' -PACKAGE_BUGREPORT='ptxdist@pengutronix.de' -PACKAGE_URL='' - -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='LTLIBOBJS -LIBOBJS -BASH_COMPLETION_DIR -PATCH -PYTHON -GCC -MSGFMT -PTXDIST_FILE -FILE -MAKE -WGET -MKTEMP -UNZIP -GUNZIP -BUNZIP2 -MAKEINFO -YFLAGS -YACC -LEXLIB -LEX_OUTPUT_ROOT -LEX -SYSCTL -AWK -ac_ct_CXX -CXXFLAGS -CXX -GNU_xargs -GNU_find -GNU_tar -GNU_readlink -GNU_tty -GNU_cat -GNU_sort -GNU_dirname -GNU_mknod -GNU_stat -GNU_install -GNU_mkdir -GNU_md5sum -GNU_rmdir -GNU_rm -GNU_cp -GNU_mv -GNU_chown -GNU_chmod -SED -BASH -BUILD_NCONF_FALSE -BUILD_NCONF_TRUE -CURSES_LOC -MCONF_LIBS -CONF_LIBS -EGREP -GREP -CPP -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -with_ncurses -with_bash -with_python -with_patch -with_bash_completion -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP -CXX -CXXFLAGS -CCC -YACC -YFLAGS' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures ptxdist 2013.03.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/ptxdist] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of ptxdist 2013.03.0:";; - esac - cat <<\_ACEOF - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-ncurses Include path to the ncurses headers - --with-bash name of the bash executable to use - --with-python name of the python executable to use - --with-patch name of the patch executable to use - --with-bash-completion[=DIR] - install bash_completion file (default: yes) - - optionally specify bash_completion directory - (default: /etc/bash_completion.d) - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CPP C preprocessor - CXX C++ compiler command - CXXFLAGS C++ compiler flags - YACC The `Yet Another Compiler Compiler' implementation to use. - Defaults to the first program found out of: `bison -y', `byacc', - `yacc'. - YFLAGS The list of arguments that will be passed by default to $YACC. - This script will default YFLAGS to the empty string to avoid a - default value of `-d' given by some make applications. - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -ptxdist configure 2013.03.0 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ------------------------------------- ## -## Report this to ptxdist@pengutronix.de ## -## ------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by ptxdist $as_me 2013.03.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_aux_dir= -for ac_dir in scripts/autoconf "$srcdir"/scripts/autoconf; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in scripts/autoconf \"$srcdir\"/scripts/autoconf" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ptxdist patches" >&5 -$as_echo_n "checking for ptxdist patches... " >&6; } -if test -d `dirname $0`/patches -then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "install the ptxdist-patches archive into the same directory as ptxdist." "$LINENO" 5 -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -ac_fn_c_check_header_mongrel "$LINENO" "regex.h" "ac_cv_header_regex_h" "$ac_includes_default" -if test "x$ac_cv_header_regex_h" = xyes; then : - -else - as_fn_error $? "Cannot find regex.h." "$LINENO" 5 -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing regcomp" >&5 -$as_echo_n "checking for library containing regcomp... " >&6; } -if ${ac_cv_search_regcomp+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char regcomp (); -int -main () -{ -return regcomp (); - ; - return 0; -} -_ACEOF -for ac_lib in '' regex gnuregex; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_regcomp=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_regcomp+:} false; then : - break -fi -done -if ${ac_cv_search_regcomp+:} false; then : - -else - ac_cv_search_regcomp=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_regcomp" >&5 -$as_echo "$ac_cv_search_regcomp" >&6; } -ac_res=$ac_cv_search_regcomp -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -else - as_fn_error $? "POSIX regex required." "$LINENO" 5 -fi - -CONF_LIBS=${LIBS} - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing mvaddch" >&5 -$as_echo_n "checking for library containing mvaddch... " >&6; } -if ${ac_cv_search_mvaddch+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char mvaddch (); -int -main () -{ -return mvaddch (); - ; - return 0; -} -_ACEOF -for ac_lib in '' curses ncurses pdcurses; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_mvaddch=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_mvaddch+:} false; then : - break -fi -done -if ${ac_cv_search_mvaddch+:} false; then : - -else - ac_cv_search_mvaddch=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_mvaddch" >&5 -$as_echo "$ac_cv_search_mvaddch" >&6; } -ac_res=$ac_cv_search_mvaddch -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - CURSES_LIB=$ac_lib -else - as_fn_error $? "curses development library not found, please install libncurses-dev" "$LINENO" 5 -fi - -MCONF_LIBS=${LIBS} - - -for ac_header in curses.h ncurses.h ncurses/curses.h ncurses/ncurses.h pdcurses.h pdcurses/curses.h pdcurses/pdcurses.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - CURSES_LOC="<$ac_header>";found_curses_headers=yes; break; -fi - -done - -if test "x$CURSES_LOC" = "x"; then : - as_fn_error $? "curses headers not found" "$LINENO" 5 -fi - - - -# Check whether --with-ncurses was given. -if test "${with_ncurses+set}" = set; then : - withval=$with_ncurses; - if test "x$withval" != "xyes"; then - CPPFLAGS="-I$withval" - - fi - with_ncurses=yes - -else - - with_ncurses=auto - -fi - - -ac_fn_c_check_header_mongrel "$LINENO" "menu.h" "ac_cv_header_menu_h" "$ac_includes_default" -if test "x$ac_cv_header_menu_h" = xyes; then : - NCURSES_FOUND=yes -else - - if test "$with_ncurses" = "yes"; then - as_fn_error $? "Cannot find menu.h (ncurses)." "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find menu.h (ncurses). Not building nconf." >&5 -$as_echo "$as_me: WARNING: Cannot find menu.h (ncurses). Not building nconf." >&2;} - fi - -fi - - - if test "x$NCURSES_FOUND" = "xyes"; then - BUILD_NCONF_TRUE= - BUILD_NCONF_FALSE='#' -else - BUILD_NCONF_TRUE='#' - BUILD_NCONF_FALSE= -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether #! works in shell scripts" >&5 -$as_echo_n "checking whether #! works in shell scripts... " >&6; } -if ${ac_cv_sys_interpreter+:} false; then : - $as_echo_n "(cached) " >&6 -else - echo '#! /bin/cat -exit 69 -' >conftest -chmod u+x conftest -(SHELL=/bin/sh; export SHELL; ./conftest >/dev/null 2>&1) -if test $? -ne 69; then - ac_cv_sys_interpreter=yes -else - ac_cv_sys_interpreter=no -fi -rm -f conftest -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 -$as_echo "$ac_cv_sys_interpreter" >&6; } -interpval=$ac_cv_sys_interpreter - -if test "$interpval" != yes ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no - -bash scripts may not be invoked correctly due to problems with your -systems implementation of #! being either broken or non-existant. -" >&5 -$as_echo "$as_me: WARNING: no - -bash scripts may not be invoked correctly due to problems with your -systems implementation of #! being either broken or non-existant. -" >&2;} -fi - -unset BASH # bash sets this itself! - -# Check whether --with-bash was given. -if test "${with_bash+set}" = set; then : - withval=$with_bash; - BASH="$withval" - - { $as_echo "$as_me:${as_lineno-$LINENO}: Using bash executable $BASH" >&5 -$as_echo "$as_me: Using bash executable $BASH" >&6;} - -else - - # Extract the first word of "bash", so it can be a program name with args. -set dummy bash; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_BASH+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $BASH in - [\\/]* | ?:[\\/]*) - ac_cv_path_BASH="$BASH" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_BASH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -BASH=$ac_cv_path_BASH -if test -n "$BASH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASH" >&5 -$as_echo "$BASH" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -fi - -if test -z "$BASH" ; then - as_fn_error $? "Please specify the location of bash with the option '--with-bash'" "$LINENO" 5 -fi - -# It would be nice not to have to use backticks, but too many retarded sh -# implementations still don't support $( ) -# BEWARE: There is a distinct possibility that we are currently running under -# bash in this configure script (/bin/sh being a symlink to /bin/bash). Even -# though the result /could/ be available to us directly as $BASH_VERSION we -# don't want to use, or trust it, incase the user is specifying a different -# bash executable. -if `$BASH -c '[ "$BASH_VERSION" \< "2.04" ]'` ; then - as_fn_error $? " -$PACKAGE_NAME requires at least version 2.04 of bash, you can download a current -version of bash from ftp.gnu.org -" "$LINENO" 5 -fi - - -for ac_prog in gsed sed -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SED in - [\\/]* | ?:[\\/]*) - ac_cv_path_SED="$SED" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SED=$ac_cv_path_SED -if test -n "$SED"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 -$as_echo "$SED" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$SED" && break -done - -if test -z "$SED"; then - as_fn_error $? "sed could not be found, please install" "$LINENO" 5 -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sed version" >&5 -$as_echo_n "checking sed version... " >&6; } -SED_VERSION=`$SED --version 2>/dev/null | $SED -ne "1 s/.*GNU.*\s\([0-9\+\.]\+\).*/\1/p"` -case "$SED_VERSION" in -3.*) as_fn_error $? "we need at least GNU sed 4.x but found $SED_VERSION" "$LINENO" 5 ;; -4.*) ;; -*) as_fn_error $? "we need at least GNU sed 4.x" "$LINENO" 5 ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED_VERSION" >&5 -$as_echo "$SED_VERSION" >&6; } - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU chmod" >&5 -$as_echo_n "checking for GNU chmod... " >&6; } -if ${ac_cv_path_gnu_chmod+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_chmod"; then - ac_path_gnu_chmod_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gchmod chmod.gnu chmod; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_chmod="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_chmod" || continue -out=`$ac_path_gnu_chmod --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_chmod=$ac_path_gnu_chmod ac_path_gnu_chmod_found=: - $ac_path_gnu_chmod_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_chmod"; then - as_fn_error $? "could not find GNU chmod" "$LINENO" 5 - fi -else - ac_cv_path_gnu_chmod=$gnu_chmod -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_chmod" >&5 -$as_echo "$ac_cv_path_gnu_chmod" >&6; } - GNU_chmod=$ac_cv_path_gnu_chmod - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU chown" >&5 -$as_echo_n "checking for GNU chown... " >&6; } -if ${ac_cv_path_gnu_chown+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_chown"; then - ac_path_gnu_chown_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gchown chown.gnu chown; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_chown="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_chown" || continue -out=`$ac_path_gnu_chown --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_chown=$ac_path_gnu_chown ac_path_gnu_chown_found=: - $ac_path_gnu_chown_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_chown"; then - as_fn_error $? "could not find GNU chown" "$LINENO" 5 - fi -else - ac_cv_path_gnu_chown=$gnu_chown -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_chown" >&5 -$as_echo "$ac_cv_path_gnu_chown" >&6; } - GNU_chown=$ac_cv_path_gnu_chown - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU mv" >&5 -$as_echo_n "checking for GNU mv... " >&6; } -if ${ac_cv_path_gnu_mv+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_mv"; then - ac_path_gnu_mv_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gmv mv.gnu mv; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_mv="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_mv" || continue -out=`$ac_path_gnu_mv --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_mv=$ac_path_gnu_mv ac_path_gnu_mv_found=: - $ac_path_gnu_mv_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_mv"; then - as_fn_error $? "could not find GNU mv" "$LINENO" 5 - fi -else - ac_cv_path_gnu_mv=$gnu_mv -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_mv" >&5 -$as_echo "$ac_cv_path_gnu_mv" >&6; } - GNU_mv=$ac_cv_path_gnu_mv - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU cp" >&5 -$as_echo_n "checking for GNU cp... " >&6; } -if ${ac_cv_path_gnu_cp+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_cp"; then - ac_path_gnu_cp_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gcp cp.gnu cp; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_cp="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_cp" || continue -out=`$ac_path_gnu_cp --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_cp=$ac_path_gnu_cp ac_path_gnu_cp_found=: - $ac_path_gnu_cp_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_cp"; then - as_fn_error $? "could not find GNU cp" "$LINENO" 5 - fi -else - ac_cv_path_gnu_cp=$gnu_cp -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_cp" >&5 -$as_echo "$ac_cv_path_gnu_cp" >&6; } - GNU_cp=$ac_cv_path_gnu_cp - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU rm" >&5 -$as_echo_n "checking for GNU rm... " >&6; } -if ${ac_cv_path_gnu_rm+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_rm"; then - ac_path_gnu_rm_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grm rm.gnu rm; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_rm="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_rm" || continue -out=`$ac_path_gnu_rm --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_rm=$ac_path_gnu_rm ac_path_gnu_rm_found=: - $ac_path_gnu_rm_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_rm"; then - as_fn_error $? "could not find GNU rm" "$LINENO" 5 - fi -else - ac_cv_path_gnu_rm=$gnu_rm -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_rm" >&5 -$as_echo "$ac_cv_path_gnu_rm" >&6; } - GNU_rm=$ac_cv_path_gnu_rm - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU rmdir" >&5 -$as_echo_n "checking for GNU rmdir... " >&6; } -if ${ac_cv_path_gnu_rmdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_rmdir"; then - ac_path_gnu_rmdir_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grmdir rmdir.gnu rmdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_rmdir="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_rmdir" || continue -out=`$ac_path_gnu_rmdir --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_rmdir=$ac_path_gnu_rmdir ac_path_gnu_rmdir_found=: - $ac_path_gnu_rmdir_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_rmdir"; then - as_fn_error $? "could not find GNU rmdir" "$LINENO" 5 - fi -else - ac_cv_path_gnu_rmdir=$gnu_rmdir -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_rmdir" >&5 -$as_echo "$ac_cv_path_gnu_rmdir" >&6; } - GNU_rmdir=$ac_cv_path_gnu_rmdir - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU md5sum" >&5 -$as_echo_n "checking for GNU md5sum... " >&6; } -if ${ac_cv_path_gnu_md5sum+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_md5sum"; then - ac_path_gnu_md5sum_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gmd5sum md5sum.gnu md5sum; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_md5sum="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_md5sum" || continue -out=`$ac_path_gnu_md5sum --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_md5sum=$ac_path_gnu_md5sum ac_path_gnu_md5sum_found=: - $ac_path_gnu_md5sum_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_md5sum"; then - as_fn_error $? "could not find GNU md5sum" "$LINENO" 5 - fi -else - ac_cv_path_gnu_md5sum=$gnu_md5sum -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_md5sum" >&5 -$as_echo "$ac_cv_path_gnu_md5sum" >&6; } - GNU_md5sum=$ac_cv_path_gnu_md5sum - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU mkdir" >&5 -$as_echo_n "checking for GNU mkdir... " >&6; } -if ${ac_cv_path_gnu_mkdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_mkdir"; then - ac_path_gnu_mkdir_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gmkdir mkdir.gnu mkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_mkdir="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_mkdir" || continue -out=`$ac_path_gnu_mkdir --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_mkdir=$ac_path_gnu_mkdir ac_path_gnu_mkdir_found=: - $ac_path_gnu_mkdir_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_mkdir"; then - as_fn_error $? "could not find GNU mkdir" "$LINENO" 5 - fi -else - ac_cv_path_gnu_mkdir=$gnu_mkdir -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_mkdir" >&5 -$as_echo "$ac_cv_path_gnu_mkdir" >&6; } - GNU_mkdir=$ac_cv_path_gnu_mkdir - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU install" >&5 -$as_echo_n "checking for GNU install... " >&6; } -if ${ac_cv_path_gnu_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_install"; then - ac_path_gnu_install_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in ginstall install.gnu install; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_install="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_install" || continue -out=`$ac_path_gnu_install --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_install=$ac_path_gnu_install ac_path_gnu_install_found=: - $ac_path_gnu_install_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_install"; then - as_fn_error $? "could not find GNU install" "$LINENO" 5 - fi -else - ac_cv_path_gnu_install=$gnu_install -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_install" >&5 -$as_echo "$ac_cv_path_gnu_install" >&6; } - GNU_install=$ac_cv_path_gnu_install - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU stat" >&5 -$as_echo_n "checking for GNU stat... " >&6; } -if ${ac_cv_path_gnu_stat+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_stat"; then - ac_path_gnu_stat_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gstat stat.gnu stat; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_stat="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_stat" || continue -out=`$ac_path_gnu_stat --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_stat=$ac_path_gnu_stat ac_path_gnu_stat_found=: - $ac_path_gnu_stat_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_stat"; then - as_fn_error $? "could not find GNU stat" "$LINENO" 5 - fi -else - ac_cv_path_gnu_stat=$gnu_stat -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_stat" >&5 -$as_echo "$ac_cv_path_gnu_stat" >&6; } - GNU_stat=$ac_cv_path_gnu_stat - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU mknod" >&5 -$as_echo_n "checking for GNU mknod... " >&6; } -if ${ac_cv_path_gnu_mknod+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_mknod"; then - ac_path_gnu_mknod_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gmknod mknod.gnu mknod; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_mknod="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_mknod" || continue -out=`$ac_path_gnu_mknod --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_mknod=$ac_path_gnu_mknod ac_path_gnu_mknod_found=: - $ac_path_gnu_mknod_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_mknod"; then - as_fn_error $? "could not find GNU mknod" "$LINENO" 5 - fi -else - ac_cv_path_gnu_mknod=$gnu_mknod -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_mknod" >&5 -$as_echo "$ac_cv_path_gnu_mknod" >&6; } - GNU_mknod=$ac_cv_path_gnu_mknod - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU dirname" >&5 -$as_echo_n "checking for GNU dirname... " >&6; } -if ${ac_cv_path_gnu_dirname+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_dirname"; then - ac_path_gnu_dirname_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gdirname dirname.gnu dirname; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_dirname="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_dirname" || continue -out=`$ac_path_gnu_dirname --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_dirname=$ac_path_gnu_dirname ac_path_gnu_dirname_found=: - $ac_path_gnu_dirname_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_dirname"; then - as_fn_error $? "could not find GNU dirname" "$LINENO" 5 - fi -else - ac_cv_path_gnu_dirname=$gnu_dirname -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_dirname" >&5 -$as_echo "$ac_cv_path_gnu_dirname" >&6; } - GNU_dirname=$ac_cv_path_gnu_dirname - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU sort" >&5 -$as_echo_n "checking for GNU sort... " >&6; } -if ${ac_cv_path_gnu_sort+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_sort"; then - ac_path_gnu_sort_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gsort sort.gnu sort; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_sort="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_sort" || continue -out=`$ac_path_gnu_sort --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_sort=$ac_path_gnu_sort ac_path_gnu_sort_found=: - $ac_path_gnu_sort_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_sort"; then - as_fn_error $? "could not find GNU sort" "$LINENO" 5 - fi -else - ac_cv_path_gnu_sort=$gnu_sort -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_sort" >&5 -$as_echo "$ac_cv_path_gnu_sort" >&6; } - GNU_sort=$ac_cv_path_gnu_sort - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU cat" >&5 -$as_echo_n "checking for GNU cat... " >&6; } -if ${ac_cv_path_gnu_cat+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_cat"; then - ac_path_gnu_cat_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gcat cat.gnu cat; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_cat="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_cat" || continue -out=`$ac_path_gnu_cat --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_cat=$ac_path_gnu_cat ac_path_gnu_cat_found=: - $ac_path_gnu_cat_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_cat"; then - as_fn_error $? "could not find GNU cat" "$LINENO" 5 - fi -else - ac_cv_path_gnu_cat=$gnu_cat -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_cat" >&5 -$as_echo "$ac_cv_path_gnu_cat" >&6; } - GNU_cat=$ac_cv_path_gnu_cat - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU tty" >&5 -$as_echo_n "checking for GNU tty... " >&6; } -if ${ac_cv_path_gnu_tty+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_tty"; then - ac_path_gnu_tty_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gtty tty.gnu tty; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_tty="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_tty" || continue -out=`$ac_path_gnu_tty --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_tty=$ac_path_gnu_tty ac_path_gnu_tty_found=: - $ac_path_gnu_tty_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_tty"; then - as_fn_error $? "could not find GNU tty" "$LINENO" 5 - fi -else - ac_cv_path_gnu_tty=$gnu_tty -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_tty" >&5 -$as_echo "$ac_cv_path_gnu_tty" >&6; } - GNU_tty=$ac_cv_path_gnu_tty - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU readlink" >&5 -$as_echo_n "checking for GNU readlink... " >&6; } -if ${ac_cv_path_gnu_readlink+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_readlink"; then - ac_path_gnu_readlink_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in greadlink readlink.gnu readlink; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_readlink="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_readlink" || continue -out=`$ac_path_gnu_readlink --version 2>/dev/null | $SED -ne "s/.*\(GNU\) coreutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_readlink=$ac_path_gnu_readlink ac_path_gnu_readlink_found=: - $ac_path_gnu_readlink_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_readlink"; then - as_fn_error $? "could not find GNU readlink" "$LINENO" 5 - fi -else - ac_cv_path_gnu_readlink=$gnu_readlink -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_readlink" >&5 -$as_echo "$ac_cv_path_gnu_readlink" >&6; } - GNU_readlink=$ac_cv_path_gnu_readlink - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU tar" >&5 -$as_echo_n "checking for GNU tar... " >&6; } -if ${ac_cv_path_gnu_tar+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_tar"; then - ac_path_gnu_tar_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gtar tar.gnu tar; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_tar="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_tar" || continue -out=`$ac_path_gnu_tar --version 2>/dev/null | $SED -ne "s/.*\(GNU\) tar.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_tar=$ac_path_gnu_tar ac_path_gnu_tar_found=: - $ac_path_gnu_tar_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_tar"; then - as_fn_error $? "could not find GNU tar" "$LINENO" 5 - fi -else - ac_cv_path_gnu_tar=$gnu_tar -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_tar" >&5 -$as_echo "$ac_cv_path_gnu_tar" >&6; } - GNU_tar=$ac_cv_path_gnu_tar - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU find" >&5 -$as_echo_n "checking for GNU find... " >&6; } -if ${ac_cv_path_gnu_find+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_find"; then - ac_path_gnu_find_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gfind find.gnu find; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_find="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_find" || continue -out=`$ac_path_gnu_find --version 2>/dev/null | $SED -ne "s/.*\(GNU\) findutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_find=$ac_path_gnu_find ac_path_gnu_find_found=: - $ac_path_gnu_find_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_find"; then - as_fn_error $? "could not find GNU find" "$LINENO" 5 - fi -else - ac_cv_path_gnu_find=$gnu_find -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_find" >&5 -$as_echo "$ac_cv_path_gnu_find" >&6; } - GNU_find=$ac_cv_path_gnu_find - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU xargs" >&5 -$as_echo_n "checking for GNU xargs... " >&6; } -if ${ac_cv_path_gnu_xargs+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$gnu_xargs"; then - ac_path_gnu_xargs_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in gxargs xargs.gnu xargs; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_gnu_xargs="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_gnu_xargs" || continue -out=`$ac_path_gnu_xargs --version 2>/dev/null | $SED -ne "s/.*\(GNU\) findutils.*/\1/p"` - test "x$out" = xGNU && ac_cv_path_gnu_xargs=$ac_path_gnu_xargs ac_path_gnu_xargs_found=: - $ac_path_gnu_xargs_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_gnu_xargs"; then - as_fn_error $? "could not find GNU xargs" "$LINENO" 5 - fi -else - ac_cv_path_gnu_xargs=$gnu_xargs -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_gnu_xargs" >&5 -$as_echo "$ac_cv_path_gnu_xargs" >&6; } - GNU_xargs=$ac_cv_path_gnu_xargs - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -if test -z "$CC"; then - as_fn_error $? "gcc could not be found, please install" "$LINENO" 5 -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -if test -z "$CXX"; then - as_fn_error $? "g++ could not be found, please install" "$LINENO" 5 -fi - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -for ac_prog in ${AWK} -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $AWK in - [\\/]* | ?:[\\/]*) - ac_cv_path_AWK="$AWK" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_AWK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -AWK=$ac_cv_path_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking awk version" >&5 -$as_echo_n "checking awk version... " >&6; } -AWK_VERSION=`$AWK --version 2>/dev/null | $SED -ne "s/GNU [Aa]wk \([0-9\.]*\)/\1/p"` -case "$AWK_VERSION" in -"") as_fn_error $? "we need GNU awk" "$LINENO" 5 ;; -*) ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK_VERSION" >&5 -$as_echo "$AWK_VERSION" >&6; } - -# fall back to 'false' for systems which do not provide a 'sysctl' tool -for ac_prog in sysctl false -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SYSCTL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SYSCTL in - [\\/]* | ?:[\\/]*) - ac_cv_path_SYSCTL="$SYSCTL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SYSCTL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SYSCTL=$ac_cv_path_SYSCTL -if test -n "$SYSCTL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SYSCTL" >&5 -$as_echo "$SYSCTL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$SYSCTL" && break -done - - -for ac_prog in flex lex -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LEX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LEX=$ac_cv_prog_LEX -if test -n "$LEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 -$as_echo "$LEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$LEX" && break -done -test -n "$LEX" || LEX=":" - -if test "x$LEX" != "x:"; then - cat >conftest.l <<_ACEOF -%% -a { ECHO; } -b { REJECT; } -c { yymore (); } -d { yyless (1); } -e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ - yyless ((input () != 0)); } -f { unput (yytext[0]); } -. { BEGIN INITIAL; } -%% -#ifdef YYTEXT_POINTER -extern char *yytext; -#endif -int -main (void) -{ - return ! yylex () + ! yywrap (); -} -_ACEOF -{ { ac_try="$LEX conftest.l" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$LEX conftest.l") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 -$as_echo_n "checking lex output file root... " >&6; } -if ${ac_cv_prog_lex_root+:} false; then : - $as_echo_n "(cached) " >&6 -else - -if test -f lex.yy.c; then - ac_cv_prog_lex_root=lex.yy -elif test -f lexyy.c; then - ac_cv_prog_lex_root=lexyy -else - as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 -$as_echo "$ac_cv_prog_lex_root" >&6; } -LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root - -if test -z "${LEXLIB+set}"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 -$as_echo_n "checking lex library... " >&6; } -if ${ac_cv_lib_lex+:} false; then : - $as_echo_n "(cached) " >&6 -else - - ac_save_LIBS=$LIBS - ac_cv_lib_lex='none needed' - for ac_lib in '' -lfl -ll; do - LIBS="$ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -`cat $LEX_OUTPUT_ROOT.c` -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_lex=$ac_lib -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - test "$ac_cv_lib_lex" != 'none needed' && break - done - LIBS=$ac_save_LIBS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 -$as_echo "$ac_cv_lib_lex" >&6; } - test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 -$as_echo_n "checking whether yytext is a pointer... " >&6; } -if ${ac_cv_prog_lex_yytext_pointer+:} false; then : - $as_echo_n "(cached) " >&6 -else - # POSIX says lex can declare yytext either as a pointer or an array; the -# default is implementation-dependent. Figure out which it is, since -# not all implementations provide the %pointer and %array declarations. -ac_cv_prog_lex_yytext_pointer=no -ac_save_LIBS=$LIBS -LIBS="$LEXLIB $ac_save_LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #define YYTEXT_POINTER 1 -`cat $LEX_OUTPUT_ROOT.c` -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_prog_lex_yytext_pointer=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_save_LIBS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 -$as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } -if test $ac_cv_prog_lex_yytext_pointer = yes; then - -$as_echo "#define YYTEXT_POINTER 1" >>confdefs.h - -fi -rm -f conftest.l $LEX_OUTPUT_ROOT.c - -fi -for ac_prog in ${LEX} -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_LEX+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $LEX in - [\\/]* | ?:[\\/]*) - ac_cv_path_LEX="$LEX" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_LEX="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -LEX=$ac_cv_path_LEX -if test -n "$LEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 -$as_echo "$LEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$LEX" && break -done - -if test -z "${LEX}"; then - as_fn_error $? "(f)lex could not be found, please install" "$LINENO" 5 -fi - -for ac_prog in 'bison -y' byacc -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_YACC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$YACC"; then - ac_cv_prog_YACC="$YACC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_YACC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -YACC=$ac_cv_prog_YACC -if test -n "$YACC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 -$as_echo "$YACC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$YACC" && break -done -test -n "$YACC" || YACC="yacc" - -for ac_prog in ${YACC} -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_YACC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $YACC in - [\\/]* | ?:[\\/]*) - ac_cv_path_YACC="$YACC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_YACC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -YACC=$ac_cv_path_YACC -if test -n "$YACC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 -$as_echo "$YACC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$YACC" && break -done - -if test -z "${YACC}"; then - as_fn_error $? "yacc/bison could not be found, please install" "$LINENO" 5 -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yacc is bison++" >&5 -$as_echo_n "checking whether yacc is bison++... " >&6; } -if $YACC --version 2>/dev/null | grep bison++ -q; then - as_fn_error $? "your $YACC turns out to be bison++, please install plain bison" "$LINENO" 5 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, this is good" >&5 -$as_echo "no, this is good" >&6; } -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking yacc/bison version" >&5 -$as_echo_n "checking yacc/bison version... " >&6; } -YACC_VERSION=`$YACC --version 2>/dev/null | $SED -ne "s/.*GNU Bison.* \([0-9.]*\).*/\1/p"` -case "${YACC_VERSION}" in - 1.*) - as_fn_error $? "$YACC_VERSION, your bison version is too old, install 2.3 or sth. like that" "$LINENO" 5 ;; - "") - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no GNU bison found, continuing anyway...." >&5 -$as_echo "$as_me: WARNING: no GNU bison found, continuing anyway...." >&2;} ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC_VERSION" >&5 -$as_echo "$YACC_VERSION" >&6; } ;; -esac - -for ac_prog in makeinfo -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_MAKEINFO+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAKEINFO in - [\\/]* | ?:[\\/]*) - ac_cv_path_MAKEINFO="$MAKEINFO" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_MAKEINFO="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -MAKEINFO=$ac_cv_path_MAKEINFO -if test -n "$MAKEINFO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5 -$as_echo "$MAKEINFO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$MAKEINFO" && break -done - -if test -z "$MAKEINFO"; then - as_fn_error $? "makeinfo could not be found, please install the texinfo package" "$LINENO" 5 -fi - -for ac_prog in bunzip2 -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_BUNZIP2+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $BUNZIP2 in - [\\/]* | ?:[\\/]*) - ac_cv_path_BUNZIP2="$BUNZIP2" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_BUNZIP2="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -BUNZIP2=$ac_cv_path_BUNZIP2 -if test -n "$BUNZIP2"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUNZIP2" >&5 -$as_echo "$BUNZIP2" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$BUNZIP2" && break -done - -if test -z "$BUNZIP2"; then - as_fn_error $? "bunzip2 could not be found, please install" "$LINENO" 5 -fi - -for ac_prog in gunzip -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_GUNZIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $GUNZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_GUNZIP="$GUNZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_GUNZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -GUNZIP=$ac_cv_path_GUNZIP -if test -n "$GUNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUNZIP" >&5 -$as_echo "$GUNZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$GUNZIP" && break -done - -if test -z "$GUNZIP"; then - as_fn_error $? "gunzip could not be found, please install" "$LINENO" 5 -fi - -for ac_prog in gunzip -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_UNZIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $UNZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_UNZIP="$UNZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_UNZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -UNZIP=$ac_cv_path_UNZIP -if test -n "$UNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNZIP" >&5 -$as_echo "$UNZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$UNZIP" && break -done - -if test -z "$UNZIP"; then - as_fn_error $? "unzip could not be found, please install" "$LINENO" 5 -fi - -for ac_prog in mktemp -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_MKTEMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MKTEMP in - [\\/]* | ?:[\\/]*) - ac_cv_path_MKTEMP="$MKTEMP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_MKTEMP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -MKTEMP=$ac_cv_path_MKTEMP -if test -n "$MKTEMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKTEMP" >&5 -$as_echo "$MKTEMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$MKTEMP" && break -done - -if test -z "$MKTEMP"; then - as_fn_error $? "mktemp could not be found, please install" "$LINENO" 5 -fi - -for ac_prog in wget -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_WGET+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $WGET in - [\\/]* | ?:[\\/]*) - ac_cv_path_WGET="$WGET" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -WGET=$ac_cv_path_WGET -if test -n "$WGET"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5 -$as_echo "$WGET" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$WGET" && break -done - -if test -z "$WGET"; then - as_fn_error $? "wget could not be found, please install" "$LINENO" 5 -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking find version" >&5 -$as_echo_n "checking find version... " >&6; } -FIND_VERSION=`$GNU_find --version 2>/dev/null | $SED -ne "s/.*\s\+\([0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/p"` -case "$FIND_VERSION" in -4.*) ;; -*) as_fn_error $? "we need at least GNU find 4.x" "$LINENO" 5 ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIND_VERSION" >&5 -$as_echo "$FIND_VERSION" >&6; } - -for ac_prog in gmake gnumake make -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_MAKE+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_MAKE="$MAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_MAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -MAKE=$ac_cv_path_MAKE -if test -n "$MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKE" >&5 -$as_echo "$MAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$MAKE" && break -done - -if test -z "$MAKE"; then - as_fn_error $? "make could not be found, please install" "$LINENO" 5 -fi -MAKE_VERSION=`$MAKE --version 2>/dev/null | $SED -ne "s/^GNU Make \([0-9]\+\.[0-9.]\+\).*$/\1/p"` -MINOR_MAKE_VERSION="${MAKE_VERSION#*.}" -MAJOR_MAKE_VERSION="${MAKE_VERSION%.*}" -if test -z "${MAJOR_MAKE_VERSION}" -o -z "${MINOR_MAKE_VERSION}" ; then - as_fn_error $? "could not parse make version. GNU make >= 3.81 required" "$LINENO" 5 -fi -if test $MAJOR_MAKE_VERSION -eq 3 -a $MINOR_MAKE_VERSION -lt 81 -o $MAJOR_MAKE_VERSION -lt 3 ; then - as_fn_error $? "GNU make >= 3.81 required ($MAKE_VERSION found)" "$LINENO" 5 -fi - -for ac_prog in file -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_FILE+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $FILE in - [\\/]* | ?:[\\/]*) - ac_cv_path_FILE="$FILE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_FILE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -FILE=$ac_cv_path_FILE -if test -n "$FILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FILE" >&5 -$as_echo "$FILE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$FILE" && break -done - -if test -z "$FILE"; then - as_fn_error $? "file could not be found, please install" "$LINENO" 5 -fi -PTXDIST_FILE=$FILE - - -for ac_prog in msgfmt -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_MSGFMT+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MSGFMT in - [\\/]* | ?:[\\/]*) - ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -MSGFMT=$ac_cv_path_MSGFMT -if test -n "$MSGFMT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 -$as_echo "$MSGFMT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$MSGFMT" && break -done - -if test -z "$MSGFMT"; then - as_fn_error $? "gettext could not be found, please install" "$LINENO" 5 -fi - -for ac_prog in gcc -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_GCC+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $GCC in - [\\/]* | ?:[\\/]*) - ac_cv_path_GCC="$GCC" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_GCC="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -GCC=$ac_cv_path_GCC -if test -n "$GCC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCC" >&5 -$as_echo "$GCC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$GCC" && break -done - - - -# Check whether --with-python was given. -if test "${with_python+set}" = set; then : - withval=$with_python; - PYTHON="$withval" - - { $as_echo "$as_me:${as_lineno-$LINENO}: Using python executable $PYTHON" >&5 -$as_echo "$as_me: Using python executable $PYTHON" >&6;} - -else - - for ac_prog in python2.7 python2.6 python -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PYTHON+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PYTHON in - [\\/]* | ?:[\\/]*) - ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -PYTHON=$ac_cv_path_PYTHON -if test -n "$PYTHON"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 -$as_echo "$PYTHON" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$PYTHON" && break -done - - - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON finds distutils" >&5 -$as_echo_n "checking whether $PYTHON finds distutils... " >&6; } -if test "`$PYTHON -c "import distutils" 2> /dev/null && echo yes`" = "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Please install the Python distutils package" "$LINENO" 5 -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether python development files are present" >&5 -$as_echo_n "checking whether python development files are present... " >&6; } -PYTHON_MAKEFILE=`$PYTHON -c "import distutils.sysconfig; print distutils.sysconfig.get_makefile_filename()" 2> /dev/null` -if test -e "$PYTHON_MAKEFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "some python development files could not be found, you are - likely using suse or redhat system as host. In this case - please install the python-devel packages" "$LINENO" 5 -fi - - -# Check whether --with-patch was given. -if test "${with_patch+set}" = set; then : - withval=$with_patch; - PATCH="$withval" - - { $as_echo "$as_me:${as_lineno-$LINENO}: Using patch executable $PATCH" >&5 -$as_echo "$as_me: Using patch executable $PATCH" >&6;} - -else - - # Extract the first word of "patch", so it can be a program name with args. -set dummy patch; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PATCH+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PATCH in - [\\/]* | ?:[\\/]*) - ac_cv_path_PATCH="$PATCH" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PATCH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -PATCH=$ac_cv_path_PATCH -if test -n "$PATCH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATCH" >&5 -$as_echo "$PATCH" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -fi - -if test -z "$PATCH"; then - as_fn_error $? "Please specify the location of patch with the option '--with-patch'" "$LINENO" 5 -fi - -# Sun's patch is a mess, issue a warning. But we are going to continue with -# the build because you might just be lucky. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PATCH will work" >&5 -$as_echo_n "checking whether $PATCH will work... " >&6; } -if $PATCH -v 2>&1 | grep -q "Sun" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -Sorry, you have a Sun version of patch which is notoriously buggy. $PACKAGE_NAME -may function correctly, or minor errors may occur due to Sun's patch tool. -Please consider upgrading to GNU patch, if you already have GNU patch then you -can supply its path with the '--with-patch=' option. -" >&5 -$as_echo "$as_me: WARNING: -Sorry, you have a Sun version of patch which is notoriously buggy. $PACKAGE_NAME -may function correctly, or minor errors may occur due to Sun's patch tool. -Please consider upgrading to GNU patch, if you already have GNU patch then you -can supply its path with the '--with-patch=' option. -" >&2;} -elif $PATCH --version 2>&1 | grep -q "patch 2.0" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -Sorry, the version of patch you are using can cause severe problems when a patch -creates a directory. $PACKAGE_NAME may well function correctly with this version -of patch or small problems could creep in. -Please consider upgrading your patch to a more recent version, if you already -have a more recent version of patch then you can supply its path with the -'--with-patch=' option. -" >&5 -$as_echo "$as_me: WARNING: -Sorry, the version of patch you are using can cause severe problems when a patch -creates a directory. $PACKAGE_NAME may well function correctly with this version -of patch or small problems could creep in. -Please consider upgrading your patch to a more recent version, if you already -have a more recent version of patch then you can supply its path with the -'--with-patch=' option. -" >&2;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi - - - -# Check whether --with-bash-completion was given. -if test "${with_bash_completion+set}" = set; then : - withval=$with_bash_completion; - if test "$withval" = "no"; then - BASH_COMPLETION_DIR="" - elif test "$withval" = "yes"; then - BASH_COMPLETION_DIR=/etc/bash_completion.d - else - BASH_COMPLETION_DIR="$withval" - fi - -else - BASH_COMPLETION_DIR=/etc/bash_completion.d - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 -$as_echo "" >&6; } -ac_config_files="$ac_config_files Makefile" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -:mline -/\\$/{ - N - s,\\\n,, - b mline -} -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${BUILD_NCONF_TRUE}" && test -z "${BUILD_NCONF_FALSE}"; then - as_fn_error $? "conditional \"BUILD_NCONF\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by ptxdist $as_me 2013.03.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -ptxdist config.status 2013.03.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - - -eval set X " :F $CONFIG_FILES " -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - - - - esac - -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 -$as_echo "" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PACKAGE_NAME version $PACKAGE_VERSION configured." >&5 -$as_echo "$PACKAGE_NAME version $PACKAGE_VERSION configured." >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Using '$prefix' for installation prefix." >&5 -$as_echo "Using '$prefix' for installation prefix." >&6; } - -# we don't need to see this just for the backup-files command -# but we may as well spec it for the future -#AC_MSG_RESULT([Using '$CC' for C compiler.]) -#AC_MSG_RESULT([Building with '$CFLAGS' for C compiler flags.]) -#AC_MSG_RESULT([Building with '$LIBS' for linker flags.]) - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 -$as_echo "" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Report bugs to $PACKAGE_BUGREPORT" >&5 -$as_echo "Report bugs to $PACKAGE_BUGREPORT" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 -$as_echo "" >&6; } diff --git a/configure.ac b/configure.ac index b6dc16d..2a97944 100644 --- a/configure.ac +++ b/configure.ac @@ -336,7 +336,7 @@ AC_ARG_WITH(patch, AS_HELP_STRING([--with-patch],[name of the patch executable t AC_PATH_PROG(PATCH, patch) ]) if test -z "$PATCH"; then - AC_MSG_ERROR([Please specify the location of patch with the option '--with-patch']) + AC_MSG_ERROR([Please specify the location of the patch executable with the option '--with-patch']) fi # Sun's patch is a mess, issue a warning. But we are going to continue with diff --git a/generic/etc/prelink.conf.d/gstreamer1 b/generic/etc/prelink.conf.d/gstreamer1 new file mode 100644 index 0000000..4cbb9d9 --- /dev/null +++ b/generic/etc/prelink.conf.d/gstreamer1 @@ -0,0 +1 @@ +-l /usr/lib/gstreamer-1.0 diff --git a/generic/lib/init/nm-unmanage.sh b/generic/lib/init/nm-unmanage.sh index 3d4cb68..c994410 100644 --- a/generic/lib/init/nm-unmanage.sh +++ b/generic/lib/init/nm-unmanage.sh @@ -4,6 +4,10 @@ CONFFILE=/var/run/NetworkManager.conf +if [ ! -e /run/resolv.conf -a -e /proc/net/pnp ]; then + cp /proc/net/pnp /run/resolv.conf +fi + if [ ! -f $CONFFILE ]; then # set previously enabled interfaces to unmanaged cat /etc/NetworkManager/NetworkManager.conf > $CONFFILE diff --git a/generic/lib/systemd/ifupdown-prepare b/generic/lib/systemd/ifupdown-prepare index 6a622dc..2028749 100755 --- a/generic/lib/systemd/ifupdown-prepare +++ b/generic/lib/systemd/ifupdown-prepare @@ -1,2 +1,7 @@ #!/bin/sh + +if [ ! -e /run/resolv.conf -a -e /proc/net/pnp ]; then + cp /proc/net/pnp /run/resolv.conf +fi + ifconfig | awk '/^[^ ]/ { printf "%s=kernel\n", $1 }' > /var/run/ifstate diff --git a/generic/lib/systemd/system/NetworkManager.service b/generic/lib/systemd/system/NetworkManager.service index be03e4d..f41c8b4 100644 --- a/generic/lib/systemd/system/NetworkManager.service +++ b/generic/lib/systemd/system/NetworkManager.service @@ -8,7 +8,15 @@ Before=network.target Type=dbus BusName=org.freedesktop.NetworkManager ExecStart=/usr/sbin/NetworkManager --no-daemon --config=/var/run/NetworkManager.conf --state-file=/var/run/NetworkManager.state +# Suppress stderr to eliminate duplicated messages in syslog. NM calls openlog() +# with LOG_PERROR when run in foreground. But systemd redirects stderr to +# syslog by default, which results in logging each message twice. +StandardError=null +# NM doesn't want systemd to kill its children for it +KillMode=process [Install] WantedBy=multi-user.target Alias=dbus-org.freedesktop.NetworkManager.service +Also=NetworkManager-wait-online.service + diff --git a/generic/lib/systemd/system/ntpd.service b/generic/lib/systemd/system/ntpd.service new file mode 100644 index 0000000..64fce1c --- /dev/null +++ b/generic/lib/systemd/system/ntpd.service @@ -0,0 +1,8 @@ +[Unit] +Description=ntpd + +[Service] +ExecStart=/usr/sbin/ntpd -n -c /etc/ntp-server.conf + +[Install] +WantedBy=multi-user.target diff --git a/patches/DeviceKit-disks-009/autogen.sh b/patches/DeviceKit-disks-009/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/DeviceKit-disks-009/autogen.sh +++ b/patches/DeviceKit-disks-009/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/DirectFB-1.4.3/autogen.sh b/patches/DirectFB-1.4.3/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/DirectFB-1.4.3/autogen.sh +++ b/patches/DirectFB-1.4.3/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/Frodo-4.1b/autogen-generic.sh b/patches/Frodo-4.1b/autogen-generic.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/Frodo-4.1b/autogen-generic.sh +++ b/patches/Frodo-4.1b/autogen-generic.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/MesaLib-8.0.3/autogen.sh b/patches/MesaLib-8.0.3/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/MesaLib-8.0.3/autogen.sh +++ b/patches/MesaLib-8.0.3/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/Python-2.7.5/0001-Add-support-for-socketcan-to-the-python-socket-modul.patch b/patches/Python-2.7.5/0001-Add-support-for-socketcan-to-the-python-socket-modul.patch new file mode 100644 index 0000000..360df3e --- /dev/null +++ b/patches/Python-2.7.5/0001-Add-support-for-socketcan-to-the-python-socket-modul.patch @@ -0,0 +1,224 @@ +From: Michael Olbrich +Date: Tue, 5 May 2009 15:17:20 +0200 +Subject: [PATCH] Add support for socketcan to the python socket module + +This patch add support for the protocol family AF_CAN. It contains all the +necessary code to use the python socket module for socketcan. + +Signed-off-by: Michael Olbrich +Signed-off-by: Marc Kleine-Budde +--- + Lib/plat-linux2/IN.py | 2 ++ + Modules/socketmodule.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ + Modules/socketmodule.h | 11 +++++++ + configure.ac | 13 ++++++++ + 4 files changed, 115 insertions(+) + +diff --git a/Lib/plat-linux2/IN.py b/Lib/plat-linux2/IN.py +index ad307f6..f72ae88 100644 +--- a/Lib/plat-linux2/IN.py ++++ b/Lib/plat-linux2/IN.py +@@ -384,6 +384,7 @@ PF_SNA = 22 + PF_IRDA = 23 + PF_PPPOX = 24 + PF_WANPIPE = 25 ++PF_CAN = 29 + PF_BLUETOOTH = 31 + PF_MAX = 32 + AF_UNSPEC = PF_UNSPEC +@@ -414,6 +415,7 @@ AF_SNA = PF_SNA + AF_IRDA = PF_IRDA + AF_PPPOX = PF_PPPOX + AF_WANPIPE = PF_WANPIPE ++AF_CAN = PF_CAN + AF_BLUETOOTH = PF_BLUETOOTH + AF_MAX = PF_MAX + SOL_RAW = 255 +diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c +index bdc055d..066221a 100644 +--- a/Modules/socketmodule.c ++++ b/Modules/socketmodule.c +@@ -420,6 +420,10 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); + + #define SAS2SA(x) ((struct sockaddr *)(x)) + ++#ifdef ENABLE_CAN ++#include ++#endif ++ + /* + * Constants for getnameinfo() + */ +@@ -1097,6 +1101,22 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) + } + #endif + ++#ifdef ENABLE_CAN ++ case AF_CAN: ++ { ++ struct sockaddr_can *a = (struct sockaddr_can *)addr; ++ char *ifname = ""; ++ struct ifreq ifr; ++ /* need to look up interface name give index */ ++ if (a->can_ifindex) { ++ ifr.ifr_ifindex = a->can_ifindex; ++ if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0) ++ ifname = ifr.ifr_name; ++ } ++ return Py_BuildValue("s", ifname); ++ } ++#endif ++ + #ifdef USE_BLUETOOTH + case AF_BLUETOOTH: + switch (proto) { +@@ -1383,6 +1403,28 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, + } + #endif + ++#ifdef ENABLE_CAN ++ case AF_CAN: ++ { ++ struct sockaddr_can* addr; ++ struct ifreq ifr; ++ char *interfaceName; ++ addr = (struct sockaddr_can*)addr_ret; ++ if (!PyArg_Parse(args, "s", &interfaceName)) ++ return 0; ++ strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name)); ++ ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0'; ++ if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) { ++ s->errorhandler(); ++ return 0; ++ } ++ addr->can_family = AF_CAN; ++ addr->can_ifindex = ifr.ifr_ifindex; ++ *len_ret = sizeof *addr; ++ return 1; ++ } ++#endif ++ + #ifdef USE_BLUETOOTH + case AF_BLUETOOTH: + { +@@ -1633,6 +1675,14 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) + } + #endif + ++#ifdef ENABLE_CAN ++ case AF_CAN: ++ { ++ *len_ret = sizeof (struct sockaddr_can); ++ return 1; ++ } ++#endif ++ + #ifdef USE_BLUETOOTH + case AF_BLUETOOTH: + { +@@ -4758,6 +4808,10 @@ init_socket(void) + PyModule_AddIntConstant(m, "AF_LLC", AF_LLC); + #endif + ++#ifdef ENABLE_CAN ++ PyModule_AddIntConstant(m, "AF_CAN", AF_CAN); ++#endif ++ + #ifdef USE_BLUETOOTH + PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH); + PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP); +@@ -5114,6 +5168,41 @@ init_socket(void) + PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX); + #endif + ++#ifdef CAN_RAW ++ PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW); ++#endif ++#ifdef CAN_BCM ++ PyModule_AddIntConstant(m, "CAN_BCM", CAN_BCM); ++#endif ++#ifdef CAN_TP16 ++ PyModule_AddIntConstant(m, "CAN_TP16", CAN_TP16); ++#endif ++#ifdef CAN_TP20 ++ PyModule_AddIntConstant(m, "CAN_TP20", CAN_TP20); ++#endif ++#ifdef CAN_MCNET ++ PyModule_AddIntConstant(m, "CAN_MCNET", CAN_MCNET); ++#endif ++#ifdef CAN_ISOTP ++ PyModule_AddIntConstant(m, "CAN_ISOTP", CAN_ISOTP); ++#endif ++#ifdef CAN_NPROTO ++ PyModule_AddIntConstant(m, "CAN_NPROTO", CAN_NPROTO); ++#endif ++ ++#ifdef SOL_CAN_BASE ++ PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE); ++#endif ++#ifdef SOL_CAN_RAW ++ PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW); ++#endif ++#ifdef ENABLE_CAN ++ PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER); ++ PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER); ++ PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK); ++ PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS); ++#endif ++ + /* Some port configuration */ + #ifdef IPPORT_RESERVED + PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED); +diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h +index 8515499..3eae3eb 100644 +--- a/Modules/socketmodule.h ++++ b/Modules/socketmodule.h +@@ -55,6 +55,14 @@ typedef int socklen_t; + #include + #endif + ++#define AF_CAN 29 ++#define PF_CAN AF_CAN ++ ++#ifdef HAVE_LINUX_CAN_H ++#define ENABLE_CAN 1 ++#include ++#endif ++ + #ifdef HAVE_BLUETOOTH_H + #include + #endif +@@ -106,6 +114,9 @@ typedef union sock_addr { + struct sockaddr_in6 in6; + struct sockaddr_storage storage; + #endif ++#ifdef ENABLE_CAN ++ struct sockaddr_can can; ++#endif + #ifdef HAVE_BLUETOOTH_BLUETOOTH_H + struct sockaddr_l2 bt_l2; + struct sockaddr_rc bt_rc; +diff --git a/configure.ac b/configure.ac +index 30f5bf4..c9b78ff 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1539,6 +1539,19 @@ AC_CHECK_HEADERS(linux/netlink.h,,,[ + #endif + ]) + ++AC_CHECK_HEADERS(linux/can.h,[],[],[#include ]) ++# check for AF_CAN ++AC_TRY_COMPILE( ++ [[#include ++ int domain = AF_CAN;]], ++ [[socket(domain, 0, 0);]], ++ [], ++ [ ++ AC_DEFINE(AF_CAN, 29, [Define AF_CAN if not defined by sys/socket.h]) ++ AC_DEFINE(PF_CAN, 29, [Define PF_CAN if not defined by sys/socket.h]) ++ ] ++) ++ + # checks for typedefs + was_it_defined=no + AC_MSG_CHECKING(for clock_t in time.h) diff --git a/patches/Python-2.7.5/0002-use-AC_CHECK_SIZEOF-rather-than-AC_TRY_COMPILE-for-l.patch b/patches/Python-2.7.5/0002-use-AC_CHECK_SIZEOF-rather-than-AC_TRY_COMPILE-for-l.patch new file mode 100644 index 0000000..08c3dd8 --- /dev/null +++ b/patches/Python-2.7.5/0002-use-AC_CHECK_SIZEOF-rather-than-AC_TRY_COMPILE-for-l.patch @@ -0,0 +1,37 @@ +From: Marc Kleine-Budde +Date: Fri, 24 Apr 2009 18:44:11 +0200 +Subject: [PATCH] use AC_CHECK_SIZEOF rather than AC_TRY_COMPILE for long long + detection + +AC_CHECK_SIZEOF does first detect if the type is available and detects +its size. Use it, rather than hand crafted function with AC_TRY_COMPILE. + +Signed-off-by: Marc Kleine-Budde +--- + configure.ac | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +diff --git a/configure.ac b/configure.ac +index c9b78ff..ebc8285 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1676,15 +1676,11 @@ AC_CHECK_SIZEOF(fpos_t, 4) + AC_CHECK_SIZEOF(size_t, 4) + AC_CHECK_SIZEOF(pid_t, 4) + +-AC_MSG_CHECKING(for long long support) +-have_long_long=no +-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[long long x; x = (long long)0;]])],[ +- AC_DEFINE(HAVE_LONG_LONG, 1, [Define this if you have the type long long.]) ++AC_TYPE_LONG_LONG_INT ++AC_CHECK_SIZEOF(long long) ++if test "$ac_cv_type_long_long_int" = "yes" ; then + have_long_long=yes +-],[]) +-AC_MSG_RESULT($have_long_long) +-if test "$have_long_long" = yes ; then +-AC_CHECK_SIZEOF(long long, 8) ++ AC_DEFINE(HAVE_LONG_LONG, 1, [Define this if you have the type long long.]) + fi + + AC_MSG_CHECKING(for long double support) diff --git a/patches/Python-2.7.5/0003-use-AC_TYPE_LONG_DOUBLE-to-detect-long-double-suppor.patch b/patches/Python-2.7.5/0003-use-AC_TYPE_LONG_DOUBLE-to-detect-long-double-suppor.patch new file mode 100644 index 0000000..9fdac2f --- /dev/null +++ b/patches/Python-2.7.5/0003-use-AC_TYPE_LONG_DOUBLE-to-detect-long-double-suppor.patch @@ -0,0 +1,35 @@ +From: Marc Kleine-Budde +Date: Fri, 24 Apr 2009 18:47:19 +0200 +Subject: [PATCH] use AC_TYPE_LONG_DOUBLE to detect long double support + +use the correct AC_TYPE_LONG_DOUBLE function rahter than hand crafted +test to detect long double support. + +Signed-off-by: Marc Kleine-Budde +--- + configure.ac | 12 ++---------- + 1 file changed, 2 insertions(+), 10 deletions(-) + +diff --git a/configure.ac b/configure.ac +index ebc8285..764a08f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1683,16 +1683,8 @@ if test "$ac_cv_type_long_long_int" = "yes" ; then + AC_DEFINE(HAVE_LONG_LONG, 1, [Define this if you have the type long long.]) + fi + +-AC_MSG_CHECKING(for long double support) +-have_long_double=no +-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[long double x; x = (long double)0;]])],[ +- AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define this if you have the type long double.]) +- have_long_double=yes +-],[]) +-AC_MSG_RESULT($have_long_double) +-if test "$have_long_double" = yes ; then +-AC_CHECK_SIZEOF(long double, 12) +-fi ++AC_TYPE_LONG_DOUBLE ++AC_CHECK_SIZEOF(long double) + + AC_MSG_CHECKING(for _Bool support) + have_c99_bool=no diff --git a/patches/Python-2.7.5/0004-use-PGEN_FOR_BUILD.patch b/patches/Python-2.7.5/0004-use-PGEN_FOR_BUILD.patch new file mode 100644 index 0000000..d892f97 --- /dev/null +++ b/patches/Python-2.7.5/0004-use-PGEN_FOR_BUILD.patch @@ -0,0 +1,32 @@ +From: Marc Kleine-Budde +Date: Wed, 12 Jun 2013 13:53:15 +0200 +Subject: [PATCH] use PGEN_FOR_BUILD + +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Michael Olbrich +--- + Makefile.pre.in | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/Makefile.pre.in b/Makefile.pre.in +index 9d55550..4461970 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -227,6 +227,8 @@ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ + ########################################################################## + # Parser + PGEN= Parser/pgen$(EXE) ++PGEN_FOR_BUILD= $(PGEN) ++ + + PSRCS= \ + Parser/acceler.c \ +@@ -593,7 +595,7 @@ Modules/pwdmodule.o: $(srcdir)/Modules/pwdmodule.c $(srcdir)/Modules/posixmodule + $(GRAMMAR_H): $(GRAMMAR_INPUT) $(PGENSRCS) + @$(MKDIR_P) Include + $(MAKE) $(PGEN) +- $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) ++ $(PGEN_FOR_BUILD) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) + $(GRAMMAR_C): $(GRAMMAR_H) $(GRAMMAR_INPUT) $(PGENSRCS) + $(MAKE) $(GRAMMAR_H) + touch $(GRAMMAR_C) diff --git a/patches/Python-2.7.5/0005-setup.py-don-t-leak-host-path-into-cross-compilation.patch b/patches/Python-2.7.5/0005-setup.py-don-t-leak-host-path-into-cross-compilation.patch new file mode 100644 index 0000000..a9537bc --- /dev/null +++ b/patches/Python-2.7.5/0005-setup.py-don-t-leak-host-path-into-cross-compilation.patch @@ -0,0 +1,40 @@ +From: Marc Kleine-Budde +Date: Tue, 28 Apr 2009 19:07:54 +0200 +Subject: [PATCH] setup.py: don't leak host path into cross compilation + environment + +During cross compilation we don't host path (neither include nor library +search patch) to leak into our environment. + +Signed-off-by: Marc Kleine-Budde +--- + setup.py | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index 716f08e..c556209 100644 +--- a/setup.py ++++ b/setup.py +@@ -437,8 +437,10 @@ class PyBuildExt(build_ext): + + def detect_modules(self): + # Ensure that /usr/local is always used +- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') +- add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ ++ if not cross_compiling: ++ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') ++ add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_gcc_paths() + self.add_multiarch_paths() + +@@ -1203,6 +1205,9 @@ class PyBuildExt(build_ext): + # the more recent berkeleydb's db.h file first in the include path + # when attempting to compile and it will fail. + f = "/usr/include/db.h" ++ if cross_compiling: ++ f = '' ++ + + if host_platform == 'darwin': + if is_macosx_sdk_path(f): diff --git a/patches/Python-2.7.5/0006-add-cross-compilation-support.patch b/patches/Python-2.7.5/0006-add-cross-compilation-support.patch new file mode 100644 index 0000000..180c3eb --- /dev/null +++ b/patches/Python-2.7.5/0006-add-cross-compilation-support.patch @@ -0,0 +1,61 @@ +From: Marc Kleine-Budde +Date: Mon, 4 May 2009 14:39:18 +0200 +Subject: [PATCH] add cross compilation support + +This patch adds preliminary cross compilation support to python. + +Signed-off-by: Marc Kleine-Budde +--- + Makefile.pre.in | 12 ++++++++---- + configure.ac | 7 +++++++ + 2 files changed, 15 insertions(+), 4 deletions(-) + +diff --git a/Makefile.pre.in b/Makefile.pre.in +index 4461970..584ed4f 100644 +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -84,6 +84,10 @@ CFLAGSFORSHARED=@CFLAGSFORSHARED@ + # C flags used for building the interpreter object files + PY_CFLAGS= $(CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE + ++# cross compiler options ++ifndef DESTDIR ++sysroot= @SYSROOT@ ++endif + + # Machine-dependent subdirectories + MACHDEP= @MACHDEP@ +@@ -102,11 +106,11 @@ datarootdir= @datarootdir@ + + # Expanded directories + BINDIR= @bindir@ +-LIBDIR= @libdir@ ++LIBDIR= $(sysroot)@libdir@ + MANDIR= @mandir@ +-INCLUDEDIR= @includedir@ +-CONFINCLUDEDIR= $(exec_prefix)/include +-SCRIPTDIR= $(prefix)/lib ++INCLUDEDIR= $(sysroot)@includedir@ ++CONFINCLUDEDIR= $(sysroot)$(exec_prefix)/include ++SCRIPTDIR= $(sysroot)$(prefix)/lib + + # Detailed destination directories + BINLIBDEST= $(LIBDIR)/python$(VERSION) +diff --git a/configure.ac b/configure.ac +index 764a08f..c05c5fb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -939,6 +939,13 @@ if test "$cross_compiling" = yes; then + RUNSHARED= + fi + ++# sysroot ++AC_SUBST(SYSROOT) ++if test "$cross_compiling" = yes; then ++ AC_MSG_CHECKING([for SYSROOT]) ++ AC_MSG_RESULT([$SYSROOT]) ++fi ++ + AC_MSG_RESULT($LDLIBRARY) + + AC_PROG_RANLIB diff --git a/patches/Python-2.7.5/0007-python-don-t-add-rpaths-in-setup.py.patch b/patches/Python-2.7.5/0007-python-don-t-add-rpaths-in-setup.py.patch new file mode 100644 index 0000000..fef8858 --- /dev/null +++ b/patches/Python-2.7.5/0007-python-don-t-add-rpaths-in-setup.py.patch @@ -0,0 +1,31 @@ +From: unknown author +Date: Tue, 8 Feb 2011 15:10:31 +0100 +Subject: [PATCH] python: don't add rpaths in setup.py + +We don't add rpaths. + +Signed-off-by: Michael Olbrich +--- + setup.py | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/setup.py b/setup.py +index c556209..66a97bd 100644 +--- a/setup.py ++++ b/setup.py +@@ -1077,7 +1077,6 @@ class PyBuildExt(build_ext): + exts.append(Extension('_bsddb', ['_bsddb.c'], + depends = ['bsddb.h'], + library_dirs=dblib_dir, +- runtime_library_dirs=dblib_dir, + include_dirs=db_incs, + libraries=dblibs)) + else: +@@ -1187,7 +1186,6 @@ class PyBuildExt(build_ext): + include_dirs=["Modules/_sqlite", + sqlite_incdir], + library_dirs=sqlite_libdir, +- runtime_library_dirs=sqlite_libdir, + extra_link_args=sqlite_extra_link_args, + libraries=["sqlite3",])) + else: diff --git a/patches/Python-2.7.5/0008-add-more-search-paths.patch b/patches/Python-2.7.5/0008-add-more-search-paths.patch new file mode 100644 index 0000000..f160ac6 --- /dev/null +++ b/patches/Python-2.7.5/0008-add-more-search-paths.patch @@ -0,0 +1,28 @@ +From: Michael Olbrich +Date: Thu, 13 Jun 2013 10:42:58 +0200 +Subject: [PATCH] add more search paths + +Without this setup.py won't find libs in /lib + +Signed-off-by: Michael Olbrich +--- + setup.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index 66a97bd..7bd9e9c 100644 +--- a/setup.py ++++ b/setup.py +@@ -484,8 +484,10 @@ class PyBuildExt(build_ext): + # (PYTHONFRAMEWORK is set) to avoid # linking problems when + # building a framework with different architectures than + # the one that is currently installed (issue #7473) +- add_dir_to_list(self.compiler.library_dirs, +- sysconfig.get_config_var("LIBDIR")) ++ libdir = sysconfig.get_config_var("LIBDIR") ++ add_dir_to_list(self.compiler.library_dirs, libdir) ++ if libdir.endswith('/usr/lib'): ++ add_dir_to_list(self.compiler.library_dirs, libdir.replace('/usr/lib','/lib')) + add_dir_to_list(self.compiler.include_dirs, + sysconfig.get_config_var("INCLUDEDIR")) + diff --git a/patches/Python-2.7.5/autogen.sh b/patches/Python-2.7.5/autogen.sh new file mode 100755 index 0000000..903ce78 --- /dev/null +++ b/patches/Python-2.7.5/autogen.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# to add config.guess and config.sub +automake --copy --add-missing || true + +autoheader --force + +autoconf \ + --force \ + --warnings=cross \ + --warnings=syntax \ + --warnings=obsolete \ + --warnings=unsupported + diff --git a/patches/Python-2.7.5/series b/patches/Python-2.7.5/series new file mode 100644 index 0000000..32cca28 --- /dev/null +++ b/patches/Python-2.7.5/series @@ -0,0 +1,11 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-Add-support-for-socketcan-to-the-python-socket-modul.patch +0002-use-AC_CHECK_SIZEOF-rather-than-AC_TRY_COMPILE-for-l.patch +0003-use-AC_TYPE_LONG_DOUBLE-to-detect-long-double-suppor.patch +0004-use-PGEN_FOR_BUILD.patch +0005-setup.py-don-t-leak-host-path-into-cross-compilation.patch +0006-add-cross-compilation-support.patch +0007-python-don-t-add-rpaths-in-setup.py.patch +0008-add-more-search-paths.patch +# 411ac5f396ebdb4609a70a104096cc59 - git-ptx-patches magic diff --git a/patches/at-3.1.12/autogen.sh b/patches/at-3.1.12/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/at-3.1.12/autogen.sh +++ b/patches/at-3.1.12/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/audiofile-0.3.4/autogen.sh b/patches/audiofile-0.3.4/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/audiofile-0.3.4/autogen.sh +++ b/patches/audiofile-0.3.4/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/aumix-2.9.1/autogen.sh b/patches/aumix-2.9.1/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/aumix-2.9.1/autogen.sh +++ b/patches/aumix-2.9.1/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/bridge-utils-1.5/autogen.sh b/patches/bridge-utils-1.5/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/bridge-utils-1.5/autogen.sh +++ b/patches/bridge-utils-1.5/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/busybox-1.20.2/0001-include-sys-resource.h-where-needed.patch b/patches/busybox-1.20.2/0001-include-sys-resource.h-where-needed.patch deleted file mode 100644 index 1f9431f..0000000 --- a/patches/busybox-1.20.2/0001-include-sys-resource.h-where-needed.patch +++ /dev/null @@ -1,103 +0,0 @@ -From: Mike Frysinger -Date: Thu, 5 Jul 2012 23:19:09 -0400 -Subject: [PATCH] include sys/resource.h where needed - -We use functions from sys/resource.h in misc applets, but don't include -the header. This breaks building with newer glibc versions, so add the -include where needed. - -Signed-off-by: Mike Frysinger ---- - loginutils/passwd.c | 1 + - miscutils/time.c | 1 + - networking/inetd.c | 1 + - networking/ntpd.c | 1 + - networking/ntpd_simple.c | 1 + - runit/chpst.c | 1 + - shell/shell_common.c | 1 + - 7 files changed, 7 insertions(+) - -diff --git a/loginutils/passwd.c b/loginutils/passwd.c -index b83db00..a7006f0 100644 ---- a/loginutils/passwd.c -+++ b/loginutils/passwd.c -@@ -15,6 +15,7 @@ - - #include "libbb.h" - #include -+#include /* setrlimit */ - - static void nuke_str(char *str) - { -diff --git a/miscutils/time.c b/miscutils/time.c -index 945f15f..ffed386 100644 ---- a/miscutils/time.c -+++ b/miscutils/time.c -@@ -16,6 +16,7 @@ - //usage: "\n -v Verbose" - - #include "libbb.h" -+#include /* getrusage */ - - /* Information on the resources used by a child process. */ - typedef struct { -diff --git a/networking/inetd.c b/networking/inetd.c -index 26b6699..a872ee7 100644 ---- a/networking/inetd.c -+++ b/networking/inetd.c -@@ -165,6 +165,7 @@ - //usage: "\n (default: 0 - disabled)" - - #include -+#include /* setrlimit */ - #include - - #include "libbb.h" -diff --git a/networking/ntpd.c b/networking/ntpd.c -index 603801e..b885215 100644 ---- a/networking/ntpd.c -+++ b/networking/ntpd.c -@@ -46,6 +46,7 @@ - #include "libbb.h" - #include - #include /* For IPTOS_LOWDELAY definition */ -+#include /* setpriority */ - #include - #ifndef IPTOS_LOWDELAY - # define IPTOS_LOWDELAY 0x10 -diff --git a/networking/ntpd_simple.c b/networking/ntpd_simple.c -index 4ad44e4..1b7c66b 100644 ---- a/networking/ntpd_simple.c -+++ b/networking/ntpd_simple.c -@@ -7,6 +7,7 @@ - */ - #include "libbb.h" - #include /* For IPTOS_LOWDELAY definition */ -+#include /* setpriority */ - #ifndef IPTOS_LOWDELAY - # define IPTOS_LOWDELAY 0x10 - #endif -diff --git a/runit/chpst.c b/runit/chpst.c -index ac296ba..ed72c8b 100644 ---- a/runit/chpst.c -+++ b/runit/chpst.c -@@ -91,6 +91,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //usage: "\n a SIGXCPU after N seconds" - - #include "libbb.h" -+#include /* getrlimit */ - - /* - Five applets here: chpst, envdir, envuidgid, setuidgid, softlimit. -diff --git a/shell/shell_common.c b/shell/shell_common.c -index 51c92d6..780e27e 100644 ---- a/shell/shell_common.c -+++ b/shell/shell_common.c -@@ -18,6 +18,7 @@ - */ - #include "libbb.h" - #include "shell_common.h" -+#include /* getrlimit */ - - const char defifsvar[] ALIGN1 = "IFS= \t\n"; - diff --git a/patches/busybox-1.20.2/0002-build-system-use-pkg-config-to-look-up-selinux-libs.patch b/patches/busybox-1.20.2/0002-build-system-use-pkg-config-to-look-up-selinux-libs.patch deleted file mode 100644 index 6dd977d..0000000 --- a/patches/busybox-1.20.2/0002-build-system-use-pkg-config-to-look-up-selinux-libs.patch +++ /dev/null @@ -1,63 +0,0 @@ -From: Mike Frysinger -Date: Sat, 20 Oct 2012 15:01:26 -0400 -Subject: [PATCH] build system: use pkg-config to look up selinux libs - -Newer versions of libselinux has started linking against more libs. -Rather than continuing hardcoding things, switch to using pkg-config -to query for its dependencies. - -Signed-off-by: Mike Frysinger ---- - Makefile | 1 + - Makefile.flags | 12 +++++++++++- - 2 files changed, 12 insertions(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index fccde4a..3a0a5e1 100644 ---- a/Makefile -+++ b/Makefile -@@ -297,6 +297,7 @@ NM = $(CROSS_COMPILE)nm - STRIP = $(CROSS_COMPILE)strip - OBJCOPY = $(CROSS_COMPILE)objcopy - OBJDUMP = $(CROSS_COMPILE)objdump -+PKG_CONFIG ?= $(CROSS_COMPILE)pkg-config - AWK = awk - GENKSYMS = scripts/genksyms/genksyms - DEPMOD = /sbin/depmod -diff --git a/Makefile.flags b/Makefile.flags -index c43c8dc..15dcc1f 100644 ---- a/Makefile.flags -+++ b/Makefile.flags -@@ -74,6 +74,12 @@ ARCH_FPIC ?= -fpic - ARCH_FPIE ?= -fpie - ARCH_PIE ?= -pie - -+# Usage: $(eval $(call pkg_check_modules,VARIABLE-PREFIX,MODULES)) -+define pkg_check_modules -+$(1)_CFLAGS := $(shell $(PKG_CONFIG) $(PKG_CONFIG_FLAGS) --cflags $(2)) -+$(1)_LIBS := $(shell $(PKG_CONFIG) $(PKG_CONFIG_FLAGS) --libs $(2)) -+endef -+ - ifeq ($(CONFIG_BUILD_LIBBUSYBOX),y) - # on i386: 14% smaller libbusybox.so - # (code itself is 9% bigger, we save on relocs/PLT/GOT) -@@ -85,6 +91,7 @@ endif - - ifeq ($(CONFIG_STATIC),y) - CFLAGS_busybox += -static -+PKG_CONFIG_FLAGS += --static - endif - - ifeq ($(CONFIG_PIE),y) -@@ -127,7 +134,10 @@ LDLIBS += pam pam_misc pthread - endif - - ifeq ($(CONFIG_SELINUX),y) --LDLIBS += selinux sepol -+SELINUX_PC_MODULES = libselinux libsepol -+$(eval $(call pkg_check_modules,SELINUX,$(SELINUX_PC_MODULES))) -+CPPFLAGS += $(SELINUX_CFLAGS) -+LDLIBS += $(if $(SELINUX_LIBS),$(SELINUX_LIBS:-l%=%),$(SELINUX_PC_MODULES:lib%=%)) - endif - - ifeq ($(CONFIG_EFENCE),y) diff --git a/patches/busybox-1.20.2/0100-Fix-compilation-on-Darwin.patch b/patches/busybox-1.20.2/0100-Fix-compilation-on-Darwin.patch deleted file mode 100644 index a6a6d78..0000000 --- a/patches/busybox-1.20.2/0100-Fix-compilation-on-Darwin.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Bernhard Walle -Date: Wed, 13 Jun 2012 21:44:46 +0200 -Subject: [PATCH] Fix compilation on Darwin - -Upstream commit b83c9704128dd106071184e4b00335a3b8486857 [1] broke it. - -Signed-off-by: Bernhard Walle - -[1] http://git.busybox.net/busybox/commit/?id=b83c9704128dd106071184e4b00335a3b8486857 ---- - scripts/kconfig/mconf.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c -index d3f69f8..322fc89 100644 ---- a/scripts/kconfig/mconf.c -+++ b/scripts/kconfig/mconf.c -@@ -9,6 +9,7 @@ - */ - - #define _XOPEN_SOURCE 700 -+#define _DARWIN_C_SOURCE /* for SIGWINCH */ - - #include - #include diff --git a/patches/busybox-1.20.2/0101-get_linux_version_code-don-t-fail-on-Linux-version-s.patch b/patches/busybox-1.20.2/0101-get_linux_version_code-don-t-fail-on-Linux-version-s.patch deleted file mode 100644 index dca5505..0000000 --- a/patches/busybox-1.20.2/0101-get_linux_version_code-don-t-fail-on-Linux-version-s.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Andreas Oberritter -Date: Sat, 5 May 2012 17:47:23 +0200 -Subject: [PATCH] get_linux_version_code: don't fail on Linux version strints - like "3.0-foo" - -Signed-off-by: Andreas Oberritter -Signed-off-by: Denys Vlasenko ---- - libbb/kernel_version.c | 11 ++++------- - 1 file changed, 4 insertions(+), 7 deletions(-) - -diff --git a/libbb/kernel_version.c b/libbb/kernel_version.c -index a168a1e..738ed02 100644 ---- a/libbb/kernel_version.c -+++ b/libbb/kernel_version.c -@@ -20,18 +20,15 @@ - int FAST_FUNC get_linux_version_code(void) - { - struct utsname name; -- char *s; -+ char *s, *t; - int i, r; - -- if (uname(&name) == -1) { -- bb_perror_msg("can't get system information"); -- return 0; -- } -- -+ uname(&name); /* never fails */ - s = name.release; - r = 0; - for (i = 0; i < 3; i++) { -- r = r * 256 + atoi(strtok(s, ".")); -+ t = strtok(s, "."); -+ r = r * 256 + (t ? atoi(t) : 0); - s = NULL; - } - return r; diff --git a/patches/busybox-1.20.2/0200-reactivate-check-for-tty.patch b/patches/busybox-1.21.0/0200-reactivate-check-for-tty.patch similarity index 96% rename from patches/busybox-1.20.2/0200-reactivate-check-for-tty.patch rename to patches/busybox-1.21.0/0200-reactivate-check-for-tty.patch index a44f6b6..5ed2bf0 100644 --- a/patches/busybox-1.20.2/0200-reactivate-check-for-tty.patch +++ b/patches/busybox-1.21.0/0200-reactivate-check-for-tty.patch @@ -10,7 +10,7 @@ This patch reactivates this feature. Signed-off-by: Marc Kleine-Budde --- - scripts/kconfig/conf.c | 2 +- + scripts/kconfig/conf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c diff --git a/patches/busybox-1.20.2/0201-Fix-the-format-warning-when-building-applets-usage_p.patch b/patches/busybox-1.21.0/0201-Fix-the-format-warning-when-building-applets-usage_p.patch similarity index 96% rename from patches/busybox-1.20.2/0201-Fix-the-format-warning-when-building-applets-usage_p.patch rename to patches/busybox-1.21.0/0201-Fix-the-format-warning-when-building-applets-usage_p.patch index 1622f10..67cd9be 100644 --- a/patches/busybox-1.20.2/0201-Fix-the-format-warning-when-building-applets-usage_p.patch +++ b/patches/busybox-1.21.0/0201-Fix-the-format-warning-when-building-applets-usage_p.patch @@ -12,7 +12,7 @@ applets/usage_pod.c:74:3: warning: format not a string literal and no format arg Signed-off-by: Dinny Wu --- - applets/usage_pod.c | 2 +- + applets/usage_pod.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applets/usage_pod.c b/applets/usage_pod.c diff --git a/patches/busybox-1.20.2/0202-build-system-only-pass-real-libs-to-SELINUX_LIBS.patch b/patches/busybox-1.21.0/0202-build-system-only-pass-real-libs-to-SELINUX_LIBS.patch similarity index 86% rename from patches/busybox-1.20.2/0202-build-system-only-pass-real-libs-to-SELINUX_LIBS.patch rename to patches/busybox-1.21.0/0202-build-system-only-pass-real-libs-to-SELINUX_LIBS.patch index 681aec5..257e62d 100644 --- a/patches/busybox-1.20.2/0202-build-system-only-pass-real-libs-to-SELINUX_LIBS.patch +++ b/patches/busybox-1.21.0/0202-build-system-only-pass-real-libs-to-SELINUX_LIBS.patch @@ -6,14 +6,14 @@ The busybox make system will fail otherwise. Signed-off-by: Marc Kleine-Budde --- - Makefile.flags | 1 + + Makefile.flags | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.flags b/Makefile.flags -index 15dcc1f..7b04b89 100644 +index 307afa7..d68c9c4 100644 --- a/Makefile.flags +++ b/Makefile.flags -@@ -137,6 +137,7 @@ ifeq ($(CONFIG_SELINUX),y) +@@ -141,6 +141,7 @@ ifeq ($(CONFIG_SELINUX),y) SELINUX_PC_MODULES = libselinux libsepol $(eval $(call pkg_check_modules,SELINUX,$(SELINUX_PC_MODULES))) CPPFLAGS += $(SELINUX_CFLAGS) diff --git a/patches/busybox-1.20.2/0203-scripts-trylink-honour-SKIP_STRIP-and-don-t-strip-if.patch b/patches/busybox-1.21.0/0203-scripts-trylink-honour-SKIP_STRIP-and-don-t-strip-if.patch similarity index 97% rename from patches/busybox-1.20.2/0203-scripts-trylink-honour-SKIP_STRIP-and-don-t-strip-if.patch rename to patches/busybox-1.21.0/0203-scripts-trylink-honour-SKIP_STRIP-and-don-t-strip-if.patch index ebd9790..5ebcdd5 100644 --- a/patches/busybox-1.20.2/0203-scripts-trylink-honour-SKIP_STRIP-and-don-t-strip-if.patch +++ b/patches/busybox-1.21.0/0203-scripts-trylink-honour-SKIP_STRIP-and-don-t-strip-if.patch @@ -5,7 +5,7 @@ Subject: [PATCH] scripts/trylink: honour SKIP_STRIP and don't strip if Signed-off-by: Marc Kleine-Budde --- - scripts/trylink | 17 ++++++++++++++--- + scripts/trylink | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/scripts/trylink b/scripts/trylink diff --git a/patches/busybox-1.20.2/series b/patches/busybox-1.21.0/series similarity index 58% rename from patches/busybox-1.20.2/series rename to patches/busybox-1.21.0/series index dcf9b4a..84c80aa 100644 --- a/patches/busybox-1.20.2/series +++ b/patches/busybox-1.21.0/series @@ -1,14 +1,10 @@ # generated by git-ptx-patches #tag:base --start-number 1 #tag:upstream-stable --start-number 1 -0001-include-sys-resource.h-where-needed.patch -0002-build-system-use-pkg-config-to-look-up-selinux-libs.patch #tag:upstream-master --start-number 100 -0100-Fix-compilation-on-Darwin.patch -0101-get_linux_version_code-don-t-fail-on-Linux-version-s.patch #tag:ptx --start-number 200 0200-reactivate-check-for-tty.patch 0201-Fix-the-format-warning-when-building-applets-usage_p.patch 0202-build-system-only-pass-real-libs-to-SELINUX_LIBS.patch 0203-scripts-trylink-honour-SKIP_STRIP-and-don-t-strip-if.patch -# 2544a24a902f6d5ec4e021d62cdce8eb - git-ptx-patches magic +# 0036b420b1a49106a872780e90251289 - git-ptx-patches magic diff --git a/patches/cgicc-3.2.9/autogen.sh b/patches/cgicc-3.2.9/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/cgicc-3.2.9/autogen.sh +++ b/patches/cgicc-3.2.9/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/comgt.0.32/0001-Fix-cross-compilation.patch b/patches/comgt.0.32/0001-Fix-cross-compilation.patch new file mode 100644 index 0000000..b8ea7aa --- /dev/null +++ b/patches/comgt.0.32/0001-Fix-cross-compilation.patch @@ -0,0 +1,22 @@ +From: Bernhard Walle +Date: Wed, 25 Jul 2012 17:35:00 +0200 +Subject: [PATCH] Fix cross compilation + +Signed-off-by: Bernhard Walle +--- + Makefile | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/Makefile b/Makefile +index 6028647..412a7b3 100755 +--- a/Makefile ++++ b/Makefile +@@ -72,8 +72,6 @@ clean: + + + comgt: comgt.o +- cc comgt.o $(LDFLAGS) -o comgt + + comgt.o: comgt.c comgt.h +- cc comgt.c $(CFLAGS) + diff --git a/patches/comgt.0.32/series b/patches/comgt.0.32/series new file mode 100644 index 0000000..c471dfc --- /dev/null +++ b/patches/comgt.0.32/series @@ -0,0 +1,4 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-Fix-cross-compilation.patch +# 42a9d69cd806f97d2b9a444234c6afa5 - git-ptx-patches magic diff --git a/patches/cppunit-1.12.1/autogen.sh b/patches/cppunit-1.12.1/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/cppunit-1.12.1/autogen.sh +++ b/patches/cppunit-1.12.1/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/crda-1.1.2/0001-Pregenerate-keys-ssl.c.patch b/patches/crda-1.1.3/0001-Pregenerate-keys-ssl.c.patch similarity index 100% rename from patches/crda-1.1.2/0001-Pregenerate-keys-ssl.c.patch rename to patches/crda-1.1.3/0001-Pregenerate-keys-ssl.c.patch diff --git a/patches/crda-1.1.2/series b/patches/crda-1.1.3/series similarity index 100% rename from patches/crda-1.1.2/series rename to patches/crda-1.1.3/series diff --git a/patches/dropbear-2012.55/0001-Fix-build-on-Darwin.patch b/patches/dropbear-2013.56/0001-Fix-build-on-Darwin.patch similarity index 95% rename from patches/dropbear-2012.55/0001-Fix-build-on-Darwin.patch rename to patches/dropbear-2013.56/0001-Fix-build-on-Darwin.patch index bc0d210..18756c5 100644 --- a/patches/dropbear-2012.55/0001-Fix-build-on-Darwin.patch +++ b/patches/dropbear-2013.56/0001-Fix-build-on-Darwin.patch @@ -1,4 +1,3 @@ -From e96df81ee2364f45724ef91389a5633337216214 Mon Sep 17 00:00:00 2001 From: Bernhard Walle Date: Tue, 20 Mar 2012 08:28:57 +0100 Subject: [PATCH] Fix build on Darwin diff --git a/patches/dropbear-2012.55/series b/patches/dropbear-2013.56/series similarity index 100% rename from patches/dropbear-2012.55/series rename to patches/dropbear-2013.56/series diff --git a/patches/eggdbus-0.6/autogen.sh b/patches/eggdbus-0.6/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/eggdbus-0.6/autogen.sh +++ b/patches/eggdbus-0.6/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/evtest-1.25/autogen.sh b/patches/evtest-1.25/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/evtest-1.25/autogen.sh +++ b/patches/evtest-1.25/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/fam-2.7.0/autogen.sh b/patches/fam-2.7.0/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/fam-2.7.0/autogen.sh +++ b/patches/fam-2.7.0/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/fcgi-2.4.0/autogen.sh b/patches/fcgi-2.4.0/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/fcgi-2.4.0/autogen.sh +++ b/patches/fcgi-2.4.0/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/flup-1.0.2/0001-support-python2.7.patch b/patches/flup-1.0.2/0001-support-python2.7.patch new file mode 100644 index 0000000..2a2ee16 --- /dev/null +++ b/patches/flup-1.0.2/0001-support-python2.7.patch @@ -0,0 +1,31 @@ +From: Michael Olbrich +Date: Wed, 12 Jun 2013 21:03:22 +0200 +Subject: [PATCH] support python2.7 + +Signed-off-by: Michael Olbrich +--- + ez_setup.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/ez_setup.py b/ez_setup.py +index d24e845..b48fc0b 100644 +--- a/ez_setup.py ++++ b/ez_setup.py +@@ -14,7 +14,7 @@ the appropriate options to ``use_setuptools()``. + This file can also be run as a script to install or upgrade setuptools. + """ + import sys +-DEFAULT_VERSION = "0.6c9" ++DEFAULT_VERSION = "0.6c11" + DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] + + md5_data = { +@@ -52,6 +52,8 @@ md5_data = { + 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', + 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', + 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', ++ 'setuptools-0.6c11-py2.7.egg': 'fe1f997bc722265116870bc7919059ea', ++ + } + + import sys, os diff --git a/patches/flup-1.0.2/autogen.sh b/patches/flup-1.0.2/autogen.sh index e4fd0fa..71b2e73 100755 --- a/patches/flup-1.0.2/autogen.sh +++ b/patches/flup-1.0.2/autogen.sh @@ -1,4 +1,4 @@ #!/bin/bash -cp patches/setuptools-0.6c9-py2.6.egg . +cp patches/setuptools-0.6c11-py2.7.egg . diff --git a/patches/flup-1.0.2/series b/patches/flup-1.0.2/series new file mode 100644 index 0000000..b90762f --- /dev/null +++ b/patches/flup-1.0.2/series @@ -0,0 +1,4 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-support-python2.7.patch +# 38422a23875f4810b966c4154441dc57 - git-ptx-patches magic diff --git a/patches/flup-1.0.2/setuptools-0.6c11-py2.7.egg b/patches/flup-1.0.2/setuptools-0.6c11-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..8a51424a41f5fcf57b66f73c7ae9af5e931d2257 GIT binary patch literal 332005 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�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%0DE*tq%`GAqJ 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 I+lM9p59+_GKmY&$ literal 0 HcmV?d00001 diff --git a/patches/fontconfig-2.6.0/autogen.sh b/patches/fontconfig-2.6.0/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/fontconfig-2.6.0/autogen.sh +++ b/patches/fontconfig-2.6.0/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/glademm-2.6.0/autogen.sh b/patches/glademm-2.6.0/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/glademm-2.6.0/autogen.sh +++ b/patches/glademm-2.6.0/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/glib-2.34.3/autogen.sh b/patches/glib-2.34.3/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/glib-2.34.3/autogen.sh +++ b/patches/glib-2.34.3/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/gnuplot-4.4.3/0001-gnuplot-build-documentation-generator-tools-with-CC_.patch b/patches/gnuplot-4.4.3/0001-gnuplot-build-documentation-generator-tools-with-CC_.patch deleted file mode 100644 index cbc130b..0000000 --- a/patches/gnuplot-4.4.3/0001-gnuplot-build-documentation-generator-tools-with-CC_.patch +++ /dev/null @@ -1,99 +0,0 @@ -From: Robert Schwebel -Date: Wed, 12 Oct 2011 15:29:54 +0200 -Subject: [PATCH] gnuplot: build documentation generator tools with - CC_FOR_BUILD - -When cross compiling gnuplot, it tries to build the documentation -generation tools in docs/ with the cross compiler, not with -CC_FOR_BUILD. - -Signed-off-by: Robert Schwebel ---- -# 20091222 rsc: https://sourceforge.net/tracker/?func=detail&aid=2918992&group_id=2055&atid=302055 - - configure.in | 42 ++++++++++++++++++++++++++++++++++++++++++ - docs/Makefile.in | 4 ++-- - 2 files changed, 44 insertions(+), 2 deletions(-) - -diff --git a/configure.in b/configure.in -index 655217b..c6278d2 100755 ---- a/configure.in -+++ b/configure.in -@@ -10,6 +10,8 @@ AC_PREREQ(2.58) - AM_CONFIG_HEADER(config.h:config.hin) - AM_INIT_AUTOMAKE(1.7.9) - -+AM_MAINTAINER_MODE -+ - VERSION_MAJOR="`cat $srcdir/VERSION`" - PATCHLEVEL="`cat $srcdir/PATCHLEVEL`" - -@@ -26,6 +28,46 @@ AC_C_INLINE - AC_C_STRINGIZE - AC_PROG_LN_S - -+ -+if test "${build}" != "${host}" -+then -+ CC=${CC-${host_alias}-gcc} -+ CFLAGS=${CFLAGS-"-g -O2"} -+ CXX=${CXX-${host_alias}-c++} -+ CXXFLAGS=${CXXFLAGS-"-g -O2"} -+ CC_FOR_BUILD=${CC_FOR_BUILD-gcc} -+else -+ CC_FOR_BUILD="\$(CC)" -+ AC_PROG_CC -+ -+ # We must set the default linker to the linker used by gcc for the correct -+ # operation of libtool. If LD is not defined and we are using gcc, try to -+ # set the LD default to the ld used by gcc. -+ if test -z "$LD" -+ then -+ if test "$GCC" = yes -+ then -+ case $build in -+ *-*-mingw*) -+ gcc_prog_ld=`$CC -print-prog-name=ld 2>&1 | tr -d '\015'` ;; -+ *) -+ gcc_prog_ld=`$CC -print-prog-name=ld 2>&1` ;; -+ esac -+ case $gcc_prog_ld in -+ # Accept absolute paths. -+ [[\\/]* | [A-Za-z]:[\\/]*)] -+ LD="$gcc_prog_ld" ;; -+ esac -+ fi -+ fi -+ -+ CXX=${CXX-"c++"} -+ CFLAGS=${CFLAGS-"-g -O2"} -+ CXXFLAGS=${CXXFLAGS-"-g -O2"} -+fi -+AC_SUBST(CC_FOR_BUILD) -+ -+ - dnl Various programs - dnl X/Emacs for building lisp packages and creating .texi version of docs - # If set to t, that means we are running in a shell under Emacs. -diff --git a/docs/Makefile.in b/docs/Makefile.in -index 51ebe6b..591d818 100644 ---- a/docs/Makefile.in -+++ b/docs/Makefile.in -@@ -70,7 +70,7 @@ POST_UNINSTALL = : - - INFO_DEPS = $(srcdir)/gnuplot.info - --CC = @CC@ -+CC = @CC_FOR_BUILD@ - CPP = @CPP@ - DEFS = @DEFS@ - DEFAULT_INCLUDES = -I. -I$(srcdir) -I.. -I$(top_builddir) -@@ -79,7 +79,7 @@ CFLAGS = @CFLAGS@ - GIHDIR = @GIHDIR@ - INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/term - LDFLAGS = @LDFLAGS@ --LIBS = @LIBS@ -+LIBS = - - COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) - CCLD = $(CC) diff --git a/patches/gnuplot-4.4.3/series b/patches/gnuplot-4.4.3/series deleted file mode 100644 index 585745c..0000000 --- a/patches/gnuplot-4.4.3/series +++ /dev/null @@ -1,5 +0,0 @@ -# generated by git-ptx-patches -#tag:base --start-number 1 -0001-gnuplot-build-documentation-generator-tools-with-CC_.patch -0002-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch -# ffd95c4575ca3e3194e093f925705906 - git-ptx-patches magic diff --git a/patches/gnuplot-4.4.3/0002-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch b/patches/gnuplot-4.6.2/0001-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch similarity index 86% rename from patches/gnuplot-4.4.3/0002-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch rename to patches/gnuplot-4.6.2/0001-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch index 968eaf8..c3ba691 100644 --- a/patches/gnuplot-4.4.3/0002-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch +++ b/patches/gnuplot-4.6.2/0001-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch @@ -12,14 +12,14 @@ don't also need special LDFLAGS. Omit them. Signed-off-by: Bernhard Walle --- - docs/Makefile.in | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) + docs/Makefile.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile.in b/docs/Makefile.in -index 591d818..0e2ef8f 100644 +index 0560553..628c006 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in -@@ -83,7 +83,7 @@ LIBS = +@@ -85,7 +85,7 @@ LIBS = @LIBS@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) CCLD = $(CC) diff --git a/patches/gnuplot-4.6.2/0002-Don-t-build-and-install-info-pages.patch b/patches/gnuplot-4.6.2/0002-Don-t-build-and-install-info-pages.patch new file mode 100644 index 0000000..3291116 --- /dev/null +++ b/patches/gnuplot-4.6.2/0002-Don-t-build-and-install-info-pages.patch @@ -0,0 +1,31 @@ +From: Bernhard Walle +Date: Sat, 23 Mar 2013 18:50:38 +0100 +Subject: [PATCH] Don't build and install info pages + +With GNU texinfo 5.1 I get following error: + + ./gnuplot.texi:9205: warning: @ref should not appear in @uref + ./gnuplot.texi:17653: raising the section level of @subsubsection which is too low + +Since the texinfo file is generated by some Emacs Lisp script (and my +keyboard doesn't have enough brackets to program Lisp) and since the +texinfo file is not needed on the target, just disable its build. + +Signed-off-by: Bernhard Walle +--- + docs/Makefile.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/docs/Makefile.in b/docs/Makefile.in +index 628c006..dc731d6 100644 +--- a/docs/Makefile.in ++++ b/docs/Makefile.in +@@ -449,7 +449,7 @@ checkdoc.o: checkdoc.c $(BUILT_SOURCES) + $(COMPILE) -DALL_TERM_DOC -c $(srcdir)/checkdoc.c + + # install section +-install: install-gih install-info install-pdf ++install: install-gih + + install-gih: gnuplot.gih + $(top_srcdir)/mkinstalldirs $(DESTDIR)$(GIHDIR) diff --git a/patches/gnuplot-4.6.2/series b/patches/gnuplot-4.6.2/series new file mode 100644 index 0000000..cd19e38 --- /dev/null +++ b/patches/gnuplot-4.6.2/series @@ -0,0 +1,5 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-Don-t-use-LDFLAGS-when-building-the-documentation-ge.patch +0002-Don-t-build-and-install-info-pages.patch +# 1692ae53011b545d0969e00025d9b2b4 - git-ptx-patches magic diff --git a/patches/grub-0.97/autogen.sh b/patches/grub-0.97/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/grub-0.97/autogen.sh +++ b/patches/grub-0.97/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/gst-plugins-bad-1.0.8/0001-remove-endianness-swapping.patch b/patches/gst-plugins-bad-1.0.8/0001-remove-endianness-swapping.patch new file mode 100644 index 0000000..d9a018d --- /dev/null +++ b/patches/gst-plugins-bad-1.0.8/0001-remove-endianness-swapping.patch @@ -0,0 +1,42 @@ +From: Luotao Fu +Date: Thu, 11 Dec 2008 11:57:48 +0100 +Subject: [PATCH] remove endianness swapping + + Swapping r- g- and bmask here is weird. It turns i.E. RGB888 to BGR888. For + formats like RGB666 it turns the mask into a mess. Seems that gstreamer + treat all True color as Big Endian. Still I doubt that it makes sense to + swap the masks. I'm however not quite sure about this, comments are highly + welcome. + +Signed-off-by: Luotao Fu +--- + sys/fbdev/gstfbdevsink.c | 14 +------------- + 1 file changed, 1 insertion(+), 13 deletions(-) + +diff --git a/sys/fbdev/gstfbdevsink.c b/sys/fbdev/gstfbdevsink.c +index 639641d..6d06801 100644 +--- a/sys/fbdev/gstfbdevsink.c ++++ b/sys/fbdev/gstfbdevsink.c +@@ -153,21 +153,9 @@ gst_fbdevsink_getcaps (GstBaseSink * bsink) + + switch (fbdevsink->varinfo.bits_per_pixel) { + case 32: +- /* swap endian of masks */ +- rmask = swapendian (rmask); +- gmask = swapendian (gmask); +- bmask = swapendian (bmask); ++ case 24: + endianness = 4321; + break; +- case 24:{ +- /* swap red and blue masks */ +- uint32_t t = rmask; +- +- rmask = bmask; +- bmask = t; +- endianness = 4321; +- break; +- } + case 15: + case 16: + endianness = 1234; diff --git a/patches/gst-plugins-bad-1.0.8/0002-add-rgb666-support.patch b/patches/gst-plugins-bad-1.0.8/0002-add-rgb666-support.patch new file mode 100644 index 0000000..c67a51d --- /dev/null +++ b/patches/gst-plugins-bad-1.0.8/0002-add-rgb666-support.patch @@ -0,0 +1,49 @@ +From: Luotao Fu +Date: Thu, 11 Dec 2008 12:03:59 +0100 +Subject: [PATCH] add rgb666 support + + This one adds support for rgb666 to fbdevsink. It's an exotic format, but still + can be found on especially some embedded devices. The Modelines are taken + directly from video.h of the video plugin, which is included by gstdevsink. + It'd probably be cleaner to split this in a separate patch for plugins-base. + I put the stuffs together for now for easier review. Patches for some sources + with rgb666 capability are coming soon. + +Signed-off-by: Luotao Fu +--- + sys/fbdev/gstfbdevsink.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/sys/fbdev/gstfbdevsink.c b/sys/fbdev/gstfbdevsink.c +index 6d06801..c181d94 100644 +--- a/sys/fbdev/gstfbdevsink.c ++++ b/sys/fbdev/gstfbdevsink.c +@@ -69,9 +69,28 @@ static GstCaps *gst_fbdevsink_getcaps (GstBaseSink * bsink); + + static GstVideoSinkClass *parent_class = NULL; + ++#define GST_VIDEO_BYTE1_MASK_18 "0x0003F000" ++#define GST_VIDEO_BYTE2_MASK_18 "0x00000FC0" ++#define GST_VIDEO_BYTE3_MASK_18 "0x0000003F" ++#define __GST_VIDEO_CAPS_MAKE_18(R, G, B) \ ++ "video/x-raw-rgb, " \ ++ "bpp = (int) 32, " \ ++ "depth = (int) 18, " \ ++ "endianness = (int) BIG_ENDIAN, " \ ++ "red_mask = (int) " GST_VIDEO_BYTE ## R ## _MASK_18 ", " \ ++ "green_mask = (int) " GST_VIDEO_BYTE ## G ## _MASK_18 ", " \ ++ "blue_mask = (int) " GST_VIDEO_BYTE ## B ## _MASK_18 ", " \ ++ "width = " GST_VIDEO_SIZE_RANGE ", " \ ++ "height = " GST_VIDEO_SIZE_RANGE ", " \ ++ "framerate = " GST_VIDEO_FPS_RANGE ++ ++#define GST_VIDEO_CAPS_RGB666 \ ++ __GST_VIDEO_CAPS_MAKE_18 (1, 2, 3) ++ + #define GST_FBDEV_TEMPLATE_CAPS \ + GST_VIDEO_CAPS_RGB_15 \ + ";" GST_VIDEO_CAPS_RGB_16 \ ++ ";" GST_VIDEO_CAPS_RGB666 \ + ";" GST_VIDEO_CAPS_BGR \ + ";" GST_VIDEO_CAPS_BGRx \ + ";" GST_VIDEO_CAPS_xBGR \ diff --git a/patches/gst-plugins-bad-1.0.8/series b/patches/gst-plugins-bad-1.0.8/series new file mode 100644 index 0000000..df79e0e --- /dev/null +++ b/patches/gst-plugins-bad-1.0.8/series @@ -0,0 +1,5 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-remove-endianness-swapping.patch +0002-add-rgb666-support.patch +# 1413e470cafaa03b8e10e20c4e57dbdc - git-ptx-patches magic diff --git a/patches/gst-plugins-base-0.11.3/autogen.sh b/patches/gst-plugins-base-0.11.3/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/gst-plugins-base-0.11.3/autogen.sh +++ b/patches/gst-plugins-base-0.11.3/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/ima-evm-utils-0.2/autogen.sh b/patches/ima-evm-utils-0.2/autogen.sh new file mode 120000 index 0000000..7c32d1a --- /dev/null +++ b/patches/ima-evm-utils-0.2/autogen.sh @@ -0,0 +1 @@ +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/inotify-tools-3.13/autogen.sh b/patches/inotify-tools-3.13/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/inotify-tools-3.13/autogen.sh +++ b/patches/inotify-tools-3.13/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/iozone3_327/autogen.sh b/patches/iozone3_327/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/iozone3_327/autogen.sh +++ b/patches/iozone3_327/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/iproute2-2.6.39/0001-remove-duplicate-limits.h.patch b/patches/iproute2-2.6.39/0001-remove-duplicate-limits.h.patch deleted file mode 100644 index f668ed2..0000000 --- a/patches/iproute2-2.6.39/0001-remove-duplicate-limits.h.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Robert Schwebel -Subject: [iproute2] remove duplicate header file - -This patch is already in upstream: - -From 52d6a850505d70a699fc89604986c45b0cd0c54e Mon Sep 17 00:00:00 2001 -From: Stephen Hemminger -Date: Fri, 27 Mar 2009 11:07:46 -0700 -Subject: [PATCH 03/23] remove duplicate limits.h - -Signed-off-by: Robert Schwebel - ---- - tc/m_xt.c | 1 - - 1 file changed, 1 deletion(-) - -Index: iproute2-2.6.39/tc/m_xt.c -=================================================================== ---- iproute2-2.6.39.orig/tc/m_xt.c -+++ iproute2-2.6.39/tc/m_xt.c -@@ -15,7 +15,6 @@ - #include - #include - #include --#include - #include - #include - #include diff --git a/patches/iproute2-2.6.39/0002-remove_arpd.diff b/patches/iproute2-2.6.39/0002-remove_arpd.diff deleted file mode 100644 index 1c2847b..0000000 --- a/patches/iproute2-2.6.39/0002-remove_arpd.diff +++ /dev/null @@ -1,48 +0,0 @@ -Subject: [iproute2] build system fixes -From: Juergen Beisert - -Build arpd only if the user has requested it. -Add a mechanism to feed in CPPFLAGS for cross builds. - -Signed-off-by: Juergen Beisert -Signed-off-by: Jon Ringle ---- - Makefile | 2 +- - misc/Makefile | 6 +++++- - 2 files changed, 6 insertions(+), 2 deletions(-) - -Jon Ringle: refreshed for iproute2-2.6.31 - -Index: iproute2-2.6.39/misc/Makefile -=================================================================== ---- iproute2-2.6.39.orig/misc/Makefile -+++ iproute2-2.6.39/misc/Makefile -@@ -1,10 +1,14 @@ - SSOBJ=ss.o ssfilter.o - LNSTATOBJ=lnstat.o lnstat_util.o - --TARGETS=ss nstat ifstat rtacct arpd lnstat -+TARGETS=ss nstat ifstat rtacct lnstat - - include ../Config - -+ifdef BUILD_ARPD -+TARGETS += arpd -+endif -+ - all: $(TARGETS) - - ss: $(SSOBJ) $(LIBUTIL) -Index: iproute2-2.6.39/Makefile -=================================================================== ---- iproute2-2.6.39.orig/Makefile -+++ iproute2-2.6.39/Makefile -@@ -30,7 +30,7 @@ ADDLIB+=ipx_ntop.o ipx_pton.o - CC = gcc - HOSTCC = gcc - CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall --CFLAGS = $(CCOPTS) -I../include $(DEFINES) -+CFLAGS = $(CROSS_CPPFLAGS) $(CCOPTS) -I../include $(DEFINES) - YACCFLAGS = -d -t -v - - SUBDIRS=lib ip tc misc netem genl diff --git a/patches/iproute2-2.6.39/series b/patches/iproute2-2.6.39/series deleted file mode 100644 index 94ffa3a..0000000 --- a/patches/iproute2-2.6.39/series +++ /dev/null @@ -1,2 +0,0 @@ -0001-remove-duplicate-limits.h.patch -0002-remove_arpd.diff diff --git a/patches/iproute2-3.9.0/0001-build-system-fixes.patch b/patches/iproute2-3.9.0/0001-build-system-fixes.patch new file mode 100644 index 0000000..df40efa --- /dev/null +++ b/patches/iproute2-3.9.0/0001-build-system-fixes.patch @@ -0,0 +1,33 @@ +From: Juergen Beisert +Date: Sun, 16 Jun 2013 11:17:42 +0200 +Subject: [PATCH] build system fixes + +Build arpd only if the user has requested it. +Add a mechanism to feed in CPPFLAGS for cross builds. + +Signed-off-by: Juergen Beisert +Signed-off-by: Jon Ringle +--- + misc/Makefile | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/misc/Makefile b/misc/Makefile +index a59ff87..4e65239 100644 +--- a/misc/Makefile ++++ b/misc/Makefile +@@ -1,10 +1,14 @@ + SSOBJ=ss.o ssfilter.o + LNSTATOBJ=lnstat.o lnstat_util.o + +-TARGETS=ss nstat ifstat rtacct arpd lnstat ++TARGETS=ss nstat ifstat rtacct lnstat + + include ../Config + ++ifdef BUILD_ARPD ++TARGETS += arpd ++endif ++ + all: $(TARGETS) + + ss: $(SSOBJ) diff --git a/patches/iproute2-3.9.0/series b/patches/iproute2-3.9.0/series new file mode 100644 index 0000000..630efcf --- /dev/null +++ b/patches/iproute2-3.9.0/series @@ -0,0 +1,4 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-build-system-fixes.patch +# 6bd4edb4380a1163a2e685e434917e83 - git-ptx-patches magic diff --git a/patches/json-c-0.10/0001-install_json_object_iterator-h.patch b/patches/json-c-0.10/0001-install_json_object_iterator-h.patch new file mode 100644 index 0000000..b7ee24b --- /dev/null +++ b/patches/json-c-0.10/0001-install_json_object_iterator-h.patch @@ -0,0 +1,21 @@ +From: Alexander Dahl +Date: Wed, 4 Sep 2013 14:27:48 +0200 +Subject: [PATCH] install_json_object_iterator-h + +one file missing in install +--- + Makefile.in | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/Makefile.in b/Makefile.in +index c06db3e..9d924cd 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -278,6 +278,7 @@ libjsoninclude_HEADERS = \ + json_config.h \ + json_inttypes.h \ + json_object.h \ ++ json_object_iterator.h \ + json_object_private.h \ + json_tokener.h \ + json_util.h \ diff --git a/patches/json-c-0.10/series b/patches/json-c-0.10/series new file mode 100644 index 0000000..af03814 --- /dev/null +++ b/patches/json-c-0.10/series @@ -0,0 +1,4 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-install_json_object_iterator-h.patch +# bd3f8eb56831c50153b31bbf75141353 - git-ptx-patches magic diff --git a/patches/kexec-tools-2.0.4/0001-kexec-ppc-elf-remove-bogus.patch b/patches/kexec-tools-2.0.4/0001-kexec-ppc-elf-remove-bogus.patch new file mode 100644 index 0000000..ca10747 --- /dev/null +++ b/patches/kexec-tools-2.0.4/0001-kexec-ppc-elf-remove-bogus.patch @@ -0,0 +1,28 @@ +From: Michael Olbrich +Date: Wed, 21 Aug 2013 10:44:22 +0200 +Subject: [PATCH] kexec: ppc: elf: remove bogus ';' + +Otherwise building may fail with: +[...] +kexec/arch/ppc/kexec-elf-ppc.c:45:24: error: expected ']' before ';' token +kexec/arch/ppc/kexec-elf-ppc.c:47:25: error: expected ']' before ';' token +[...] + +Signed-off-by: Michael Olbrich +--- + kexec/arch/ppc/kexec-elf-ppc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kexec/arch/ppc/kexec-elf-ppc.c b/kexec/arch/ppc/kexec-elf-ppc.c +index 65a65cc..abfe39d 100644 +--- a/kexec/arch/ppc/kexec-elf-ppc.c ++++ b/kexec/arch/ppc/kexec-elf-ppc.c +@@ -37,7 +37,7 @@ const char *ramdisk; + int create_flatten_tree(struct kexec_info *, unsigned char **, unsigned long *, + char *); + +-#define UPSZ(X) _ALIGN_UP(sizeof(X), 4); ++#define UPSZ(X) _ALIGN_UP(sizeof(X), 4) + #ifdef WITH_GAMECUBE + static struct boot_notes { + Elf_Bhdr hdr; diff --git a/patches/kexec-tools-2.0.4/series b/patches/kexec-tools-2.0.4/series new file mode 100644 index 0000000..b28a81a --- /dev/null +++ b/patches/kexec-tools-2.0.4/series @@ -0,0 +1,4 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-kexec-ppc-elf-remove-bogus.patch +# 0a9bd878430dd33d678ca77c5f043279 - git-ptx-patches magic diff --git a/patches/kmod-13/0001-missing-Don-t-call-syscall-with-syscallno-1.patch b/patches/kmod-13/0001-missing-Don-t-call-syscall-with-syscallno-1.patch new file mode 100644 index 0000000..a385d63 --- /dev/null +++ b/patches/kmod-13/0001-missing-Don-t-call-syscall-with-syscallno-1.patch @@ -0,0 +1,40 @@ +From: Lucas De Marchi +Date: Thu, 2 May 2013 13:22:57 -0300 +Subject: [PATCH] missing: Don't call syscall() with syscallno == -1 + +Reported-by: Jean-Francis Roy +Reported-by: Jan Luebbe +--- + libkmod/missing.h | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/libkmod/missing.h b/libkmod/missing.h +index edb88b9..b31af84 100644 +--- a/libkmod/missing.h ++++ b/libkmod/missing.h +@@ -1,5 +1,6 @@ + #pragma once + ++#include + #include + #include + +@@ -15,13 +16,14 @@ + # define MODULE_INIT_IGNORE_VERMAGIC 2 + #endif + +-#ifndef __NR_finit_module +-# define __NR_finit_module -1 +-#endif +- + #ifndef HAVE_FINIT_MODULE + static inline int finit_module(int fd, const char *uargs, int flags) + { ++#ifndef __NR_finit_module ++ errno = ENOSYS; ++ return -1; ++#else + return syscall(__NR_finit_module, fd, uargs, flags); ++#endif + } + #endif diff --git a/patches/kmod-13/series b/patches/kmod-13/series new file mode 100644 index 0000000..3fc301f --- /dev/null +++ b/patches/kmod-13/series @@ -0,0 +1,4 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-missing-Don-t-call-syscall-with-syscallno-1.patch +# 0b7413dd7632441bc24225859a7d1866 - git-ptx-patches magic diff --git a/patches/libdbus-c++-r9139/autogen.sh b/patches/libdbus-c++-r9139/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/libdbus-c++-r9139/autogen.sh +++ b/patches/libdbus-c++-r9139/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libdmtx-0.7.2/autogen.sh b/patches/libdmtx-0.7.2/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/libdmtx-0.7.2/autogen.sh +++ b/patches/libdmtx-0.7.2/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libffi-3.0.11/0001-fix-powerpc-case.patch b/patches/libffi-3.0.11/0001-fix-powerpc-case.patch deleted file mode 100644 index 4c5ce2c..0000000 --- a/patches/libffi-3.0.11/0001-fix-powerpc-case.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Robert Schwebel -Date: Thu, 14 Jun 2012 11:44:29 +0200 -Subject: [PATCH] libffi: fix duplicate case on powerpc 32 bit - -Without this fix, gcc complains about a duplicate case value: - -../src/powerpc/ffi.c: In function 'ffi_prep_cif_machdep': -../src/powerpc/ffi.c:670:5: error: duplicate case value -../src/powerpc/ffi.c:667:5: error: previously used here - -rsc: submitted as http://sourceware.org/ml/libffi-discuss/2012/msg00201.html - -Signed-off-by: Robert Schwebel ---- - src/powerpc/ffi.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/powerpc/ffi.c b/src/powerpc/ffi.c -index baca694..257f02f 100644 ---- a/src/powerpc/ffi.c -+++ b/src/powerpc/ffi.c -@@ -664,9 +664,11 @@ ffi_prep_cif_machdep (ffi_cif *cif) - switch (type) - { - #ifndef __NO_FPRS__ -+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ -+#endif - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ diff --git a/patches/libffi-3.0.11/autogen.sh b/patches/libffi-3.0.11/autogen.sh deleted file mode 100755 index 0244c91..0000000 --- a/patches/libffi-3.0.11/autogen.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e - -automake - diff --git a/patches/libffi-3.0.11/series b/patches/libffi-3.0.11/series deleted file mode 100644 index 08fb64c..0000000 --- a/patches/libffi-3.0.11/series +++ /dev/null @@ -1,5 +0,0 @@ -# generated by git-ptx-patches -#tag:base --start-number 1 -0001-fix-powerpc-case.patch -0002-install-header-files-to-includedir-and-adjust-libffi.patch -# 6a4e3935931e0b0433da3a0f41888342 - git-ptx-patches magic diff --git a/patches/libffi-3.0.11/0002-install-header-files-to-includedir-and-adjust-libffi.patch b/patches/libffi-3.0.13/0001-install-header-files-to-includedir-and-adjust-libffi.patch similarity index 94% rename from patches/libffi-3.0.11/0002-install-header-files-to-includedir-and-adjust-libffi.patch rename to patches/libffi-3.0.13/0001-install-header-files-to-includedir-and-adjust-libffi.patch index 71bb537..bc1bfcc 100644 --- a/patches/libffi-3.0.11/0002-install-header-files-to-includedir-and-adjust-libffi.patch +++ b/patches/libffi-3.0.13/0001-install-header-files-to-includedir-and-adjust-libffi.patch @@ -4,8 +4,8 @@ Subject: [PATCH] install header files to @includedir@ and adjust libffi.pc.in Signed-off-by: Jan Luebbe --- - include/Makefile.am | 2 +- - libffi.pc.in | 6 +++--- + include/Makefile.am | 2 +- + libffi.pc.in | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Makefile.am b/include/Makefile.am diff --git a/patches/libffi-3.0.13/autogen.sh b/patches/libffi-3.0.13/autogen.sh new file mode 120000 index 0000000..7c32d1a --- /dev/null +++ b/patches/libffi-3.0.13/autogen.sh @@ -0,0 +1 @@ +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libffi-3.0.13/series b/patches/libffi-3.0.13/series new file mode 100644 index 0000000..9b33d50 --- /dev/null +++ b/patches/libffi-3.0.13/series @@ -0,0 +1,4 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-install-header-files-to-includedir-and-adjust-libffi.patch +# 696c0d3147fe62cd23ca3cce21d7acb5 - git-ptx-patches magic diff --git a/patches/libical-0.46/autogen.sh b/patches/libical-0.46/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/libical-0.46/autogen.sh +++ b/patches/libical-0.46/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libmad-0.15.1b/autogen.sh b/patches/libmad-0.15.1b/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/libmad-0.15.1b/autogen.sh +++ b/patches/libmad-0.15.1b/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libmemcache-1.4.0.rc2/0001-use-cached-for-setsockopt-in-configure.ac.patch b/patches/libmemcache-1.4.0.rc2/0001-use-cached-for-setsockopt-in-configure.ac.patch new file mode 100644 index 0000000..aca28c5 --- /dev/null +++ b/patches/libmemcache-1.4.0.rc2/0001-use-cached-for-setsockopt-in-configure.ac.patch @@ -0,0 +1,80 @@ +From: George McCollister +Date: Wed, 17 Nov 2010 16:20:57 -0600 +Subject: [PATCH] use cached for setsockopt in configure.ac + +Use AC_CACHE_CHECK so we can pass in cached values in for setsockopt +checks. + +Signed-off-by: George McCollister +Signed-off-by: Marc Kleine-Budde +--- + configure.ac | 46 +++++++++++++++++++++++++--------------------- + 1 file changed, 25 insertions(+), 21 deletions(-) + +diff --git a/configure.ac b/configure.ac +index a1c8bf1..827e124 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -224,37 +224,41 @@ fi + dnl END debug CFLAGS + + AC_DEFUN([MCM_CHECK_SETSOCKOPT], [ +-AC_MSG_CHECKING(whether to use $1 with setsockopt()) +-AC_TRY_RUN([ ++ AC_CACHE_CHECK(whether to use $1 with setsockopt(), ac_cv_setsockopt_$1, [ ++ AC_TRY_RUN([ + #include + #include + #include + +-int +-main(void) { +- int s; +- struct timeval tv; +- tv.tv_sec = 3; +- tv.tv_usec = 0; ++ int ++ main(void) { ++ int s; ++ struct timeval tv; ++ tv.tv_sec = 3; ++ tv.tv_usec = 0; + + #ifndef $1 +- exit(3); ++ exit(3); + #else +- if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) +- exit(2); ++ if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) ++ exit(2); + +- /* fails on Solaris 2.6,8,9,10 and some Linuxes because +- SO_RCVTIMEO|SO_SNDTIMEO are defined but not implemented */ +- if (setsockopt(s, SOL_SOCKET, $1, (const void *)&tv, sizeof(tv)) == -1) +- exit(1); ++ /* fails on Solaris 2.6,8,9,10 and some Linuxes because ++ SO_RCVTIMEO|SO_SNDTIMEO are defined but not implemented */ ++ if (setsockopt(s, SOL_SOCKET, $1, (const void *)&tv, sizeof(tv)) == -1) ++ exit(1); + +- exit(0); ++ exit(0); + #endif +-} +-] +-, [ AC_MSG_RESULT([yes]) AC_DEFINE(USE_$1, 1, [Define to use $1 with setsockopt()]) ] +-, [ AC_MSG_RESULT([no]) ] +-) ++ } ++ ], ac_cv_setsockopt_$1=yes, ac_cv_setsockopt_$1=no) ++ ]) ++ if test $ac_cv_setsockopt_$1 = yes; then ++ result=1 ++ else ++ result=0 ++ fi ++ AC_DEFINE_UNQUOTED(USE_$1, [$result], [Define to use $1 with setsockopt()]) + ]) + + dnl check for SO_RCVTIMEO and SO_SNDTIMEO diff --git a/patches/libmemcache-1.4.0.rc2/0002-Add-required-files.patch b/patches/libmemcache-1.4.0.rc2/0002-Add-required-files.patch new file mode 100644 index 0000000..f507712 --- /dev/null +++ b/patches/libmemcache-1.4.0.rc2/0002-Add-required-files.patch @@ -0,0 +1,38 @@ +From: George McCollister +Date: Wed, 17 Nov 2010 16:20:57 -0600 +Subject: [PATCH] Add required files + +autotools complains if AUTHORS, NEWS and README are missing. + +Signed-off-by: George McCollister +Signed-off-by: Marc Kleine-Budde +--- + AUTHORS | 1 + + NEWS | 1 + + README | 1 + + 3 files changed, 3 insertions(+) + create mode 100644 AUTHORS + create mode 100644 NEWS + create mode 100644 README + +diff --git a/AUTHORS b/AUTHORS +new file mode 100644 +index 0000000..709e88f +--- /dev/null ++++ b/AUTHORS +@@ -0,0 +1 @@ ++This must be here. +diff --git a/NEWS b/NEWS +new file mode 100644 +index 0000000..709e88f +--- /dev/null ++++ b/NEWS +@@ -0,0 +1 @@ ++This must be here. +diff --git a/README b/README +new file mode 100644 +index 0000000..709e88f +--- /dev/null ++++ b/README +@@ -0,0 +1 @@ ++This must be here. diff --git a/patches/libmemcache-1.4.0.rc2/0003-Fix-PowerPC-issues-with-undefined-__USE_POSIX.patch b/patches/libmemcache-1.4.0.rc2/0003-Fix-PowerPC-issues-with-undefined-__USE_POSIX.patch new file mode 100644 index 0000000..f64cfdf --- /dev/null +++ b/patches/libmemcache-1.4.0.rc2/0003-Fix-PowerPC-issues-with-undefined-__USE_POSIX.patch @@ -0,0 +1,52 @@ +From: Michael Olbrich +Date: Fri, 24 Dec 2010 14:41:03 +0100 +Subject: [PATCH] Fix PowerPC issues with undefined __USE_POSIX + +Patch borrowed from Debian. + +Signed-off-by: Michael Olbrich +--- + include/memcache.h.in | 5 +++++ + src/memcache.c | 9 +++++++-- + 2 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/include/memcache.h.in b/include/memcache.h.in +index 2552b30..2b07a3d 100644 +--- a/include/memcache.h.in ++++ b/include/memcache.h.in +@@ -61,6 +61,11 @@ + #ifndef MEMCACHE_H + #define MEMCACHE_H + ++/* fix FTBFS on powerpc for Debian libmemcache */ ++#ifndef __USE_POSIX ++#define __USE_POSIX ++#endif ++ + #include + #include + #include +diff --git a/src/memcache.c b/src/memcache.c +index 227758d..79b9d37 100644 +--- a/src/memcache.c ++++ b/src/memcache.c +@@ -39,12 +39,17 @@ + #include + #include + #include +-#ifdef __linux ++ ++/* fix FTBFS on powerpc for Debian libmemcache. I personally think this ++ * shouldnt be the case, as Debian Bug#345587 seems to show. */ ++ ++/* #ifdef __linux */ + # ifndef __USE_POSIX + # define __USE_POSIX + #warning "Working around busted-ass Linux header include problems: use FreeBSD instead" + #warning "http://www.FreeBSD.org/ - you won't regret it" +-# endif ++/* #endif */ ++ + #endif + #include + #include diff --git a/patches/libmemcache-1.4.0.rc2/0004-remove-broken-inline.patch b/patches/libmemcache-1.4.0.rc2/0004-remove-broken-inline.patch new file mode 100644 index 0000000..778207b --- /dev/null +++ b/patches/libmemcache-1.4.0.rc2/0004-remove-broken-inline.patch @@ -0,0 +1,66 @@ +From: Michael Olbrich +Date: Thu, 22 Dec 2011 10:30:24 +0100 +Subject: [PATCH] remove broken inline + +Without this we may get something like this: + +[...]/libmemcache.so: undefined reference to `mcm_buf_len' +[...]/libmemcache.so: undefined reference to `mcm_buf_remain_off' + +Signed-off-by: Michael Olbrich +--- + include/memcache/buffer.h | 6 +++--- + src/buffer.c | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/include/memcache/buffer.h b/include/memcache/buffer.h +index 2205b23..d352377 100644 +--- a/include/memcache/buffer.h ++++ b/include/memcache/buffer.h +@@ -63,14 +63,14 @@ struct memcache_buf *mcm_buf_find_replace(struct memcache_ctxt *, struct memcach + struct memcache_buf *mcm_buf_find_replace2(struct memcache_ctxt *, struct memcache_buf *, + const char *, struct memcache_buf *); + int mcm_buf_free(struct memcache_ctxt *, struct memcache_buf **); +-inline u_int32_t mcm_buf_len(const struct memcache_ctxt *, const struct memcache_buf *); ++u_int32_t mcm_buf_len(const struct memcache_ctxt *, const struct memcache_buf *); + struct memcache_buf *mcm_buf_new(struct memcache_ctxt *); + struct memcache_buf *mcm_buf_new2(struct memcache_ctxt *, const char *, const u_int32_t); + struct memcache_buf *mcm_buf_new3(struct memcache_ctxt *, const char *); + size_t mcm_buf_read(struct memcache_ctxt *, struct memcache_buf *, int); + int mcm_buf_realloc(struct memcache_ctxt *, struct memcache_buf *, const u_int32_t); +-inline size_t mcm_buf_remain(const struct memcache_ctxt *, const struct memcache_buf *); +-inline size_t mcm_buf_remain_off(const struct memcache_ctxt *, const struct memcache_buf *); ++size_t mcm_buf_remain(const struct memcache_ctxt *, const struct memcache_buf *); ++size_t mcm_buf_remain_off(const struct memcache_ctxt *, const struct memcache_buf *); + int mcm_buf_replace(struct memcache_ctxt *, struct memcache_buf *, const char *, const u_int32_t); + int mcm_buf_replace2(struct memcache_ctxt *, struct memcache_buf *, const char *); + int mcm_buf_replace_buf(struct memcache_ctxt *, struct memcache_buf *, struct memcache_buf *); +diff --git a/src/buffer.c b/src/buffer.c +index 616307f..3934a7d 100644 +--- a/src/buffer.c ++++ b/src/buffer.c +@@ -259,7 +259,7 @@ mcm_buf_free(struct memcache_ctxt *ctxt, struct memcache_buf **buf) { + } + + +-inline u_int32_t ++u_int32_t + mcm_buf_len(const struct memcache_ctxt *ctxt, const struct memcache_buf *s) { + return s->len; + } +@@ -425,13 +425,13 @@ mcm_buf_realloc(struct memcache_ctxt *ctxt, struct memcache_buf *buf, const u_in + } + + +-inline size_t ++size_t + mcm_buf_remain(const struct memcache_ctxt *ctxt, const struct memcache_buf *buf) { + return mcm_buf_size(ctxt, buf) - mcm_buf_len(ctxt, buf); + } + + +-inline size_t ++size_t + mcm_buf_remain_off(const struct memcache_ctxt *ctxt, const struct memcache_buf *buf) { + return mcm_buf_len(ctxt, buf) - buf->off; + } diff --git a/patches/libmemcache-1.4.0.rc2/autogen.sh b/patches/libmemcache-1.4.0.rc2/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/libmemcache-1.4.0.rc2/autogen.sh +++ b/patches/libmemcache-1.4.0.rc2/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libmemcache-1.4.0.rc2/series b/patches/libmemcache-1.4.0.rc2/series index 2f039e7..2dd1309 100644 --- a/patches/libmemcache-1.4.0.rc2/series +++ b/patches/libmemcache-1.4.0.rc2/series @@ -1,8 +1,7 @@ # generated by git-ptx-patches #tag:base --start-number 1 -0001-autotools-update.patch -0002-use-cached-for-setsockopt-in-configure.ac.patch -0003-Add-required-files.patch -0004-Fix-PowerPC-issues-with-undefined-__USE_POSIX.patch -0005-remove-broken-inline.patch -# 682697d19a16b9efa9958ef3b7646e1f - git-ptx-patches magic +0001-use-cached-for-setsockopt-in-configure.ac.patch +0002-Add-required-files.patch +0003-Fix-PowerPC-issues-with-undefined-__USE_POSIX.patch +0004-remove-broken-inline.patch +# 353c9dd089cd2a48e4dade696dc68f78 - git-ptx-patches magic diff --git a/patches/libmemcached-0.44/autogen.sh b/patches/libmemcached-0.44/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/libmemcached-0.44/autogen.sh +++ b/patches/libmemcached-0.44/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libmng-1.0.10/autogen.sh b/patches/libmng-1.0.10/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/libmng-1.0.10/autogen.sh +++ b/patches/libmng-1.0.10/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libnet-1.1.4/autogen.sh b/patches/libnet-1.1.4/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/libnet-1.1.4/autogen.sh +++ b/patches/libnet-1.1.4/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/libpng-1.2.50/libpng_config_sysroot.diff b/patches/libpng-1.2.50/libpng_config_sysroot.diff new file mode 100644 index 0000000..984dbc8 --- /dev/null +++ b/patches/libpng-1.2.50/libpng_config_sysroot.diff @@ -0,0 +1,35 @@ +From: Marc Kleine-Budde +Subject: add SYSROOT handling to libpng-config + +Signed-off-by: Marc Kleine-Budde + +--- +# 20091229 rsc: added as https://sourceforge.net/tracker/?func=detail&aid=2922975&group_id=5624&atid=105624 + + scripts/libpng-config.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +Index: libpng-1.2.41/scripts/libpng-config.in +=================================================================== +--- libpng-1.2.41.orig/scripts/libpng-config.in ++++ libpng-1.2.41/scripts/libpng-config.in +@@ -18,8 +18,8 @@ libdir="@libdir@" + includedir="@includedir@/libpng@PNGLIB_MAJOR@@PNGLIB_MINOR@" + libs="-lpng@PNGLIB_MAJOR@@PNGLIB_MINOR@" + all_libs="-lpng@PNGLIB_MAJOR@@PNGLIB_MINOR@ @LIBS@" +-I_opts="-I${includedir}" +-L_opts="-L${libdir}" ++I_opts="-I${SYSROOT}${includedir}" ++L_opts="-L${SYSROOT}${libdir}" + R_opts="" + cppflags="" + ccopts="@LIBPNG_NO_MMX@" +@@ -59,7 +59,7 @@ while test $# -gt 0; do + case "$1" in + + --prefix) +- echo ${prefix} ++ echo ${SYSROOT}${prefix} + ;; + + --version) diff --git a/patches/libpng-1.2.50/series b/patches/libpng-1.2.50/series new file mode 100644 index 0000000..fdab521 --- /dev/null +++ b/patches/libpng-1.2.50/series @@ -0,0 +1 @@ +libpng_config_sysroot.diff diff --git a/patches/lmbench-3.0-a9/autogen.sh b/patches/lmbench-3.0-a9/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/lmbench-3.0-a9/autogen.sh +++ b/patches/lmbench-3.0-a9/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/lowpan-tools-0.3/0001-izoordinator-Fixes-to-error-handling.patch b/patches/lowpan-tools-0.3/0001-izoordinator-Fixes-to-error-handling.patch new file mode 100644 index 0000000..63ad5a9 --- /dev/null +++ b/patches/lowpan-tools-0.3/0001-izoordinator-Fixes-to-error-handling.patch @@ -0,0 +1,50 @@ +From 15032ab6d6e3e551e4ad86e61ea84ccbb8b62be0 Mon Sep 17 00:00:00 2001 +From: Alan Ott +Date: Thu, 5 Apr 2012 00:22:56 -0400 +Subject: [PATCH 1/7] izoordinator: Fixes to error handling + +Some of the error handling was checking for != 0 on functions which +return positive values on success. + +Signed-off-by: Alan Ott +--- + src/coordinator.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/src/coordinator.c b/src/coordinator.c +index a09633a..c139aae 100644 +--- a/src/coordinator.c ++++ b/src/coordinator.c +@@ -94,7 +94,8 @@ static int mlme_start(uint16_t short_addr, uint16_t pan, uint8_t channel, uint8_ + nla_put_u8(msg, IEEE802154_ATTR_COORD_REALIGN, 0); + #endif + int err = nl_send_auto_complete(nl, msg); +- log_msg_nl_perror("nl_send_auto_complete", err); ++ if (err < 0) ++ log_msg_nl_perror("nl_send_auto_complete", err); + return 0; + } + +@@ -129,7 +130,8 @@ static int coordinator_associate(struct genlmsghdr *ghdr, struct nlattr **attrs) + + int err = nl_send_auto_complete(nl, msg); + +- log_msg_nl_perror("nl_send_auto_complete", err); ++ if (err < 0) ++ log_msg_nl_perror("nl_send_auto_complete", err); + + return 0; + } +@@ -408,7 +410,8 @@ int main(int argc, char **argv) + log_msg_nl_perror("genl_connect", err); + + family = genl_ctrl_resolve(nl, IEEE802154_NL_NAME); +- log_msg_nl_perror("genl_ctrl_resolve", NLE_NOMEM); ++ if (family < 0) ++ log_msg_nl_perror("genl_ctrl_resolve", family); + + nl_socket_add_membership(nl, nl_get_multicast_id(nl, IEEE802154_NL_NAME, IEEE802154_MCAST_COORD_NAME)); + +-- +1.8.2.3 + diff --git a/patches/lowpan-tools-0.3/0002-addrdb-fix-include-dependency-and-remove-redefined.patch b/patches/lowpan-tools-0.3/0002-addrdb-fix-include-dependency-and-remove-redefined.patch new file mode 100644 index 0000000..c299a17 --- /dev/null +++ b/patches/lowpan-tools-0.3/0002-addrdb-fix-include-dependency-and-remove-redefined.patch @@ -0,0 +1,109 @@ +From eb4fa43ae3e2b5a3bdf35a7915af70805f891cb9 Mon Sep 17 00:00:00 2001 +From: Alexander Aring +Date: Fri, 21 Dec 2012 06:37:15 +0100 +Subject: [PATCH 2/7] addrdb: fix include dependency and remove redefined + +Currently I get this compile error: + +coord-config-parse.h:106:14: error: unknown type name 'yyscan_t' +coord-config-parse.y:38:0: error: "YYDEBUG" redefined [-Werror] + +"yyscan_t" is defined in parser.h but parser.h need a include from +coord-config-parse.h for "YYSTYPE". + +This patch removes typedef of "yyscan_t" from parser.h into new +file scanner.h. + +File coord-config-parse.y includes scanner.h at first so "yyscan_t" +is known. + +Remove redefined: +Move #define YYDEBUG 1 in coord-config-parse.y at first. Otherwise +it will be defined in generated coord-config-parse.h to 0. + +Tested with bison (GNU Bison) 2.7. + +Signed-off-by: Alexander Aring +--- + addrdb/coord-config-parse.y | 5 +++-- + addrdb/parser.h | 5 ----- + addrdb/scanner.h | 25 +++++++++++++++++++++++++ + 3 files changed, 28 insertions(+), 7 deletions(-) + create mode 100644 addrdb/scanner.h + +diff --git a/addrdb/coord-config-parse.y b/addrdb/coord-config-parse.y +index 6b0328b..2e10a88 100644 +--- a/addrdb/coord-config-parse.y ++++ b/addrdb/coord-config-parse.y +@@ -20,6 +20,8 @@ + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ ++ #define YYDEBUG 1 ++ + #include + #include + #include +@@ -32,11 +34,10 @@ + #include + #include + #include ++ #include "scanner.h" + #include "coord-config-parse.h" + #include "parser.h" + +- #define YYDEBUG 1 +- + static uint16_t short_addr; + static uint8_t hwaddr[8]; + static time_t mystamp; +diff --git a/addrdb/parser.h b/addrdb/parser.h +index 0f1b4d8..66e8f41 100644 +--- a/addrdb/parser.h ++++ b/addrdb/parser.h +@@ -22,11 +22,6 @@ + #ifndef PARSER_H + #define PARSER_H + +-#ifndef YY_TYPEDEF_YY_SCANNER_T +-#define YY_TYPEDEF_YY_SCANNER_T +-typedef void* yyscan_t; +-#endif +- + #ifndef YY_EXTRA_TYPE + #define YY_EXTRA_TYPE void * + #endif +diff --git a/addrdb/scanner.h b/addrdb/scanner.h +new file mode 100644 +index 0000000..11fc815 +--- /dev/null ++++ b/addrdb/scanner.h +@@ -0,0 +1,25 @@ ++/* ++ * Linux IEEE 802.15.4 userspace tools ++ * ++ * 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; version 2 of the License. ++ * ++ * 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 SCANNER_H ++#define SCANNER_H ++ ++#ifndef YY_TYPEDEF_YY_SCANNER_T ++#define YY_TYPEDEF_YY_SCANNER_T ++typedef void* yyscan_t; ++#endif ++ ++#endif +-- +1.8.2.3 + diff --git a/patches/lowpan-tools-0.3/0003-configure.ac-check-for-python2.x.patch b/patches/lowpan-tools-0.3/0003-configure.ac-check-for-python2.x.patch new file mode 100644 index 0000000..b5885b8 --- /dev/null +++ b/patches/lowpan-tools-0.3/0003-configure.ac-check-for-python2.x.patch @@ -0,0 +1,32 @@ +From ee734ebbd220460e73cc871d1f0c652bb9a85439 Mon Sep 17 00:00:00 2001 +From: Alexander Aring +Date: Fri, 21 Dec 2012 06:37:14 +0100 +Subject: [PATCH 3/7] configure.ac: check for python2.x + +Check for python2.x at first. + +test_DQ.py works with python2.x only. +'make install' needs python2.x to generate *.pyc files. + +Signed-off-by: Alexander Aring +--- + configure.ac | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/configure.ac b/configure.ac +index c483b4f..6c9f54b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -77,6 +77,9 @@ AC_PROG_LIBTOOL + AM_PROG_LEX + AC_PROG_YACC + AC_SUBST(LIBTOOL_DEPS) ++# Currently the scripts works with python2.x only ++# Check for this at first ++AC_PATH_PROG(PYTHON, python2 python2.7 python2.6 python2.5 python) + AM_PATH_PYTHON(,, [:]) + AM_MISSING_PROG(HELP2MAN, help2man, $missing_dir) + +-- +1.8.2.3 + diff --git a/patches/lowpan-tools-0.3/0004-m4-add-py_check_major_version.m4.patch b/patches/lowpan-tools-0.3/0004-m4-add-py_check_major_version.m4.patch new file mode 100644 index 0000000..3ed7f15 --- /dev/null +++ b/patches/lowpan-tools-0.3/0004-m4-add-py_check_major_version.m4.patch @@ -0,0 +1,44 @@ +From 242c594bce69295299d67d5a2c7d4a286fb85fcd Mon Sep 17 00:00:00 2001 +From: Alan Ott +Date: Sun, 17 Mar 2013 18:13:45 -0400 +Subject: [PATCH 4/7] m4: add py_check_major_version.m4 + +Macro to check the Python major version. + +This is from stackoverflow user bigleux on page: + http://stackoverflow.com/questions/4619664/autofoo-test-for-maximum-version-of-python + +Signed-off-by: Alan Ott +--- + m4/py_check_major_version.m4 | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + create mode 100644 m4/py_check_major_version.m4 + +diff --git a/m4/py_check_major_version.m4 b/m4/py_check_major_version.m4 +new file mode 100644 +index 0000000..6d45be8 +--- /dev/null ++++ b/m4/py_check_major_version.m4 +@@ -0,0 +1,19 @@ ++`# From http://stackoverflow.com/questions/4619664/autofoo-test-for-maximum-version-of-python ++`# stackoverflow user biegleux ++ ++`# py_CHECK_MAJOR_VERSION(VARIABLE, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])` ++`# ---------------------------------------------------------------------------` ++`# Run ACTION-IF-TRUE if the VAR has a major version >= VERSION.` ++`# Run ACTION-IF-FALSE otherwise.` ++AC_DEFUN([py_CHECK_MAJOR_VERSION], ++[AC_MSG_CHECKING([whether $1 $$1 major version == $2]) ++case $$1 in ++$2*) ++ AC_MSG_RESULT([yes]) ++ ifelse([$3], [$3], [:]) ++ ;; ++*) ++ AC_MSG_RESULT([no]) ++ ifelse([$4], , [AC_MSG_ERROR([$$1 differs from $2])], [$4]) ++ ;; ++esac]) +-- +1.8.2.3 + diff --git a/patches/lowpan-tools-0.3/0005-configure.ac-Check-that-the-python-version-is-indeed.patch b/patches/lowpan-tools-0.3/0005-configure.ac-Check-that-the-python-version-is-indeed.patch new file mode 100644 index 0000000..6798c0f --- /dev/null +++ b/patches/lowpan-tools-0.3/0005-configure.ac-Check-that-the-python-version-is-indeed.patch @@ -0,0 +1,27 @@ +From 770842e5df5f11718223c52d8fe5257ce29ab629 Mon Sep 17 00:00:00 2001 +From: Alan Ott +Date: Sun, 17 Mar 2013 18:18:46 -0400 +Subject: [PATCH 5/7] configure.ac: Check that the python version is indeed 2 + +Python 3 breaks all our scripts. + +Signed-off-by: Alan Ott +--- + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/configure.ac b/configure.ac +index 6c9f54b..89c2651 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -81,6 +81,7 @@ AC_SUBST(LIBTOOL_DEPS) + # Check for this at first + AC_PATH_PROG(PYTHON, python2 python2.7 python2.6 python2.5 python) + AM_PATH_PYTHON(,, [:]) ++py_CHECK_MAJOR_VERSION([PYTHON_VERSION], [2]) + AM_MISSING_PROG(HELP2MAN, help2man, $missing_dir) + + # Checks for libraries. +-- +1.8.2.3 + diff --git a/patches/lowpan-tools-0.3/0006-Allow-to-set-PAN-ID-short-address-and-channel-manual.patch b/patches/lowpan-tools-0.3/0006-Allow-to-set-PAN-ID-short-address-and-channel-manual.patch new file mode 100644 index 0000000..88e64fc --- /dev/null +++ b/patches/lowpan-tools-0.3/0006-Allow-to-set-PAN-ID-short-address-and-channel-manual.patch @@ -0,0 +1,126 @@ +From 2f855efcf9e261bbbe6ce1155f2fbc0977f0f9b3 Mon Sep 17 00:00:00 2001 +From: Stefan Schmidt +Date: Wed, 13 Mar 2013 08:25:02 +0100 +Subject: [PATCH 6/7] Allow to set PAN ID, short address and channel manually. + +This allows setting up a network without a PAN +coordinator. Necessary if you want to be compatible +with the contiki implementation. + +Signed-off-by: Stefan Schmidt +--- + src/iz-mac.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 91 insertions(+) + +diff --git a/src/iz-mac.c b/src/iz-mac.c +index 7c1e616..be980d6 100644 +--- a/src/iz-mac.c ++++ b/src/iz-mac.c +@@ -253,6 +253,88 @@ static struct iz_cmd_event list_response_event[] = { + {}, + }; + ++/******************/ ++/* SET handling */ ++/******************/ ++ ++static iz_res_t set_parse(struct iz_cmd *cmd) ++{ ++ cmd->flags = NLM_F_REQUEST; ++ return IZ_CONT_OK; ++} ++ ++static iz_res_t set_request(struct iz_cmd *cmd, struct nl_msg *msg) ++{ ++ char *dummy; ++ uint16_t pan_id, short_addr; ++ uint8_t chan; ++ ++ if (!cmd->argv[1]) ++ return IZ_STOP_ERR; ++ NLA_PUT_STRING(msg, IEEE802154_ATTR_DEV_NAME, cmd->argv[1]); ++ ++ if (!cmd->argv[2]) ++ return IZ_STOP_ERR; ++ pan_id = strtol(cmd->argv[2], &dummy, 16); ++ if (*dummy) { ++ printf("Bad PAN ID!\n"); ++ return IZ_STOP_ERR; ++ } ++ NLA_PUT_U16(msg, IEEE802154_ATTR_COORD_PAN_ID, pan_id); ++ ++ if (!cmd->argv[3]) ++ return IZ_STOP_ERR; ++ short_addr = strtol(cmd->argv[3], &dummy, 16); ++ if (*dummy) { ++ printf("Bad short address!\n"); ++ return IZ_STOP_ERR; ++ } ++ NLA_PUT_U16(msg, IEEE802154_ATTR_COORD_SHORT_ADDR, short_addr); ++ ++ if (!cmd->argv[4]) ++ return IZ_STOP_ERR; ++ chan = strtol(cmd->argv[4], &dummy, 10); ++ if (*dummy) { ++ printf("Bad channel number!\n"); ++ return IZ_STOP_ERR; ++ } ++ NLA_PUT_U8(msg, IEEE802154_ATTR_CHANNEL, chan); ++ ++ /* set all unneeded attributes to 0*/ ++ NLA_PUT_U8(msg, IEEE802154_ATTR_PAN_COORD, 0); ++ NLA_PUT_U8(msg, IEEE802154_ATTR_BCN_ORD, 0); ++ NLA_PUT_U8(msg, IEEE802154_ATTR_SF_ORD, 0); ++ NLA_PUT_U8(msg, IEEE802154_ATTR_BAT_EXT, 0); ++ NLA_PUT_U8(msg, IEEE802154_ATTR_COORD_REALIGN, 0); ++ ++ return IZ_CONT_OK; ++ ++nla_put_failure: ++ return IZ_STOP_ERR; ++} ++ ++static iz_res_t set_response(struct iz_cmd *cmd, struct genlmsghdr *ghdr, struct nlattr **attrs) ++{ ++ if (!attrs[IEEE802154_ATTR_SHORT_ADDR] || ++ !attrs[IEEE802154_ATTR_STATUS] ) ++ return IZ_STOP_ERR; ++ ++ printf("Set PAN ID %04hx, short address %04hx, status %i\n", ++ nla_get_u16(attrs[IEEE802154_ATTR_COORD_PAN_ID]), ++ nla_get_u16(attrs[IEEE802154_ATTR_SHORT_ADDR]), ++ nla_get_u8(attrs[IEEE802154_ATTR_CHANNEL])); ++ ++ return IZ_STOP_OK; ++} ++ ++static struct iz_cmd_event set_response_event[] = { ++ { ++ .call = set_response, ++ .nl = IEEE802154_START_CONF, ++ }, ++ {}, ++}; ++ + /************************/ + /* ASSOCIATE handling */ + /************************/ +@@ -473,6 +555,15 @@ const struct iz_module iz_mac = { + .response = list_response_event, + .finish = list_finish, + }, ++ { ++ .name = "set", ++ .usage = " ", ++ .doc = "Set address, channel and pan for an interface.", ++ .nl_cmd = IEEE802154_START_REQ, ++ .parse = set_parse, ++ .request = set_request, ++ .response = set_response_event, ++ }, + {}} + }; + +-- +1.8.2.3 + diff --git a/patches/lowpan-tools-0.3/0007-iz-mac-Handle-return-code-from-set-command.patch b/patches/lowpan-tools-0.3/0007-iz-mac-Handle-return-code-from-set-command.patch new file mode 100644 index 0000000..d4f48ca --- /dev/null +++ b/patches/lowpan-tools-0.3/0007-iz-mac-Handle-return-code-from-set-command.patch @@ -0,0 +1,43 @@ +From a1d9615adde6d1a568813c24a128273ed755af04 Mon Sep 17 00:00:00 2001 +From: Alan Ott +Date: Sun, 17 Mar 2013 21:22:52 -0400 +Subject: [PATCH 7/7] iz-mac: Handle return code from "set" command + +The iz set command will fail if the PAN ID is invalid. Handle this failure. + +Signed-off-by: Alan Ott +--- + src/iz-mac.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +diff --git a/src/iz-mac.c b/src/iz-mac.c +index be980d6..838229c 100644 +--- a/src/iz-mac.c ++++ b/src/iz-mac.c +@@ -315,14 +315,16 @@ nla_put_failure: + + static iz_res_t set_response(struct iz_cmd *cmd, struct genlmsghdr *ghdr, struct nlattr **attrs) + { +- if (!attrs[IEEE802154_ATTR_SHORT_ADDR] || +- !attrs[IEEE802154_ATTR_STATUS] ) ++ uint8_t status; ++ ++ if (!attrs[IEEE802154_ATTR_STATUS]) + return IZ_STOP_ERR; +- +- printf("Set PAN ID %04hx, short address %04hx, status %i\n", +- nla_get_u16(attrs[IEEE802154_ATTR_COORD_PAN_ID]), +- nla_get_u16(attrs[IEEE802154_ATTR_SHORT_ADDR]), +- nla_get_u8(attrs[IEEE802154_ATTR_CHANNEL])); ++ ++ status = nla_get_u8(attrs[IEEE802154_ATTR_STATUS]); ++ if (status != 0) { ++ printf("Operation Failed. Check channel and PAN ID\n"); ++ return IZ_STOP_ERR; ++ } + + return IZ_STOP_OK; + } +-- +1.8.2.3 + diff --git a/patches/lowpan-tools-0.3/autogen.sh b/patches/lowpan-tools-0.3/autogen.sh new file mode 100755 index 0000000..354fb5f --- /dev/null +++ b/patches/lowpan-tools-0.3/autogen.sh @@ -0,0 +1,11 @@ +#! /bin/sh + +set -e + +autoreconf \ + --force \ + --install \ + --warnings=cross \ + --warnings=syntax \ + --warnings=obsolete \ + --warnings=unsupported diff --git a/patches/lowpan-tools-0.3/series b/patches/lowpan-tools-0.3/series index 7f7c24f..1652508 100644 --- a/patches/lowpan-tools-0.3/series +++ b/patches/lowpan-tools-0.3/series @@ -1 +1,7 @@ -0001-Avoid-crashing-in-izcoordinator.patch +0001-izoordinator-Fixes-to-error-handling.patch +0002-addrdb-fix-include-dependency-and-remove-redefined.patch +0003-configure.ac-check-for-python2.x.patch +0004-m4-add-py_check_major_version.m4.patch +0005-configure.ac-Check-that-the-python-version-is-indeed.patch +0006-Allow-to-set-PAN-ID-short-address-and-channel-manual.patch +0007-iz-mac-Handle-return-code-from-set-command.patch diff --git a/patches/lua-5.1.4/autogen.sh b/patches/lua-5.1.4/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/lua-5.1.4/autogen.sh +++ b/patches/lua-5.1.4/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/mod_python-3.3.1/autogen-generic.sh b/patches/mod_python-3.3.1/autogen-generic.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/mod_python-3.3.1/autogen-generic.sh +++ b/patches/mod_python-3.3.1/autogen-generic.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/mtd-utils-1.5.0/0001-introduce-PRIxoff_t-and-PRIdoff_t-printf-helpers.patch b/patches/mtd-utils-1.5.0/0001-introduce-PRIxoff_t-and-PRIdoff_t-printf-helpers.patch new file mode 100644 index 0000000..2476f64 --- /dev/null +++ b/patches/mtd-utils-1.5.0/0001-introduce-PRIxoff_t-and-PRIdoff_t-printf-helpers.patch @@ -0,0 +1,51 @@ +From: Richard Genoud +Date: Wed, 12 Sep 2012 16:38:33 +0200 +Subject: [PATCH mtd-utils] introduce PRIxoff_t and PRIdoff_t printf helpers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +They will be usefull when printing offsets. + +Signed-off-by: Richard Genoud +Signed-off-by: Artem Bityutskiy +Signed-off-by: Uwe Kleine-König +--- + +Notes: + Origin: upstream, commit:4f1b10827b81cd9acaa9e02b0da0dc447f1471ea + + This patch is a dependency for the following patch. + + include/common.h | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/include/common.h b/include/common.h +index 88b67e5..d0c4146 100644 +--- a/include/common.h ++++ b/include/common.h +@@ -25,6 +25,8 @@ + #include + #include + #include ++#include ++#include + #include "version.h" + + #ifndef PROGRAM_NAME +@@ -48,6 +50,15 @@ extern "C" { + #define O_CLOEXEC 0 + #endif + ++/* define a print format specifier for off_t */ ++#ifdef __USE_FILE_OFFSET64 ++#define PRIxoff_t PRIx64 ++#define PRIdoff_t PRId64 ++#else ++#define PRIxoff_t "l"PRIx32 ++#define PRIdoff_t "l"PRId32 ++#endif ++ + /* Verbose messages */ + #define bareverbose(verbose, fmt, ...) do { \ + if (verbose) \ diff --git a/patches/mtd-utils-1.5.0/0002-consistency-between-u_int32_t-off_t-off64_t.patch b/patches/mtd-utils-1.5.0/0002-consistency-between-u_int32_t-off_t-off64_t.patch new file mode 100644 index 0000000..23c6d99 --- /dev/null +++ b/patches/mtd-utils-1.5.0/0002-consistency-between-u_int32_t-off_t-off64_t.patch @@ -0,0 +1,434 @@ +From: Richard Genoud +Date: Wed, 12 Sep 2012 16:38:34 +0200 +Subject: [PATCH mtd-utils] consistency between u_int32_t / off_t / off64_t +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We should use the off_t type instead of off64_t or u_int32_t as its +length is controlled by the WITHOUT_LARGEFILE flag. + +Signed-off-by: Richard Genoud +Signed-off-by: Artem Bityutskiy +Signed-off-by: Uwe Kleine-König +--- + +Notes: + Origin: upstream, commit:f3f3a208048eac5f8b5752a17ebcd44db9230fd8 + + This fixes + flash_otp_write.c: In function 'main': + flash_otp_write.c:61:2: warning: format '%lx' expects argument of type 'long unsigned int', but argument 3 has type 'off_t' [-Wformat] + + flash_erase.c | 16 ++++++++-------- + flash_otp_write.c | 5 +++-- + ftl_check.c | 6 ++++-- + ftl_format.c | 2 +- + lib/libmtd.c | 12 ++++++------ + mkfs.ubifs/mkfs.ubifs.c | 11 +++++------ + mtd_debug.c | 14 +++++++------- + tests/fs-tests/integrity/integck.c | 4 ++-- + tests/ubi-tests/integ.c | 38 +++++++++++++++++++------------------- + 9 files changed, 55 insertions(+), 53 deletions(-) + +diff --git a/flash_erase.c b/flash_erase.c +index fe2eaca..326a299 100644 +--- a/flash_erase.c ++++ b/flash_erase.c +@@ -49,10 +49,10 @@ static int unlock; /* unlock sectors before erasing */ + static struct jffs2_unknown_node cleanmarker; + int target_endian = __BYTE_ORDER; + +-static void show_progress(struct mtd_dev_info *mtd, uint64_t start, int eb, ++static void show_progress(struct mtd_dev_info *mtd, off_t start, int eb, + int eb_start, int eb_cnt) + { +- bareverbose(!quiet, "\rErasing %d Kibyte @ %"PRIx64" -- %2i %% complete ", ++ bareverbose(!quiet, "\rErasing %d Kibyte @ %"PRIxoff_t" -- %2i %% complete ", + mtd->eb_size / 1024, start, ((eb - eb_start) * 100) / eb_cnt); + fflush(stdout); + } +@@ -97,7 +97,7 @@ int main(int argc, char *argv[]) + unsigned int eb, eb_start, eb_cnt; + int isNAND; + int error = 0; +- uint64_t offset = 0; ++ off_t offset = 0; + + /* + * Process user arguments +@@ -235,12 +235,12 @@ int main(int argc, char *argv[]) + eb_cnt = (mtd.size / mtd.eb_size) - eb_start; + + for (eb = eb_start; eb < eb_start + eb_cnt; eb++) { +- offset = (uint64_t)eb * mtd.eb_size; ++ offset = (off_t)eb * mtd.eb_size; + + if (!noskipbad) { + int ret = mtd_is_bad(&mtd, fd, eb); + if (ret > 0) { +- verbose(!quiet, "Skipping bad block at %08"PRIx64, offset); ++ verbose(!quiet, "Skipping bad block at %08"PRIxoff_t, offset); + continue; + } else if (ret < 0) { + if (errno == EOPNOTSUPP) { +@@ -272,12 +272,12 @@ int main(int argc, char *argv[]) + + /* write cleanmarker */ + if (isNAND) { +- if (mtd_write_oob(mtd_desc, &mtd, fd, offset + clmpos, clmlen, &cleanmarker) != 0) { ++ if (mtd_write_oob(mtd_desc, &mtd, fd, (uint64_t)offset + clmpos, clmlen, &cleanmarker) != 0) { + sys_errmsg("%s: MTD writeoob failure", mtd_device); + continue; + } + } else { +- if (lseek(fd, (loff_t)offset, SEEK_SET) < 0) { ++ if (lseek(fd, offset, SEEK_SET) < 0) { + sys_errmsg("%s: MTD lseek failure", mtd_device); + continue; + } +@@ -286,7 +286,7 @@ int main(int argc, char *argv[]) + continue; + } + } +- verbose(!quiet, " Cleanmarker written at %"PRIx64, offset); ++ verbose(!quiet, " Cleanmarker written at %"PRIxoff_t, offset); + } + show_progress(&mtd, offset, eb, eb_start, eb_cnt); + bareverbose(!quiet, "\n"); +diff --git a/flash_otp_write.c b/flash_otp_write.c +index d407ebb..56769ec 100644 +--- a/flash_otp_write.c ++++ b/flash_otp_write.c +@@ -13,6 +13,7 @@ + #include + #include + ++#include + #include + + int main(int argc,char *argv[]) +@@ -47,7 +48,7 @@ int main(int argc,char *argv[]) + return errno; + } + +- offset = strtoul(argv[3], &p, 0); ++ offset = (off_t)strtoull(argv[3], &p, 0); + if (argv[3][0] == 0 || *p != 0) { + fprintf(stderr, "%s: bad offset value\n", PROGRAM_NAME); + return ERANGE; +@@ -58,7 +59,7 @@ int main(int argc,char *argv[]) + return errno; + } + +- printf("Writing OTP user data on %s at offset 0x%lx\n", argv[2], offset); ++ printf("Writing OTP user data on %s at offset 0x%"PRIxoff_t"\n", argv[2], offset); + + if (mtdInfo.type == MTD_NANDFLASH) + len = mtdInfo.writesize; +diff --git a/ftl_check.c b/ftl_check.c +index 5e75e6a..6d84785 100644 +--- a/ftl_check.c ++++ b/ftl_check.c +@@ -53,6 +53,7 @@ + + #include + #include ++#include "common.h" + + #if __BYTE_ORDER == __LITTLE_ENDIAN + # define TO_LE32(x) (x) +@@ -85,7 +86,8 @@ static void check_partition(int fd) + { + mtd_info_t mtd; + erase_unit_header_t hdr, hdr2; +- u_int i, j, nbam, *bam; ++ off_t i; ++ u_int j, nbam, *bam; + int control, data, free, deleted; + + /* Get partition size, block size */ +@@ -142,7 +144,7 @@ static void check_partition(int fd) + perror("read failed"); + break; + } +- printf("\nErase unit %d:\n", i); ++ printf("\nErase unit %"PRIdoff_t":\n", i); + if ((hdr2.FormattedSize != hdr.FormattedSize) || + (hdr2.NumEraseUnits != hdr.NumEraseUnits) || + (hdr2.SerialNumber != hdr.SerialNumber)) +diff --git a/ftl_format.c b/ftl_format.c +index bd4203b..0ce601b 100644 +--- a/ftl_format.c ++++ b/ftl_format.c +@@ -240,7 +240,7 @@ static int format_partition(int fd, int quiet, int interrogate, + /* Distribute transfer units over the entire region */ + step = (spare) ? (FROM_LE16(hdr.NumEraseUnits)/spare) : (FROM_LE16(hdr.NumEraseUnits)+1); + for (i = 0; i < FROM_LE16(hdr.NumEraseUnits); i++) { +- u_int ofs = (i + FROM_LE16(hdr.FirstPhysicalEUN)) << hdr.EraseUnitSize; ++ off_t ofs = (off_t) (i + FROM_LE16(hdr.FirstPhysicalEUN)) << hdr.EraseUnitSize; + if (lseek(fd, ofs, SEEK_SET) == -1) { + perror("seek failed"); + break; +diff --git a/lib/libmtd.c b/lib/libmtd.c +index c4836df..654490e 100644 +--- a/lib/libmtd.c ++++ b/lib/libmtd.c +@@ -1063,8 +1063,8 @@ int mtd_read(const struct mtd_dev_info *mtd, int fd, int eb, int offs, + /* Seek to the beginning of the eraseblock */ + seek = (off_t)eb * mtd->eb_size + offs; + if (lseek(fd, seek, SEEK_SET) != seek) +- return sys_errmsg("cannot seek mtd%d to offset %llu", +- mtd->mtd_num, (unsigned long long)seek); ++ return sys_errmsg("cannot seek mtd%d to offset %"PRIdoff_t, ++ mtd->mtd_num, seek); + + while (rd < len) { + ret = read(fd, buf, len); +@@ -1171,8 +1171,8 @@ int mtd_write(libmtd_t desc, const struct mtd_dev_info *mtd, int fd, int eb, + if (data) { + /* Seek to the beginning of the eraseblock */ + if (lseek(fd, seek, SEEK_SET) != seek) +- return sys_errmsg("cannot seek mtd%d to offset %llu", +- mtd->mtd_num, (unsigned long long)seek); ++ return sys_errmsg("cannot seek mtd%d to offset %"PRIdoff_t, ++ mtd->mtd_num, seek); + ret = write(fd, data, len); + if (ret != len) + return sys_errmsg("cannot write %d bytes to mtd%d " +@@ -1329,8 +1329,8 @@ int mtd_write_img(const struct mtd_dev_info *mtd, int fd, int eb, int offs, + /* Seek to the beginning of the eraseblock */ + seek = (off_t)eb * mtd->eb_size + offs; + if (lseek(fd, seek, SEEK_SET) != seek) { +- sys_errmsg("cannot seek mtd%d to offset %llu", +- mtd->mtd_num, (unsigned long long)seek); ++ sys_errmsg("cannot seek mtd%d to offset %"PRIdoff_t, ++ mtd->mtd_num, seek); + goto out_close; + } + +diff --git a/mkfs.ubifs/mkfs.ubifs.c b/mkfs.ubifs/mkfs.ubifs.c +index bb25dc3..b7166ea 100644 +--- a/mkfs.ubifs/mkfs.ubifs.c ++++ b/mkfs.ubifs/mkfs.ubifs.c +@@ -778,7 +778,7 @@ static void prepare_node(void *node, int len) + */ + int write_leb(int lnum, int len, void *buf, int dtype) + { +- off64_t pos = (off64_t)lnum * c->leb_size; ++ off_t pos = (off_t)lnum * c->leb_size; + + dbg_msg(3, "LEB %d len %d", lnum, len); + memset(buf + len, 0xff, c->leb_size - len); +@@ -786,13 +786,12 @@ int write_leb(int lnum, int len, void *buf, int dtype) + if (ubi_leb_change_start(ubi, out_fd, lnum, c->leb_size, dtype)) + return sys_err_msg("ubi_leb_change_start failed"); + +- if (lseek64(out_fd, pos, SEEK_SET) != pos) +- return sys_err_msg("lseek64 failed seeking %lld", +- (long long)pos); ++ if (lseek(out_fd, pos, SEEK_SET) != pos) ++ return sys_err_msg("lseek failed seeking %"PRIdoff_t, pos); + + if (write(out_fd, buf, c->leb_size) != c->leb_size) +- return sys_err_msg("write failed writing %d bytes at pos %lld", +- c->leb_size, (long long)pos); ++ return sys_err_msg("write failed writing %d bytes at pos %"PRIdoff_t, ++ c->leb_size, pos); + + return 0; + } +diff --git a/mtd_debug.c b/mtd_debug.c +index 2d307a9..9110e9b 100644 +--- a/mtd_debug.c ++++ b/mtd_debug.c +@@ -103,7 +103,7 @@ void printsize(u_int32_t x) + printf("(%u%c)", x, flags[i]); + } + +-int flash_to_file(int fd, u_int32_t offset, size_t len, const char *filename) ++int flash_to_file(int fd, off_t offset, size_t len, const char *filename) + { + u_int8_t *buf = NULL; + int outfd, err; +@@ -157,7 +157,7 @@ retry: + if (buf != NULL) + free(buf); + close(outfd); +- printf("Copied %zu bytes from address 0x%.8x in flash to %s\n", len, offset, filename); ++ printf("Copied %zu bytes from address 0x%.8"PRIxoff_t" in flash to %s\n", len, offset, filename); + return 0; + + err2: +@@ -169,7 +169,7 @@ err0: + return 1; + } + +-int file_to_flash(int fd, u_int32_t offset, u_int32_t len, const char *filename) ++int file_to_flash(int fd, off_t offset, u_int32_t len, const char *filename) + { + u_int8_t *buf = NULL; + FILE *fp; +@@ -221,7 +221,7 @@ retry: + if (buf != NULL) + free(buf); + fclose(fp); +- printf("Copied %d bytes from %s to address 0x%.8x in flash\n", len, filename, offset); ++ printf("Copied %d bytes from %s to address 0x%.8"PRIxoff_t" in flash\n", len, filename, offset); + return 0; + } + +@@ -376,13 +376,13 @@ int main(int argc, char *argv[]) + showinfo(fd); + break; + case OPT_READ: +- err = flash_to_file(fd, strtol(argv[3], NULL, 0), strtol(argv[4], NULL, 0), argv[5]); ++ err = flash_to_file(fd, strtoll(argv[3], NULL, 0), strtoul(argv[4], NULL, 0), argv[5]); + break; + case OPT_WRITE: +- err = file_to_flash(fd, strtol(argv[3], NULL, 0), strtol(argv[4], NULL, 0), argv[5]); ++ err = file_to_flash(fd, strtoll(argv[3], NULL, 0), strtoul(argv[4], NULL, 0), argv[5]); + break; + case OPT_ERASE: +- err = erase_flash(fd, strtol(argv[3], NULL, 0), strtol(argv[4], NULL, 0)); ++ err = erase_flash(fd, strtoul(argv[3], NULL, 0), strtoul(argv[4], NULL, 0)); + break; + } + +diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c +index 30322cd..f6e77f6 100644 +--- a/tests/fs-tests/integrity/integck.c ++++ b/tests/fs-tests/integrity/integck.c +@@ -899,8 +899,8 @@ static ssize_t file_write_data(struct file_info *file, int fd, off_t offset, + remains = size; + actual = 0; + written = IO_BUFFER_SIZE; +- v("write %zd bytes, offset %llu, file %s", +- size, (unsigned long long)offset, get_file_name(file)); ++ v("write %zd bytes, offset %"PRIdoff_t", file %s", ++ size, offset, get_file_name(file)); + while (remains) { + /* Fill up buffer with random data */ + if (written < IO_BUFFER_SIZE) { +diff --git a/tests/ubi-tests/integ.c b/tests/ubi-tests/integ.c +index 4e13b73..e48f533 100644 +--- a/tests/ubi-tests/integ.c ++++ b/tests/ubi-tests/integ.c +@@ -25,7 +25,7 @@ struct write_info + struct write_info *next; + struct erase_block_info *erase_block; + int offset_within_block; /* Offset within erase block */ +- off64_t offset; /* Offset within volume */ ++ off_t offset; /* Offset within volume */ + int size; + int random_seed; + }; +@@ -34,8 +34,8 @@ struct erase_block_info + { + struct volume_info *volume; + int block_number; +- off64_t offset; /* Offset within volume */ +- off64_t top_of_data; ++ off_t offset; /* Offset within volume */ ++ off_t top_of_data; + int touched; /* Have we done anything at all with this erase block */ + int erased; /* This erased block is currently erased */ + struct write_info *writes; +@@ -220,7 +220,7 @@ static void set_random_data(unsigned seed, unsigned char *buf, int size) + static void check_erase_block(struct erase_block_info *erase_block, int fd) + { + struct write_info *w; +- off64_t gap_end; ++ off_t gap_end; + int leb_size = erase_block->volume->info.leb_size; + ssize_t bytes_read; + +@@ -229,10 +229,10 @@ static void check_erase_block(struct erase_block_info *erase_block, int fd) + while (w) { + if (w->offset + w->size < gap_end) { + /* There is a gap. Check all 0xff */ +- off64_t gap_start = w->offset + w->size; ++ off_t gap_start = w->offset + w->size; + ssize_t size = gap_end - gap_start; +- if (lseek64(fd, gap_start, SEEK_SET) != gap_start) +- error_exit("lseek64 failed"); ++ if (lseek(fd, gap_start, SEEK_SET) != gap_start) ++ error_exit("lseek failed"); + memset(read_buffer, 0 , size); + errno = 0; + bytes_read = read(fd, read_buffer, size); +@@ -241,18 +241,18 @@ static void check_erase_block(struct erase_block_info *erase_block, int fd) + while (size) + if (read_buffer[--size] != 0xff) { + fprintf(stderr, "block no. = %d\n" , erase_block->block_number); +- fprintf(stderr, "offset = %lld\n" , (long long) gap_start); ++ fprintf(stderr, "offset = %"PRIdoff_t"\n" , gap_start); + fprintf(stderr, "size = %ld\n" , (long) bytes_read); + error_exit("verify 0xff failed"); + } + } +- if (lseek64(fd, w->offset, SEEK_SET) != w->offset) +- error_exit("lseek64 failed"); ++ if (lseek(fd, w->offset, SEEK_SET) != w->offset) ++ error_exit("lseek failed"); + memset(read_buffer, 0 , w->size); + errno = 0; + bytes_read = read(fd, read_buffer, w->size); + if (bytes_read != w->size) { +- fprintf(stderr, "offset = %lld\n" , (long long) w->offset); ++ fprintf(stderr, "offset = %"PRIdoff_t"\n" , w->offset); + fprintf(stderr, "size = %ld\n" , (long) w->size); + fprintf(stderr, "bytes_read = %ld\n" , (long) bytes_read); + error_exit("read failed"); +@@ -265,10 +265,10 @@ static void check_erase_block(struct erase_block_info *erase_block, int fd) + } + if (gap_end > erase_block->offset) { + /* Check all 0xff */ +- off64_t gap_start = erase_block->offset; ++ off_t gap_start = erase_block->offset; + ssize_t size = gap_end - gap_start; +- if (lseek64(fd, gap_start, SEEK_SET) != gap_start) +- error_exit("lseek64 failed"); ++ if (lseek(fd, gap_start, SEEK_SET) != gap_start) ++ error_exit("lseek failed"); + memset(read_buffer, 0 , size); + errno = 0; + bytes_read = read(fd, read_buffer, size); +@@ -277,7 +277,7 @@ static void check_erase_block(struct erase_block_info *erase_block, int fd) + while (size) + if (read_buffer[--size] != 0xff) { + fprintf(stderr, "block no. = %d\n" , erase_block->block_number); +- fprintf(stderr, "offset = %lld\n" , (long long) gap_start); ++ fprintf(stderr, "offset = %"PRIdoff_t"\n" , gap_start); + fprintf(stderr, "size = %ld\n" , (long) bytes_read); + error_exit("verify 0xff failed!"); + } +@@ -290,7 +290,7 @@ static int write_to_erase_block(struct erase_block_info *erase_block, int fd) + int leb_size = erase_block->volume->info.leb_size; + int next_offset = 0; + int space, size; +- off64_t offset; ++ off_t offset; + unsigned seed; + struct write_info *w; + +@@ -327,8 +327,8 @@ static int write_to_erase_block(struct erase_block_info *erase_block, int fd) + offset = erase_block->offset + next_offset; + if (offset < erase_block->top_of_data) + error_exit("internal error!"); +- if (lseek64(fd, offset, SEEK_SET) != offset) +- error_exit("lseek64 failed"); ++ if (lseek(fd, offset, SEEK_SET) != offset) ++ error_exit("lseek failed"); + /* Do write */ + seed = get_next_seed(); + if (!seed) +@@ -480,7 +480,7 @@ static void operate_on_ubi_device(struct ubi_device_info *ubi_device) + for (i = 0; i < n; ++i) { + s->erase_blocks[i].volume = s; + s->erase_blocks[i].block_number = i; +- s->erase_blocks[i].offset = i * (off64_t) s->info.leb_size; ++ s->erase_blocks[i].offset = i * (off_t) s->info.leb_size; + s->erase_blocks[i].top_of_data = s->erase_blocks[i].offset; + } + /* FIXME: Correctly get device file name */ diff --git a/patches/mtd-utils-1.5.0/0003-make-ubifs-optional.patch b/patches/mtd-utils-1.5.0/0003-make-ubifs-optional.patch new file mode 100644 index 0000000..a71a8c9 --- /dev/null +++ b/patches/mtd-utils-1.5.0/0003-make-ubifs-optional.patch @@ -0,0 +1,23 @@ +From: Bernhard Walle +Date: Sun, 11 Mar 2012 20:03:50 +0100 +Subject: [PATCH mtd-utils] make ubifs optional + +Signed-off-by: Bernhard Walle +--- + Makefile | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/Makefile b/Makefile +index f380b42..a682a8f 100644 +--- a/Makefile ++++ b/Makefile +@@ -30,7 +30,9 @@ UBI_BINS = \ + ubidetach ubinize ubiformat ubirename mtdinfo ubirsvol + + BINS = $(MTD_BINS) ++ifneq ($(WITHOUT_MKUBIFS), 1) + BINS += mkfs.ubifs/mkfs.ubifs ++endif + BINS += $(addprefix ubi-utils/,$(UBI_BINS)) + SCRIPTS = flash_eraseall + diff --git a/patches/mtd-utils-1.5.0/0004-Make-liblzo-optional-for-ubifs-tools.patch b/patches/mtd-utils-1.5.0/0004-Make-liblzo-optional-for-ubifs-tools.patch new file mode 100644 index 0000000..0664a2e --- /dev/null +++ b/patches/mtd-utils-1.5.0/0004-Make-liblzo-optional-for-ubifs-tools.patch @@ -0,0 +1,68 @@ +From: Bernhard Walle +Date: Sun, 11 Mar 2012 20:11:14 +0100 +Subject: [PATCH mtd-utils] Make liblzo optional for ubifs tools + +Based on patch from Marc Kleine-Budde . + +Signed-off-by: Bernhard Walle +--- + Makefile | 2 +- + mkfs.ubifs/compr.c | 17 +++++++++++++++++ + 2 files changed, 18 insertions(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index a682a8f..190db58 100644 +--- a/Makefile ++++ b/Makefile +@@ -105,7 +105,7 @@ $(call _mkdep,lib/,libmtd.a) + # + obj-mkfs.ubifs = crc16.o lpt.o compr.o devtable.o \ + hashtable/hashtable.o hashtable/hashtable_itr.o +-LDLIBS_mkfs.ubifs = -lz -llzo2 -lm -luuid ++LDLIBS_mkfs.ubifs = -lz $(LZOLDLIBS) -lm -luuid + $(call mkdep,mkfs.ubifs/,mkfs.ubifs,,ubi-utils/libubi.a) + + # +diff --git a/mkfs.ubifs/compr.c b/mkfs.ubifs/compr.c +index 4152b6a..244d450 100644 +--- a/mkfs.ubifs/compr.c ++++ b/mkfs.ubifs/compr.c +@@ -24,7 +24,11 @@ + #include + #include + #include ++#ifndef WITHOUT_LZO + #include ++#else ++#define LZO1X_999_MEM_COMPRESS 0 ++#endif + #include + + #define crc32 __zlib_crc32 +@@ -86,6 +90,8 @@ static int zlib_deflate(void *in_buf, size_t in_len, void *out_buf, + return 0; + } + ++ ++#ifndef WITHOUT_LZO + static int lzo_compress(void *in_buf, size_t in_len, void *out_buf, + size_t *out_len) + { +@@ -103,6 +109,17 @@ static int lzo_compress(void *in_buf, size_t in_len, void *out_buf, + + return 0; + } ++#else ++static inline int lzo_compress(void *in_buf, size_t in_len, void *out_buf, ++ size_t *out_len) ++{ ++ (void)in_buf; ++ (void)in_len; ++ (void)out_buf; ++ (void)out_len; ++ return -1; ++} ++#endif + + static int no_compress(void *in_buf, size_t in_len, void *out_buf, + size_t *out_len) diff --git a/patches/mtd-utils-1.5.0/0005-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch b/patches/mtd-utils-1.5.0/0005-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch new file mode 100644 index 0000000..557c8dc --- /dev/null +++ b/patches/mtd-utils-1.5.0/0005-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch @@ -0,0 +1,65 @@ +From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= +Date: Thu, 28 Feb 2013 10:42:09 +0100 +Subject: [PATCH mtd-utils] flash_otp_write: fix writing to NAND in presence of + partial reads +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When doing something like: + + { printf "\xff"; printf "\xfe"; } | flash_otp_write -u /dev/mtd0 0 + +flash_otp_write might see only a single byte when reading from stdin for +the first tim. In this case (and without this patch) it pads to +$writesize with '\xff's and writes that out. In the next iteration it +reads the 2nd byte, pads and writes again. So the 2nd byte is written to +offset $writesize instead of 1. + +Signed-off-by: Uwe Kleine-König +Signed-off-by: Artem Bityutskiy +--- + +Notes: + Applied-Upstream: >1.5.0, commit:86cf5bd1e0633f16c722500bd9717d999a7e2473 + + flash_otp_write.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +diff --git a/flash_otp_write.c b/flash_otp_write.c +index 56769ec..3515eee 100644 +--- a/flash_otp_write.c ++++ b/flash_otp_write.c +@@ -16,6 +16,23 @@ + #include + #include + ++ssize_t xread(int fd, void *buf, size_t count) ++{ ++ ssize_t ret, done = 0; ++ ++retry: ++ ret = read(fd, buf + done, count - done); ++ if (ret < 0) ++ return ret; ++ ++ done += ret; ++ ++ if (ret == 0 /* EOF */ || done == count) ++ return done; ++ else ++ goto retry; ++} ++ + int main(int argc,char *argv[]) + { + int fd, val, ret, size, wrote, len; +@@ -67,7 +84,7 @@ int main(int argc,char *argv[]) + len = 256; + + wrote = 0; +- while ((size = read(0, buf, len))) { ++ while ((size = xread(0, buf, len))) { + if (size < 0) { + perror("read()"); + return errno; diff --git a/patches/mtd-utils-1.5.0/0006-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch b/patches/mtd-utils-1.5.0/0006-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch new file mode 100644 index 0000000..e8a1e00 --- /dev/null +++ b/patches/mtd-utils-1.5.0/0006-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch @@ -0,0 +1,39 @@ +From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= +Date: Thu, 28 Feb 2013 10:42:26 +0100 +Subject: [PATCH mtd-utils] flash_otp_write: fix a buffer overflow on NAND with + write size > 2048 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +I'm not aware of any chip having a write size bigger than 2048 today. +Still checking for that instead of a sleeping problem to bite us maybe +in a few years is easy. + +Signed-off-by: Uwe Kleine-König +Signed-off-by: Artem Bityutskiy +--- + +Notes: + Applied-Upstream: >1.5.0, commit:1145ef7ee979dde2d611e09d00fc6ff0090dcc9d + + flash_otp_write.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/flash_otp_write.c b/flash_otp_write.c +index 3515eee..eaca5e1 100644 +--- a/flash_otp_write.c ++++ b/flash_otp_write.c +@@ -83,6 +83,12 @@ int main(int argc,char *argv[]) + else + len = 256; + ++ if (len > sizeof(buf)) { ++ printf("huh, writesize (%d) bigger than buffer (%zu)\n", ++ len, sizeof(buf)); ++ return ENOMEM; ++ } ++ + wrote = 0; + while ((size = xread(0, buf, len))) { + if (size < 0) { diff --git a/patches/mtd-utils-1.5.0/0007-Makefile-also-build-and-install-flash_otp_lock-and-f.patch b/patches/mtd-utils-1.5.0/0007-Makefile-also-build-and-install-flash_otp_lock-and-f.patch new file mode 100644 index 0000000..4c0f76b --- /dev/null +++ b/patches/mtd-utils-1.5.0/0007-Makefile-also-build-and-install-flash_otp_lock-and-f.patch @@ -0,0 +1,46 @@ +From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= +Date: Wed, 20 Feb 2013 17:41:31 +0100 +Subject: [PATCH mtd-utils] Makefile: also build and install flash_otp_lock and + flash_otp_write +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Uwe Kleine-König +Signed-off-by: Artem Bityutskiy +--- + +Notes: + Applied-Upstream: >1.5.0, commit:86cf5bd1e0633f16c722500bd9717d999a7e2473 + + .gitignore | 2 ++ + Makefile | 3 ++- + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/.gitignore b/.gitignore +index d4771fb..83ca938 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -25,6 +25,8 @@ + /flash_lock + /flash_otp_dump + /flash_otp_info ++/flash_otp_lock ++/flash_otp_write + /flash_unlock + /flashcp + /ftl_check +diff --git a/Makefile b/Makefile +index 190db58..3f9c24f 100644 +--- a/Makefile ++++ b/Makefile +@@ -19,7 +19,8 @@ TESTS = tests + MTD_BINS = \ + ftl_format flash_erase nanddump doc_loadbios \ + ftl_check mkfs.jffs2 flash_lock flash_unlock \ +- flash_otp_info flash_otp_dump mtd_debug flashcp nandwrite nandtest \ ++ flash_otp_info flash_otp_dump flash_otp_lock flash_otp_write \ ++ mtd_debug flashcp nandwrite nandtest \ + jffs2dump \ + nftldump nftl_format docfdisk \ + rfddump rfdformat \ diff --git a/patches/mtd-utils-1.5.0/series b/patches/mtd-utils-1.5.0/series index 5739202..0c7c5e3 100644 --- a/patches/mtd-utils-1.5.0/series +++ b/patches/mtd-utils-1.5.0/series @@ -1,9 +1,10 @@ # generated by git-ptx-patches #tag:base --start-number 1 -0001-make-ubifs-optional.patch -0002-Make-liblzo-optional-for-ubifs-tools.patch -0003-flash_otp_write-fix-format-string-warning.patch -0004-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch -0005-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch -0006-Makefile-also-build-and-install-flash_otp_lock-and-f.patch -# e4c91e5314fff3767797bd4aab24a7e3 - git-ptx-patches magic +0001-introduce-PRIxoff_t-and-PRIdoff_t-printf-helpers.patch +0002-consistency-between-u_int32_t-off_t-off64_t.patch +0003-make-ubifs-optional.patch +0004-Make-liblzo-optional-for-ubifs-tools.patch +0005-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch +0006-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch +0007-Makefile-also-build-and-install-flash_otp_lock-and-f.patch +# 112f6fe0726ab47e9cac0f60228dd1cc - git-ptx-patches magic diff --git a/patches/mxs-utils-2011.06.0/autogen.sh b/patches/mxs-utils-2011.06.0/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/mxs-utils-2011.06.0/autogen.sh +++ b/patches/mxs-utils-2011.06.0/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/mysql-5.1.14-beta/autogen.sh b/patches/mysql-5.1.14-beta/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/mysql-5.1.14-beta/autogen.sh +++ b/patches/mysql-5.1.14-beta/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/net-snmp-5.6.1/series b/patches/net-snmp-5.6.1/series deleted file mode 100644 index 89093b4..0000000 --- a/patches/net-snmp-5.6.1/series +++ /dev/null @@ -1 +0,0 @@ -0001-net-snmp-config-add-SYSROOT-support.patch -p0 diff --git a/patches/net-snmp-5.6.1/0001-net-snmp-config-add-SYSROOT-support.patch b/patches/net-snmp-5.7.2/0001-net-snmp-config-add-SYSROOT-support.patch similarity index 72% rename from patches/net-snmp-5.6.1/0001-net-snmp-config-add-SYSROOT-support.patch rename to patches/net-snmp-5.7.2/0001-net-snmp-config-add-SYSROOT-support.patch index 4ddf848..a1161bb 100644 --- a/patches/net-snmp-5.6.1/0001-net-snmp-config-add-SYSROOT-support.patch +++ b/patches/net-snmp-5.7.2/0001-net-snmp-config-add-SYSROOT-support.patch @@ -1,4 +1,3 @@ -From 2ffcbd9a46108c837b8f5c577a71de4160007678 Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Sun, 10 Jan 2010 00:33:45 +0100 Subject: [PATCH] net-snmp-config; add SYSROOT support @@ -9,24 +8,27 @@ Adapted to 5.6.1 Signed-off-by: Wolfram Sang +Adapted to 5.7.2 + +Signed-off-by: Alexander Dahl --- - net-snmp-config.in | 8 ++++---- + net-snmp-config.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) -Index: net-snmp-config.in -=================================================================== ---- net-snmp-config.in.orig -+++ net-snmp-config.in -@@ -49,7 +49,7 @@ datarootdir=@datarootdir@ - NSC_LDFLAGS="@LDFLAGS@" - NSC_LNETSNMPLIBS="@LNETSNMPLIBS@" +diff --git a/net-snmp-config.in b/net-snmp-config.in +index 2300fe1..361c658 100644 +--- a/net-snmp-config.in ++++ b/net-snmp-config.in +@@ -54,7 +54,7 @@ NSC_LAGENTLIBS="@LAGENTLIBS@ @PERLLDOPTS_FOR_APPS@" + NSC_LMIBLIBS="@LMIBLIBS@" + NSC_INCLUDEDIR=${includedir} -NSC_LIBDIR=-L${libdir} +NSC_LIBDIR=-L${SYSROOT}${libdir} - NSC_LIBS="@LIBS@" - NSC_AGENTLIBS="@AGENTLIBS@ @PERLLDOPTS_FOR_APPS@" - NSC_PREFIX=$prefix -@@ -127,10 +127,10 @@ else + + NSC_SNMPLIBS="-lnetsnmp ${NSC_LNETSNMPLIBS}" + NSC_SUBAGENTLIBS="-lnetsnmpagent ${NSC_LAGENTLIBS} ${NSC_SNMPLIBS}" +@@ -138,10 +138,10 @@ else ;; #################################################### compile --base-cflags) @@ -39,7 +41,7 @@ Index: net-snmp-config.in ;; --srcdir) echo $NSC_SRCDIR -@@ -588,7 +588,7 @@ EOF +@@ -598,7 +598,7 @@ EOF echo "Ack. Can't create $tmpfile." exit 1 fi diff --git a/patches/net-snmp-5.7.2/0002-Don-t-disable-udp-and-tcp-when-disable-agentx-dom-so.patch b/patches/net-snmp-5.7.2/0002-Don-t-disable-udp-and-tcp-when-disable-agentx-dom-so.patch new file mode 100644 index 0000000..cd6605a --- /dev/null +++ b/patches/net-snmp-5.7.2/0002-Don-t-disable-udp-and-tcp-when-disable-agentx-dom-so.patch @@ -0,0 +1,37 @@ +From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= +Date: Tue, 3 Sep 2013 21:12:46 +0200 +Subject: [PATCH] Don't disable udp and tcp when --disable-agentx-dom-sock-only + is given + +The configure magic without this patch treats all + + --enable-agentx-dom-sock-only + --enable-agentx-dom-sock-only=no + --disable-agentx-dom-sock-only + +the same; i.e. disables the udp and tcp transports. With this patch only the +first option does have this effect which matches the usual and expected +semantic. +--- + configure.d/config_project_with_enable | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/configure.d/config_project_with_enable b/configure.d/config_project_with_enable +index 61ba026..d7c2132 100644 +--- a/configure.d/config_project_with_enable ++++ b/configure.d/config_project_with_enable +@@ -723,9 +723,11 @@ NETSNMP_ARG_ENABLE(local-smux, + fi]) + + NETSNMP_ARG_ENABLE(agentx-dom-sock-only, +-[ --enable-agentx-dom-sock-only Disable UDP/TCP transports for agentx.], +-AC_DEFINE(NETSNMP_AGENTX_DOM_SOCK_ONLY, 1, +- [define if agentx transport is to use domain sockets only])) ++[ --enable-agentx-dom-sock-only Disable UDP/TCP transports for agentx.]) ++if test "x$enable_agentx_dom_sock_only" = "xyes"; then ++ AC_DEFINE(NETSNMP_AGENTX_DOM_SOCK_ONLY, 1, ++ [define if agentx transport is to use domain sockets only]) ++fi + + NETSNMP_ARG_ENABLE(snmptrapd-subagent, + [ --disable-snmptrapd-subagent Disable agentx subagent code in snmptrapd.]) diff --git a/patches/gnuplot-4.4.3/autogen.sh b/patches/net-snmp-5.7.2/autogen.sh similarity index 100% rename from patches/gnuplot-4.4.3/autogen.sh rename to patches/net-snmp-5.7.2/autogen.sh diff --git a/patches/net-snmp-5.7.2/series b/patches/net-snmp-5.7.2/series new file mode 100644 index 0000000..1596362 --- /dev/null +++ b/patches/net-snmp-5.7.2/series @@ -0,0 +1,5 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-net-snmp-config-add-SYSROOT-support.patch +0002-Don-t-disable-udp-and-tcp-when-disable-agentx-dom-so.patch +# 97810382623b86e69e492f3a5712bcf4 - git-ptx-patches magic diff --git a/patches/openssl-1.0.0j/0001-debian-ca.patch b/patches/openssl-1.0.0k/0001-debian-ca.patch similarity index 100% rename from patches/openssl-1.0.0j/0001-debian-ca.patch rename to patches/openssl-1.0.0k/0001-debian-ca.patch diff --git a/patches/openssl-1.0.0j/0002-debian-config-hurd.patch b/patches/openssl-1.0.0k/0002-debian-config-hurd.patch similarity index 100% rename from patches/openssl-1.0.0j/0002-debian-config-hurd.patch rename to patches/openssl-1.0.0k/0002-debian-config-hurd.patch diff --git a/patches/openssl-1.0.0j/0003-debian-debian-targets.patch b/patches/openssl-1.0.0k/0003-debian-debian-targets.patch similarity index 100% rename from patches/openssl-1.0.0j/0003-debian-debian-targets.patch rename to patches/openssl-1.0.0k/0003-debian-debian-targets.patch diff --git a/patches/openssl-1.0.0j/0004-debian-engines-path.patch b/patches/openssl-1.0.0k/0004-debian-engines-path.patch similarity index 100% rename from patches/openssl-1.0.0j/0004-debian-engines-path.patch rename to patches/openssl-1.0.0k/0004-debian-engines-path.patch diff --git a/patches/openssl-1.0.0j/0005-debian-make-targets.patch b/patches/openssl-1.0.0k/0005-debian-make-targets.patch similarity index 100% rename from patches/openssl-1.0.0j/0005-debian-make-targets.patch rename to patches/openssl-1.0.0k/0005-debian-make-targets.patch diff --git a/patches/openssl-1.0.0j/0006-debian-man-dir.patch b/patches/openssl-1.0.0k/0006-debian-man-dir.patch similarity index 100% rename from patches/openssl-1.0.0j/0006-debian-man-dir.patch rename to patches/openssl-1.0.0k/0006-debian-man-dir.patch diff --git a/patches/openssl-1.0.0j/0007-debian-man-section.patch b/patches/openssl-1.0.0k/0007-debian-man-section.patch similarity index 100% rename from patches/openssl-1.0.0j/0007-debian-man-section.patch rename to patches/openssl-1.0.0k/0007-debian-man-section.patch diff --git a/patches/openssl-1.0.0j/0008-debian-no-rpath.patch b/patches/openssl-1.0.0k/0008-debian-no-rpath.patch similarity index 100% rename from patches/openssl-1.0.0j/0008-debian-no-rpath.patch rename to patches/openssl-1.0.0k/0008-debian-no-rpath.patch diff --git a/patches/openssl-1.0.0j/0009-debian-no-symbolic.patch b/patches/openssl-1.0.0k/0009-debian-no-symbolic.patch similarity index 100% rename from patches/openssl-1.0.0j/0009-debian-no-symbolic.patch rename to patches/openssl-1.0.0k/0009-debian-no-symbolic.patch diff --git a/patches/openssl-1.0.0j/0010-debian-pic.patch b/patches/openssl-1.0.0k/0010-debian-pic.patch similarity index 100% rename from patches/openssl-1.0.0j/0010-debian-pic.patch rename to patches/openssl-1.0.0k/0010-debian-pic.patch diff --git a/patches/openssl-1.0.0j/0011-debian-valgrind.patch b/patches/openssl-1.0.0k/0011-debian-valgrind.patch similarity index 100% rename from patches/openssl-1.0.0j/0011-debian-valgrind.patch rename to patches/openssl-1.0.0k/0011-debian-valgrind.patch diff --git a/patches/openssl-1.0.0j/0012-debian-rehash-crt.patch b/patches/openssl-1.0.0k/0012-debian-rehash-crt.patch similarity index 100% rename from patches/openssl-1.0.0j/0012-debian-rehash-crt.patch rename to patches/openssl-1.0.0k/0012-debian-rehash-crt.patch diff --git a/patches/openssl-1.0.0j/0013-debian-rehash_pod.patch b/patches/openssl-1.0.0k/0013-debian-rehash_pod.patch similarity index 100% rename from patches/openssl-1.0.0j/0013-debian-rehash_pod.patch rename to patches/openssl-1.0.0k/0013-debian-rehash_pod.patch diff --git a/patches/openssl-1.0.0j/0014-debian-shared-lib-ext.patch b/patches/openssl-1.0.0k/0014-debian-shared-lib-ext.patch similarity index 100% rename from patches/openssl-1.0.0j/0014-debian-shared-lib-ext.patch rename to patches/openssl-1.0.0k/0014-debian-shared-lib-ext.patch diff --git a/patches/openssl-1.0.0j/0015-debian-stddef.patch b/patches/openssl-1.0.0k/0015-debian-stddef.patch similarity index 100% rename from patches/openssl-1.0.0j/0015-debian-stddef.patch rename to patches/openssl-1.0.0k/0015-debian-stddef.patch diff --git a/patches/openssl-1.0.0j/0016-debian-version-script.patch b/patches/openssl-1.0.0k/0016-debian-version-script.patch similarity index 100% rename from patches/openssl-1.0.0j/0016-debian-version-script.patch rename to patches/openssl-1.0.0k/0016-debian-version-script.patch diff --git a/patches/openssl-1.0.0j/0017-debian-gnu_source.patch b/patches/openssl-1.0.0k/0017-debian-gnu_source.patch similarity index 100% rename from patches/openssl-1.0.0j/0017-debian-gnu_source.patch rename to patches/openssl-1.0.0k/0017-debian-gnu_source.patch diff --git a/patches/openssl-1.0.0j/series b/patches/openssl-1.0.0k/series similarity index 100% rename from patches/openssl-1.0.0j/series rename to patches/openssl-1.0.0k/series diff --git a/patches/opkg-0.1.8/autogen.sh b/patches/opkg-0.1.8/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/opkg-0.1.8/autogen.sh +++ b/patches/opkg-0.1.8/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/owfs-2.8p6/autogen.sh b/patches/owfs-2.8p6/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/owfs-2.8p6/autogen.sh +++ b/patches/owfs-2.8p6/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/polkit-0.96/autogen.sh b/patches/polkit-0.96/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/polkit-0.96/autogen.sh +++ b/patches/polkit-0.96/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/poppler-0.18.0/autogen.sh b/patches/poppler-0.18.0/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/poppler-0.18.0/autogen.sh +++ b/patches/poppler-0.18.0/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/qt-everywhere-opensource-src-4.8.4/0001-mkspec-for-ptxdist.patch b/patches/qt-everywhere-opensource-src-4.8.5/0001-mkspec-for-ptxdist.patch similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/0001-mkspec-for-ptxdist.patch rename to patches/qt-everywhere-opensource-src-4.8.5/0001-mkspec-for-ptxdist.patch diff --git a/patches/qt-everywhere-opensource-src-4.8.4/0002-disable-ordered-compiling.patch b/patches/qt-everywhere-opensource-src-4.8.5/0002-disable-ordered-compiling.patch similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/0002-disable-ordered-compiling.patch rename to patches/qt-everywhere-opensource-src-4.8.5/0002-disable-ordered-compiling.patch diff --git a/patches/qt-everywhere-opensource-src-4.8.4/0003-Hack-hide-cursor-during-startup.patch b/patches/qt-everywhere-opensource-src-4.8.5/0003-Hack-hide-cursor-during-startup.patch similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/0003-Hack-hide-cursor-during-startup.patch rename to patches/qt-everywhere-opensource-src-4.8.5/0003-Hack-hide-cursor-during-startup.patch diff --git a/patches/qt-everywhere-opensource-src-4.8.4/0004-add-missing-subdirs.patch b/patches/qt-everywhere-opensource-src-4.8.5/0004-add-missing-subdirs.patch similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/0004-add-missing-subdirs.patch rename to patches/qt-everywhere-opensource-src-4.8.5/0004-add-missing-subdirs.patch diff --git a/patches/qt-everywhere-opensource-src-4.8.4/0005-Fix-dnd-issue-on-QWS.patch b/patches/qt-everywhere-opensource-src-4.8.5/0005-Fix-dnd-issue-on-QWS.patch similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/0005-Fix-dnd-issue-on-QWS.patch rename to patches/qt-everywhere-opensource-src-4.8.5/0005-Fix-dnd-issue-on-QWS.patch diff --git a/patches/qt-everywhere-opensource-src-4.8.4/0006-qmake-make-sure-local-include-dirs-come-first.patch b/patches/qt-everywhere-opensource-src-4.8.5/0006-qmake-make-sure-local-include-dirs-come-first.patch similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/0006-qmake-make-sure-local-include-dirs-come-first.patch rename to patches/qt-everywhere-opensource-src-4.8.5/0006-qmake-make-sure-local-include-dirs-come-first.patch diff --git a/patches/qt-everywhere-opensource-src-4.8.4/0007-phonon-fix-colors-for-video-on-qgraphicsview.patch b/patches/qt-everywhere-opensource-src-4.8.5/0007-phonon-fix-colors-for-video-on-qgraphicsview.patch similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/0007-phonon-fix-colors-for-video-on-qgraphicsview.patch rename to patches/qt-everywhere-opensource-src-4.8.5/0007-phonon-fix-colors-for-video-on-qgraphicsview.patch diff --git a/patches/qt-everywhere-opensource-src-4.8.4/0008-don-t-build-webkit-tests.patch b/patches/qt-everywhere-opensource-src-4.8.5/0008-don-t-build-webkit-tests.patch similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/0008-don-t-build-webkit-tests.patch rename to patches/qt-everywhere-opensource-src-4.8.5/0008-don-t-build-webkit-tests.patch diff --git a/patches/qt-everywhere-opensource-src-4.8.4/series b/patches/qt-everywhere-opensource-src-4.8.5/series similarity index 100% rename from patches/qt-everywhere-opensource-src-4.8.4/series rename to patches/qt-everywhere-opensource-src-4.8.5/series diff --git a/patches/rt-tests-0.73/add-extra-cflags.patch b/patches/rt-tests-0.73/add-extra-cflags.patch deleted file mode 100644 index fc869c6..0000000 --- a/patches/rt-tests-0.73/add-extra-cflags.patch +++ /dev/null @@ -1,32 +0,0 @@ -CFLAGS are specified in environment as well - -If the environment already has specified CFLAGS we shall -not overwrite them - -Signed-off-by: Remy Bohmer ---- - Makefile | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -Index: rt-tests-0.73/Makefile -=================================================================== ---- rt-tests-0.73.orig/Makefile -+++ rt-tests-0.73/Makefile -@@ -6,7 +6,7 @@ sources = cyclictest.c signaltest.c pi_s - - TARGETS = $(sources:.c=) - --LIBS = -lrt -lpthread -+LIBS = $(LDFLAGS) -lrt -lpthread - EXTRA_LIBS ?= -ldl # for get_cpu - DESTDIR ?= - prefix ?= /usr/local -@@ -14,7 +14,7 @@ bindir ?= $(prefix)/bin - mandir ?= $(prefix)/share/man - srcdir ?= $(prefix)/src - --CFLAGS = -D_GNU_SOURCE -Wall -Wno-nonnull -Isrc/include -+CFLAGS := $(CPPFLAGS) -D_GNU_SOURCE -Wall -Wno-nonnull -Isrc/include $(CFLAGS) - - PYLIB := $(shell python -c 'import distutils.sysconfig; print distutils.sysconfig.get_python_lib()') - diff --git a/patches/rt-tests-0.73/fix_3_0_issue.diff b/patches/rt-tests-0.73/fix_3_0_issue.diff deleted file mode 100644 index a6558b8..0000000 --- a/patches/rt-tests-0.73/fix_3_0_issue.diff +++ /dev/null @@ -1,62 +0,0 @@ -From: Juergen Beisert -Subject: Fix a small Linux-3.x issue - -Without this patch cyclictest states: - -"Most functions require kernel 2.6" - -Signed-off-by: Juergen Beisert - ---- - src/cyclictest/cyclictest.c | 38 ++++++++++++++++++++++---------------- - 1 file changed, 22 insertions(+), 16 deletions(-) - -Index: rt-tests-0.73/src/cyclictest/cyclictest.c -=================================================================== ---- rt-tests-0.73.orig/src/cyclictest/cyclictest.c -+++ rt-tests-0.73/src/cyclictest/cyclictest.c -@@ -1104,22 +1104,28 @@ static int check_kernel(void) - return KV_NOT_26; - } - sscanf(kname.release, "%d.%d.%d", &maj, &min, &sub); -- if (maj == 2 && min == 6) { -- if (sub < 18) -- kv = KV_26_LT18; -- else if (sub < 24) -- kv = KV_26_LT24; -- else if (sub < 28) { -- kv = KV_26_CURR; -- strcpy(functiontracer, "ftrace"); -- strcpy(traceroptions, "iter_ctrl"); -- } else { -- kv = KV_26_CURR; -- strcpy(functiontracer, "function"); -- strcpy(traceroptions, "trace_options"); -- } -- } else -- kv = KV_NOT_26; -+ if (maj == 3) { -+ kv = KV_26_CURR; -+ strcpy(functiontracer, "function"); -+ strcpy(traceroptions, "trace_options"); -+ } else { -+ if (maj == 2 && min == 6) { -+ if (sub < 18) -+ kv = KV_26_LT18; -+ else if (sub < 24) -+ kv = KV_26_LT24; -+ else if (sub < 28) { -+ kv = KV_26_CURR; -+ strcpy(functiontracer, "ftrace"); -+ strcpy(traceroptions, "iter_ctrl"); -+ } else { -+ kv = KV_26_CURR; -+ strcpy(functiontracer, "function"); -+ strcpy(traceroptions, "trace_options"); -+ } -+ } else -+ kv = KV_NOT_26; -+ } - - return kv; - } diff --git a/patches/rt-tests-0.73/series b/patches/rt-tests-0.73/series deleted file mode 100644 index caf1a74..0000000 --- a/patches/rt-tests-0.73/series +++ /dev/null @@ -1,2 +0,0 @@ -fix_3_0_issue.diff -add-extra-cflags.patch diff --git a/patches/rt-tests-0.85/0001-hackbench-init-child-s-struct-before-using-it.patch b/patches/rt-tests-0.85/0001-hackbench-init-child-s-struct-before-using-it.patch new file mode 100644 index 0000000..bce17e1 --- /dev/null +++ b/patches/rt-tests-0.85/0001-hackbench-init-child-s-struct-before-using-it.patch @@ -0,0 +1,57 @@ +From: Sebastian Andrzej Siewior +Date: Thu, 11 Apr 2013 17:20:05 +0200 +Subject: [PATCH] hackbench: init child's struct before using it + +Commit ad27df7 ("Reimplement better child tracking and improve error +handling") changed the way of reporting pid/error after creating a +child. It will return an union which is a mix pid_t, pthread_t and a +signed long long for errors. +Now on 32bit x86 both pid_t and pthread_t are four byte in size and are +stored in the first 4 bytes. Now if the most significant bit of the long +long variable happens to be set by chance (because nobody really +initializes the variable here) then error variable will be negative. On +little endian machines the assignment of pid or threadid won't reset the +sign bit and you see this: + +| Running in process mode with 10 groups using 40 file descriptors each (== 400 tasks) +| Each sender will pass 100 messages of 100 bytes +| 0 children started. Expected 40 +| sending SIGTERM to all child processes +| signaling 0 worker threads to terminate +| Creating workers (error: Success) + +A machine with proper endian handlig (that is big endian) would reset +the sign bit during the assignment of pid and I would not have to make +this patch :) + +While here, I make create_worker() since it is not used outside of this +file. + +Cc: David Sommerseth +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Clark Williams +Origin: upstream, commit:dd6ae1155dc7fbee79426ae5952d48b4151c1cd7 +--- + src/hackbench/hackbench.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/hackbench/hackbench.c b/src/hackbench/hackbench.c +index 8baeb23..c21b4db 100644 +--- a/src/hackbench/hackbench.c ++++ b/src/hackbench/hackbench.c +@@ -189,13 +189,14 @@ again: + return NULL; + } + +-childinfo_t create_worker(void *ctx, void *(*func)(void *)) ++static childinfo_t create_worker(void *ctx, void *(*func)(void *)) + { + pthread_attr_t attr; + int err; + childinfo_t child; + pid_t childpid; + ++ memset(&child, 0, sizeof(child)); + switch (process_mode) { + case PROCESS_MODE: /* process mode */ + /* Fork the sender/receiver child. */ diff --git a/patches/rt-tests-0.85/series b/patches/rt-tests-0.85/series new file mode 100644 index 0000000..98c56a9 --- /dev/null +++ b/patches/rt-tests-0.85/series @@ -0,0 +1,4 @@ +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-hackbench-init-child-s-struct-before-using-it.patch +# a2bd54e2f7cf4c4715141fa0b88505f1 - git-ptx-patches magic diff --git a/patches/serdisplib-1.97.9/autogen.sh b/patches/serdisplib-1.97.9/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/serdisplib-1.97.9/autogen.sh +++ b/patches/serdisplib-1.97.9/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/splashutils-1.5.4.3/autogen.sh b/patches/splashutils-1.5.4.3/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/splashutils-1.5.4.3/autogen.sh +++ b/patches/splashutils-1.5.4.3/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/ssmtp-2.64/0001-use-LDFLAGS-for-linking.patch b/patches/ssmtp-2.64/0001-use-LDFLAGS-for-linking.patch new file mode 100644 index 0000000..9ad40df --- /dev/null +++ b/patches/ssmtp-2.64/0001-use-LDFLAGS-for-linking.patch @@ -0,0 +1,25 @@ +From: Robert Schwebel +Date: Wed, 14 Aug 2013 10:24:18 +0200 +Subject: [PATCH] use LDFLAGS for linking + +Please use LDFLAGS, not CFLAGS, for linking. This makes it possible to +overwrite the variable from the outside and do the correct thing. + +Signed-off-by: Robert Schwebel +--- + Makefile.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile.in b/Makefile.in +index f0aff41..d235182 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -79,7 +79,7 @@ uninstall-sendmail: uninstall + + # Binaries: + ssmtp: $(OBJS) +- $(CC) -o ssmtp $(OBJS) @LIBS@ $(CFLAGS) ++ $(CC) -o ssmtp $(OBJS) $(LDFLAGS) @LIBS@ + + .PHONY: clean + clean: diff --git a/patches/ssmtp-2.64/0002-use-DESTDIR-when-installing.patch b/patches/ssmtp-2.64/0002-use-DESTDIR-when-installing.patch new file mode 100644 index 0000000..537d012 --- /dev/null +++ b/patches/ssmtp-2.64/0002-use-DESTDIR-when-installing.patch @@ -0,0 +1,72 @@ +From: Robert Schwebel +Date: Wed, 14 Aug 2013 10:24:18 +0200 +Subject: [PATCH] use DESTDIR when installing + +Prefix all paths with DESTDIR when installing + +Signed-off-by: Robert Schwebel +--- + Makefile.in | 40 ++++++++++++++++++++-------------------- + 1 file changed, 20 insertions(+), 20 deletions(-) + +diff --git a/Makefile.in b/Makefile.in +index d235182..756d754 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -46,36 +46,36 @@ all: ssmtp + + .PHONY: install + install: ssmtp $(GEN_CONFIG) +- $(INSTALL) -d -m 755 $(bindir) +- $(INSTALL) -s -m 755 ssmtp $(bindir)/ssmtp +- $(INSTALL) -d -m 755 $(mandir) +- $(INSTALL) -m 644 $(srcdir)/ssmtp.8 $(mandir)/ssmtp.8 +- $(INSTALL) -d -m 755 $(SSMTPCONFDIR) +- $(INSTALL) -m 644 $(srcdir)/revaliases $(INSTALLED_REVALIASES_FILE) +- $(GEN_CONFIG) $(INSTALLED_CONFIGURATION_FILE) ++ $(INSTALL) -d -m 755 $(DESTDIR)$(bindir) ++ $(INSTALL) -s -m 755 ssmtp $(DESTDIR)$(bindir)/ssmtp ++ $(INSTALL) -d -m 755 $(DESTDIR)$(mandir) ++ $(INSTALL) -m 644 $(srcdir)/ssmtp.8 $(DESTDIR)$(mandir)/ssmtp.8 ++ $(INSTALL) -d -m 755 $(DESTDIR)$(SSMTPCONFDIR) ++ $(INSTALL) -m 644 $(srcdir)/revaliases $(DESTDIR)$(INSTALLED_REVALIASES_FILE) ++ $(GEN_CONFIG) $(DESTDIR)$(INSTALLED_CONFIGURATION_FILE) + + + .PHONY: install-sendmail + install-sendmail: install +- $(RM) $(bindir)/sendmail +- $(LN_S) ssmtp $(bindir)/sendmail +- $(INSTALL) -d -m 755 $(libexecdir) +- $(RM) $(libexecdir)/sendmail +- $(LN_S) sendmail /lib/sendmail +- $(RM) $(mandir)/sendmail.8 +- $(LN_S) ssmtp.8 $(mandir)/sendmail.8 ++ $(RM) $(DESTDIR)$(bindir)/sendmail ++ $(LN_S) ssmtp $(DESTDIR)$(bindir)/sendmail ++ $(INSTALL) -d -m 755 $(DESTDIR)$(libexecdir) ++ $(RM) $(DESTDIR)$(libexecdir)/sendmail ++ $(LN_S) sendmail $(DESTDIR)/lib/sendmail ++ $(RM) $(DESTDIR)$(mandir)/sendmail.8 ++ $(LN_S) ssmtp.8 $(DESTDIR)$(mandir)/sendmail.8 + + .PHONY: uninstall + uninstall: +- $(RM) $(bindir)/ssmtp +- $(RM) $(mandir)/ssmtp.8 +- $(RM) $(CONFIGURATION_FILE) $(REVALIASES_FILE) +- $(RM) -r $(SSMTPCONFDIR) ++ $(RM) $(DESTDIR)$(bindir)/ssmtp ++ $(RM) $(DESTDIR)$(mandir)/ssmtp.8 ++ $(RM) $$(DESTDIR)(CONFIGURATION_FILE) $(DESTDIR)$(REVALIASES_FILE) ++ $(RM) -r $(DESTDIR)$(SSMTPCONFDIR) + + .PHONY: uninstall-sendmail + uninstall-sendmail: uninstall +- $(RM) $(bindir)/sendmail /lib/sendmail +- $(RM) $(mandir)/sendmail.8 ++ $(RM) $(DESTDIR)$(bindir)/sendmail $(DESTDIR)/lib/sendmail ++ $(RM) $(DESTDIR)$(mandir)/sendmail.8 + + # Binaries: + ssmtp: $(OBJS) diff --git a/patches/ssmtp-2.64/0003-make-installing-non-interactive.patch b/patches/ssmtp-2.64/0003-make-installing-non-interactive.patch new file mode 100644 index 0000000..0536d9a --- /dev/null +++ b/patches/ssmtp-2.64/0003-make-installing-non-interactive.patch @@ -0,0 +1,34 @@ +From: Michael Olbrich +Date: Wed, 14 Aug 2013 10:24:18 +0200 +Subject: [PATCH] make installing non-interactive + +$(GEN_CONFIG) need user ineraction to create a config file. +It doesn't work for cross-compiling and we don't need it. + +Not for upstream. + +Signed-off-by: Michael Olbrich +--- + Makefile.in | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/Makefile.in b/Makefile.in +index 756d754..cb3610c 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -45,14 +45,13 @@ all: ssmtp + latex $< + + .PHONY: install +-install: ssmtp $(GEN_CONFIG) ++install: ssmtp + $(INSTALL) -d -m 755 $(DESTDIR)$(bindir) + $(INSTALL) -s -m 755 ssmtp $(DESTDIR)$(bindir)/ssmtp + $(INSTALL) -d -m 755 $(DESTDIR)$(mandir) + $(INSTALL) -m 644 $(srcdir)/ssmtp.8 $(DESTDIR)$(mandir)/ssmtp.8 + $(INSTALL) -d -m 755 $(DESTDIR)$(SSMTPCONFDIR) + $(INSTALL) -m 644 $(srcdir)/revaliases $(DESTDIR)$(INSTALLED_REVALIASES_FILE) +- $(GEN_CONFIG) $(DESTDIR)$(INSTALLED_CONFIGURATION_FILE) + + + .PHONY: install-sendmail diff --git a/patches/ssmtp-2.64/0004-configure-if-using-ssl-link-against-libcrypto-too.patch b/patches/ssmtp-2.64/0004-configure-if-using-ssl-link-against-libcrypto-too.patch new file mode 100644 index 0000000..e69cf34 --- /dev/null +++ b/patches/ssmtp-2.64/0004-configure-if-using-ssl-link-against-libcrypto-too.patch @@ -0,0 +1,35 @@ +From: Marc Kleine-Budde +Date: Wed, 14 Aug 2013 10:27:05 +0200 +Subject: [PATCH] configure: if using ssl link against libcrypto, too + +otherwise linking fails with: +arm-v5te-linux-gnueabi-gcc -o ssmtp ssmtp.o arpadate.o base64.o xgethostname.o md5auth/md5c.o md5auth/hmac_md5.o -lnsl -lssl +/opt/OSELAS.Toolchain-2012.12.1/arm-v5te-linux-gnueabi/gcc-4.7.2-glibc-2.16.0-binutils-2.22-kernel-3.6-sanitized/lib/gcc/arm-v5te-linux-gnueabi/4.7.2/../../../../arm-v5te-linux-gnueabi/bin/ld: +ssmtp.o: undefined reference to symbol 'X509_free@@OPENSSL_1.0.0' +/opt/OSELAS.Toolchain-2012.12.1/arm-v5te-linux-gnueabi/gcc-4.7.2-glibc-2.16.0-binutils-2.22-kernel-3.6-sanitized/lib/gcc/arm-v5te-linux-gnueabi/4.7.2/../../../../arm-v5te-linux-gnueabi/bin/ld: +note: 'X509_free@@OPENSSL_1.0.0' is defined in DSO +XXXXX/sysroot-target/usr/lib/libcrypto.so.1.0.0 so try adding it to the +linker command line +XXXXX/sysroot-target/usr/lib/libcrypto.so.1.0.0: could not read symbols: +Invalid operation +collect2: error: ld returned 1 exit status + +Reported-by: Alexander Dahl +Signed-off-by: Marc Kleine-Budde +--- + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure.in b/configure.in +index 2d7221d..0633add 100644 +--- a/configure.in ++++ b/configure.in +@@ -52,7 +52,7 @@ AC_ARG_ENABLE(ssl, + [ --enable-ssl support for secure connection to mail server]) + if test x$enableval = xyes ; then + AC_DEFINE(HAVE_SSL) +- LIBS="$LIBS -lssl" ++ LIBS="$LIBS -lssl -lcrypto" + fi + enableval="" + diff --git a/patches/ssmtp-2.64/autogen.sh b/patches/ssmtp-2.64/autogen.sh new file mode 120000 index 0000000..7c32d1a --- /dev/null +++ b/patches/ssmtp-2.64/autogen.sh @@ -0,0 +1 @@ +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/ssmtp-2.64/series b/patches/ssmtp-2.64/series index eb26121..b89ac63 100644 --- a/patches/ssmtp-2.64/series +++ b/patches/ssmtp-2.64/series @@ -1,3 +1,7 @@ -ssmtp-2.61-ldflags.diff -ssmtp-2.64-destdir.diff -ssmtp-2.64-non-interactive-install.diff +# generated by git-ptx-patches +#tag:base --start-number 1 +0001-use-LDFLAGS-for-linking.patch +0002-use-DESTDIR-when-installing.patch +0003-make-installing-non-interactive.patch +0004-configure-if-using-ssl-link-against-libcrypto-too.patch +# 4ac054ecac57de7c903a18a4dfcd2270 - git-ptx-patches magic diff --git a/patches/tslib-1.0/autogen.sh b/patches/tslib-1.0/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/tslib-1.0/autogen.sh +++ b/patches/tslib-1.0/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/udisks-1.0.0/autogen.sh b/patches/udisks-1.0.0/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/udisks-1.0.0/autogen.sh +++ b/patches/udisks-1.0.0/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/unfs3-0.9.22/0002-fix-unfs3-build-with-recent-versions-of-flex.patch b/patches/unfs3-0.9.22/0002-fix-unfs3-build-with-recent-versions-of-flex.patch new file mode 100644 index 0000000..2643956 --- /dev/null +++ b/patches/unfs3-0.9.22/0002-fix-unfs3-build-with-recent-versions-of-flex.patch @@ -0,0 +1,22 @@ +From: Lucas Stach +Date: Wed, 12 Jun 2013 11:24:58 +0200 +Subject: [PATCH] fix unfs3 build with recent versions of flex + +Signed-off-by: Lucas Stach +--- + Config/exports.l | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/Config/exports.l b/Config/exports.l +index 8a2d6d1..8aa2011 100644 +--- a/Config/exports.l ++++ b/Config/exports.l +@@ -36,6 +36,8 @@ static void copy_text(const char *from, int leng) + } + %} + ++%option noyywrap ++ + WHITE [ \t] + NOWHITE [^ \n\t] + PATH "/"{NOWHITE}* diff --git a/patches/unfs3-0.9.22/series b/patches/unfs3-0.9.22/series index 242765c..b6fcb38 100644 --- a/patches/unfs3-0.9.22/series +++ b/patches/unfs3-0.9.22/series @@ -1,4 +1,5 @@ # generated by git-ptx-patches #tag:base --start-number 1 0001-HACK-use-the-environment-variable-UNFS_BASE-as-root-.patch -# 30c3c8b49f4355b5352cae8eda795b4d - git-ptx-patches magic +0002-fix-unfs3-build-with-recent-versions-of-flex.patch +# d6aa3d6dc84fdde0ed4ec62b8f23a731 - git-ptx-patches magic diff --git a/patches/usplash_0.5.49/autogen.sh b/patches/usplash_0.5.49/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/usplash_0.5.49/autogen.sh +++ b/patches/usplash_0.5.49/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/util-linux-2.21.2/0003-replace-index-with-strchr.patch b/patches/util-linux-2.21.2/0003-replace-index-with-strchr.patch deleted file mode 100644 index 71fcdd0..0000000 --- a/patches/util-linux-2.21.2/0003-replace-index-with-strchr.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Jon Ringle -Date: Tue, 24 May 2011 12:14:09 -0400 -Subject: [PATCH] replace index with strchr - -index is deprecated and not available in uclibc -replace with strchr - -Signed-off-by: Jon Ringle ---- - libmount/src/tab_parse.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c -index 0bfae8a..489ef1f 100644 ---- a/libmount/src/tab_parse.c -+++ b/libmount/src/tab_parse.c -@@ -306,14 +306,14 @@ static int mnt_table_parse_next(struct libmnt_table *tb, FILE *f, struct libmnt_ - if (fgets(buf, sizeof(buf), f) == NULL) - return -EINVAL; - ++*nlines; -- s = index (buf, '\n'); -+ s = strchr (buf, '\n'); - if (!s) { - /* Missing final newline? Otherwise extremely */ - /* long line - assume file was corrupted */ - if (feof(f)) { - DBG(TAB, mnt_debug_h(tb, - "%s: no final newline", filename)); -- s = index (buf, '\0'); -+ s = strchr (buf, '\0'); - } else { - DBG(TAB, mnt_debug_h(tb, - "%s:%d: missing newline at line", diff --git a/patches/util-linux-2.21.2/0004-text-utils-hexsyntax.c-fix-for-missing-program_invoc.patch b/patches/util-linux-2.21.2/0004-text-utils-hexsyntax.c-fix-for-missing-program_invoc.patch deleted file mode 100644 index 51e28d4..0000000 --- a/patches/util-linux-2.21.2/0004-text-utils-hexsyntax.c-fix-for-missing-program_invoc.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: =?UTF-8?q?Andreas=20Bie=C3=9Fmann?= -Date: Tue, 29 May 2012 09:51:24 +0200 -Subject: [PATCH] text-utils/hexsyntax.c: fix for missing - program_invocation_short_name -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Some libc do not expose program_invocation_short_name. Therefore util-linux -comes with helpers in 'c.h'. Use the 'c.h' in hexsyntax.c where it was missed. - -This patch fixes following error for me: ----8<--- -hexsyntax.c: In function 'newsyntax': -hexsyntax.c:115: error: 'program_invocation_short_name' undeclared (first use in this function) -hexsyntax.c:115: error: (Each undeclared identifier is reported only once -hexsyntax.c:115: error: for each function it appears in.) ---->8--- - -Signed-off-by: Andreas Bießmann ---- - text-utils/hexsyntax.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/text-utils/hexsyntax.c b/text-utils/hexsyntax.c -index 5cdd1de..74146c8 100644 ---- a/text-utils/hexsyntax.c -+++ b/text-utils/hexsyntax.c -@@ -45,6 +45,7 @@ - #include "hexdump.h" - #include "nls.h" - #include "strutils.h" -+#include "c.h" - - off_t skip; /* bytes to skip */ - diff --git a/patches/util-linux-2.21.2/0001-libmount-add-fallbacks-for-old-systems-without-umoun.patch b/patches/util-linux-2.23.1/0001-libmount-add-fallbacks-for-old-systems-without-umoun.patch similarity index 88% rename from patches/util-linux-2.21.2/0001-libmount-add-fallbacks-for-old-systems-without-umoun.patch rename to patches/util-linux-2.23.1/0001-libmount-add-fallbacks-for-old-systems-without-umoun.patch index b00a429..79334c3 100644 --- a/patches/util-linux-2.21.2/0001-libmount-add-fallbacks-for-old-systems-without-umoun.patch +++ b/patches/util-linux-2.23.1/0001-libmount-add-fallbacks-for-old-systems-without-umoun.patch @@ -6,16 +6,16 @@ Subject: [PATCH] libmount: add fallbacks for old systems without umount2() Reported-by: Peter Breitenlohner Signed-off-by: Karel Zak --- - libmount/src/context_umount.c | 28 ++++++++++++++++++++++++++++ + libmount/src/context_umount.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/libmount/src/context_umount.c b/libmount/src/context_umount.c -index 98019ce..3eb1212 100644 +index 4a8659c..2f74ef7 100644 --- a/libmount/src/context_umount.c +++ b/libmount/src/context_umount.c -@@ -39,6 +39,34 @@ - #endif - +@@ -178,6 +178,34 @@ err: + return rc; + } +#if defined(MNT_FORCE) +/* Interesting ... it seems libc knows about MNT_FORCE and presumably @@ -47,4 +47,4 @@ index 98019ce..3eb1212 100644 + static int lookup_umount_fs(struct libmnt_context *cxt) { - int rc, loopdev = 0; + const char *tgt; diff --git a/patches/util-linux-2.21.2/0002-__progname-redefinition-fix.patch b/patches/util-linux-2.23.1/0002-__progname-redefinition-fix.patch similarity index 81% rename from patches/util-linux-2.21.2/0002-__progname-redefinition-fix.patch rename to patches/util-linux-2.23.1/0002-__progname-redefinition-fix.patch index caef95e..46e4b3b 100644 --- a/patches/util-linux-2.21.2/0002-__progname-redefinition-fix.patch +++ b/patches/util-linux-2.23.1/0002-__progname-redefinition-fix.patch @@ -11,18 +11,18 @@ In file included from ../include/writeall.h:7, Signed-off-by: Jon Ringle --- - lib/at.c | 1 + - lib/tt.c | 1 + - libmount/src/cache.c | 1 + - libmount/src/iter.c | 1 + - libmount/src/tab_parse.c | 1 + + lib/at.c | 1 + + lib/tt.c | 1 + + libmount/src/cache.c | 1 + + libmount/src/iter.c | 1 + + libmount/src/tab_parse.c | 1 + 5 files changed, 5 insertions(+) diff --git a/lib/at.c b/lib/at.c -index 062a10f..60f2a2a 100644 +index f8bfe13..e715e5f 100644 --- a/lib/at.c +++ b/lib/at.c -@@ -7,6 +7,7 @@ +@@ -10,6 +10,7 @@ #include #include #include @@ -31,7 +31,7 @@ index 062a10f..60f2a2a 100644 #include "at.h" #include "c.h" diff --git a/lib/tt.c b/lib/tt.c -index 16a0098..930e85c 100644 +index cbe4e3b..ca53a5a 100644 --- a/lib/tt.c +++ b/lib/tt.c @@ -15,6 +15,7 @@ @@ -39,11 +39,11 @@ index 16a0098..930e85c 100644 #include #include +#include - #ifdef HAVE_SYS_IOCTL_H - #include - #endif + #include + + #include "c.h" diff --git a/libmount/src/cache.c b/libmount/src/cache.c -index f3156a5..ad32b24 100644 +index 7b65122..9d066e3 100644 --- a/libmount/src/cache.c +++ b/libmount/src/cache.c @@ -23,6 +23,7 @@ @@ -55,7 +55,7 @@ index f3156a5..ad32b24 100644 #include "canonicalize.h" #include "mountP.h" diff --git a/libmount/src/iter.c b/libmount/src/iter.c -index 393c23e..211d465 100644 +index d7b8adb..1a20acb 100644 --- a/libmount/src/iter.c +++ b/libmount/src/iter.c @@ -16,6 +16,7 @@ @@ -67,7 +67,7 @@ index 393c23e..211d465 100644 #include "mountP.h" diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c -index 28c8536..0bfae8a 100644 +index e930fd8..1cb8f9d 100644 --- a/libmount/src/tab_parse.c +++ b/libmount/src/tab_parse.c @@ -15,6 +15,7 @@ diff --git a/patches/util-linux-2.21.2/series b/patches/util-linux-2.23.1/series similarity index 50% rename from patches/util-linux-2.21.2/series rename to patches/util-linux-2.23.1/series index 9718184..1454bce 100644 --- a/patches/util-linux-2.21.2/series +++ b/patches/util-linux-2.23.1/series @@ -2,6 +2,4 @@ #tag:base --start-number 1 0001-libmount-add-fallbacks-for-old-systems-without-umoun.patch 0002-__progname-redefinition-fix.patch -0003-replace-index-with-strchr.patch -0004-text-utils-hexsyntax.c-fix-for-missing-program_invoc.patch -# f153341f4051f66cbeedef2bbd15c9cf - git-ptx-patches magic +# afd57198fa5bc0e91e11bef53e764212 - git-ptx-patches magic diff --git a/patches/valgrind-3.8.1/autogen.sh b/patches/valgrind-3.8.1/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/valgrind-3.8.1/autogen.sh +++ b/patches/valgrind-3.8.1/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/wireshark-1.2.5/autogen-generic.sh b/patches/wireshark-1.2.5/autogen-generic.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/wireshark-1.2.5/autogen-generic.sh +++ b/patches/wireshark-1.2.5/autogen-generic.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/xmlstarlet-1.0.1/autogen.sh b/patches/xmlstarlet-1.0.1/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/xmlstarlet-1.0.1/autogen.sh +++ b/patches/xmlstarlet-1.0.1/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/patches/xorg-server-1.12.2/autogen.sh b/patches/xorg-server-1.12.2/autogen.sh index 9f8a4cb..7c32d1a 120000 --- a/patches/xorg-server-1.12.2/autogen.sh +++ b/patches/xorg-server-1.12.2/autogen.sh @@ -1 +1 @@ -../autogen.sh \ No newline at end of file +/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file diff --git a/platforms/dtc.in b/platforms/dtc.in index 470c36f..6f4f64e 100644 --- a/platforms/dtc.in +++ b/platforms/dtc.in @@ -44,7 +44,7 @@ config DTC_INSTALL_OFTREE config DTC_OFTREE_DTS string "source dts file" - default "${KERNEL_DIR}/arch/powerpc/boot/dts/.dts" + default "${KERNEL_DIR}/arch/${PTXCONF_KERNEL_ARCH_STRING}/boot/dts/.dts" help Select the dts file to use for the device tree binary blob generation. Default is to use the one shipped with diff --git a/rules/Kconfig b/rules/Kconfig index b8aed5f..d98ba0d 100644 --- a/rules/Kconfig +++ b/rules/Kconfig @@ -86,9 +86,12 @@ menu "System Libraries " source "generated/system_libraries.in" endmenu +menu "Security " menu "SELinux " source "generated/selinux.in" endmenu +source "generated/security.in" +endmenu menu "Middleware " source "generated/middleware.in" diff --git a/rules/avahi.in b/rules/avahi.in index ebfa6d4..eab2467 100644 --- a/rules/avahi.in +++ b/rules/avahi.in @@ -29,6 +29,7 @@ config AVAHI_GLIB config AVAHI_GOBJECT bool + select AVAHI_GLIB prompt "enable gobject support" help --enable-gobject diff --git a/rules/barebox.make b/rules/barebox.make index ac10127..cfbca80 100644 --- a/rules/barebox.make +++ b/rules/barebox.make @@ -153,7 +153,7 @@ barebox_oldconfig barebox_menuconfig barebox_nconfig: $(STATEDIR)/barebox.extrac @if test -e $(BAREBOX_CONFIG); then \ cp $(BAREBOX_CONFIG) $(BAREBOX_DIR)/.config; \ fi - cd $(BAREBOX_DIR) && \ + @cd $(BAREBOX_DIR) && \ $(BAREBOX_PATH) $(BAREBOX_ENV) $(MAKE) $(BAREBOX_MAKEVARS) $(subst barebox_,,$@) @if cmp -s $(BAREBOX_DIR)/.config $(BAREBOX_CONFIG); then \ echo "barebox configuration unchanged"; \ diff --git a/rules/bash.in b/rules/bash.in index 7ef65a9..8295ad5 100644 --- a/rules/bash.in +++ b/rules/bash.in @@ -4,6 +4,8 @@ menuconfig BASH select LIBC_DL select GCCLIBS_GCC_S select NCURSES if BASH_CURSES + # disabling this is currently broken + select BASH_CONDITIONAL help The GNU Bourne Again SHell Bash is an sh-compatible command language interpreter that executes diff --git a/rules/busybox.make b/rules/busybox.make index 783bd21..31ef1ee 100644 --- a/rules/busybox.make +++ b/rules/busybox.make @@ -16,12 +16,8 @@ PACKAGES-$(PTXCONF_BUSYBOX) += busybox # # Paths and names # -#BUSYBOX_VERSION := 1.20.2 -#BUSYBOX_MD5 := e025414bc6cd79579cc7a32a45d3ae1c - BUSYBOX_VERSION := 1.21.0 BUSYBOX_MD5 := d613f2e4b580305c1de8691f7b84285e - BUSYBOX := busybox-$(BUSYBOX_VERSION) BUSYBOX_SUFFIX := tar.bz2 BUSYBOX_URL := http://www.busybox.net/downloads/$(BUSYBOX).$(BUSYBOX_SUFFIX) @@ -55,12 +51,11 @@ BUSYBOX_MAKE_OPT := \ V=$(PTXDIST_VERBOSE) \ ARCH=$(PTXCONF_ARCH_STRING) \ SUBARCH=$(PTXCONF_ARCH_STRING) \ - CROSS_COMPILE=$(COMPILER_PREFIX) \ - HOSTCC=$(HOSTCC) + CROSS_COMPILE=$(COMPILER_PREFIX) BUSYBOX_MAKE_ENV := \ $(CROSS_ENV) \ - CFLAGS="$(CROSS_CFLAGS) -I$(KERNEL_HEADERS_INCLUDE_DIR)" \ + CFLAGS="-I$(KERNEL_HEADERS_INCLUDE_DIR)" \ SKIP_STRIP=y BUSYBOX_INSTALL_ENV := \ @@ -238,7 +233,7 @@ ifdef PTXCONF_BUSYBOX_CROND endif ifdef PTXCONF_BUSYBOX_BB_SYSCTL - @$(call install_alternative, busybox, 0, 0, 0755, /etc/sysctl.conf) + @$(call install_alternative, busybox, 0, 0, 0644, /etc/sysctl.conf) endif @$(call install_finish, busybox) diff --git a/rules/classpath.in b/rules/classpath.in index 94d0dba..16017b2 100644 --- a/rules/classpath.in +++ b/rules/classpath.in @@ -4,6 +4,7 @@ config CLASSPATH tristate prompt "classpath" select GCCLIBS_GCC_S + select HOST_SYSTEM_JDK help GNU Classpath, Essential Libraries for Java, is a GNU project to create free core class libraries for use with virtual machines and compilers diff --git a/rules/classpath.make b/rules/classpath.make index 251704e..ad3b7e7 100644 --- a/rules/classpath.make +++ b/rules/classpath.make @@ -13,14 +13,6 @@ # PACKAGES-$(PTXCONF_CLASSPATH) += classpath -ifdef PTXCONF_CLASSPATH -ifeq ($(shell test -x $(PTXCONF_SETUP_JAVA_SDK)/bin/javac || echo no),no) - $(warning *** javac is mandatory to build classpath) - $(warning *** please run 'ptxdist setup' and set the path to the java sdk) - $(error ) -endif -endif - # # Paths and names # diff --git a/rules/comgt.in b/rules/comgt.in new file mode 100644 index 0000000..8b1e11d --- /dev/null +++ b/rules/comgt.in @@ -0,0 +1,7 @@ +## SECTION=networking + +config COMGT + tristate + prompt "comgt" + help + Linux UMTS/GPRS command-line tool diff --git a/rules/comgt.make b/rules/comgt.make new file mode 100644 index 0000000..8228f78 --- /dev/null +++ b/rules/comgt.make @@ -0,0 +1,63 @@ +# -*-makefile-*- +# +# Copyright (C) 2012 by Bernhard Walle +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_COMGT) += comgt + +# +# Paths and names +# +COMGT_VERSION := 0.32 +COMGT_MD5 := db2452680c3d953631299e331daf49ef +COMGT := comgt.$(COMGT_VERSION) +COMGT_SUFFIX := tgz +COMGT_URL := $(call ptx/mirror, SF, comgt/$(COMGT).$(COMGT_SUFFIX)) +COMGT_SOURCE := $(SRCDIR)/$(COMGT).$(COMGT_SUFFIX) +COMGT_DIR := $(BUILDDIR)/$(COMGT) +COMGT_LICENSE := GPLv2 + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +COMGT_CONF_TOOL := NO +COMGT_MAKE_ENV := $(CROSS_ENV) + +# ---------------------------------------------------------------------------- +# Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/comgt.install: + @$(call targetinfo) + @install -D -m0755 $(COMGT_DIR)/comgt $(COMGT_PKGDIR)/usr/sbin/comgt + @$(call touch) + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/comgt.targetinstall: + @$(call targetinfo) + + @$(call install_init, comgt) + @$(call install_fixup, comgt,PRIORITY,optional) + @$(call install_fixup, comgt,SECTION,base) + @$(call install_fixup, comgt,AUTHOR,"Bernhard Walle ") + @$(call install_fixup, comgt,DESCRIPTION,missing) + + @$(call install_copy, comgt, 0, 0, 0755, -, /usr/sbin/comgt) + + @$(call install_finish, comgt) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/commoncpp2.in b/rules/commoncpp2.in index b91490f..d25d807 100644 --- a/rules/commoncpp2.in +++ b/rules/commoncpp2.in @@ -8,8 +8,6 @@ menuconfig COMMONCPP2 select LIBC_PTHREAD select GCCLIBS_CXX select ZLIB if COMMONCPP2_LIBZ - select LIBXML2 if COMMONCPP2_LIBXML2 - select LIBXML2_PUSH if COMMONCPP2_LIBXML2 help GNU Common C++ is a portable and highly optimized class framework for writing C++ applications that need to use threads, @@ -25,8 +23,4 @@ config COMMONCPP2_LIBZ bool prompt "enable libz compression" -config COMMONCPP2_LIBXML2 - bool - prompt "enable libxml2 parser" - endif diff --git a/rules/commoncpp2.make b/rules/commoncpp2.make index f0df90c..699156d 100644 --- a/rules/commoncpp2.make +++ b/rules/commoncpp2.make @@ -41,9 +41,10 @@ COMMONCPP2_MAKE_PAR := NO # COMMONCPP2_AUTOCONF := \ $(CROSS_AUTOCONF_USR) \ + --disable-static \ --disable-debug \ --disable-profiling \ - --without-ipv6 \ + --$(call ptx/wwo, PTXCONF_GLOBAL_IPV6)-ipv6 \ --without-nat \ --without-gnutls \ --without-openssl \ @@ -59,10 +60,6 @@ ifndef PTXCONF_COMMONCPP2_LIBZ COMMONCPP2_AUTOCONF += --without-compression endif -ifndef PTXCONF_COMMONCPP2_LIBXML2 -COMMONCPP2_AUTOCONF += --without-libxml2 -endif - # ---------------------------------------------------------------------------- # Target-Install # ---------------------------------------------------------------------------- diff --git a/rules/crda.in b/rules/crda.in index e02c76f..5e79511 100644 --- a/rules/crda.in +++ b/rules/crda.in @@ -2,7 +2,7 @@ config CRDA tristate - select LIBNL + select LIBNL3 select OPENSSL select OPENSSL_SHARED prompt "crda" diff --git a/rules/crda.make b/rules/crda.make index 944c57e..18069e1 100644 --- a/rules/crda.make +++ b/rules/crda.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_CRDA) += crda # # Paths and names # -CRDA_VERSION := 1.1.2 -CRDA_MD5 := 5226f65aebacf94baaf820f8b4e06df4 +CRDA_VERSION := 1.1.3 +CRDA_MD5 := 29579185e06a75675507527243d28e5c CRDA := crda-$(CRDA_VERSION) CRDA_SUFFIX := tar.bz2 CRDA_URL := http://linuxwireless.org/download/crda/$(CRDA).$(CRDA_SUFFIX) diff --git a/rules/cross-insight.make b/rules/cross-insight.make index 467c158..9f38fed 100644 --- a/rules/cross-insight.make +++ b/rules/cross-insight.make @@ -29,6 +29,10 @@ CROSS_INSIGHT_DIR := $(CROSS_BUILDDIR)/$(CROSS_INSIGHT) # Prepare # ---------------------------------------------------------------------------- +CROSS_INSIGHT_CONF_ENV := \ + $(HOST_CROSS_ENV) \ + MAKEINFO=: + # # autoconf # diff --git a/rules/cross-nasm.in b/rules/cross-nasm.in index 333b332..9cf75ba 100644 --- a/rules/cross-nasm.in +++ b/rules/cross-nasm.in @@ -1,4 +1,5 @@ ## SECTION=crosstools +## SECTION=hosttools_platform config CROSS_NASM bool diff --git a/rules/cvs.in b/rules/cvs.in index 41a2a4a..61bacc2 100644 --- a/rules/cvs.in +++ b/rules/cvs.in @@ -30,6 +30,7 @@ config CVS_NDBM config CVS_CLIENT bool + select CVS_PSSWRD_CLIENT prompt "Build cvs client" help Include code for running as a remote client diff --git a/rules/dbus.make b/rules/dbus.make index b496b0b..7018158 100644 --- a/rules/dbus.make +++ b/rules/dbus.make @@ -18,8 +18,8 @@ PACKAGES-$(PTXCONF_DBUS) += dbus # # Paths and names # -DBUS_VERSION := 1.6.4 -DBUS_MD5 := 5ec43dc4554cba638917317b2b4f7640 +DBUS_VERSION := 1.6.10 +DBUS_MD5 := de4970c20629aeb958a12132415b3630 DBUS := dbus-$(DBUS_VERSION) DBUS_SUFFIX := tar.gz DBUS_URL := http://dbus.freedesktop.org/releases/dbus/$(DBUS).$(DBUS_SUFFIX) diff --git a/rules/devicekit-disks.in b/rules/devicekit-disks.in index defb7e3..b684c2b 100644 --- a/rules/devicekit-disks.in +++ b/rules/devicekit-disks.in @@ -1,5 +1,11 @@ ## SECTION=shell_and_console +comment "devicekit conflicts with BusyBox' mount!" + depends on BUSYBOX_MOUNT + +comment "devicekit conflicts with BusyBox' umount!" + depends on BUSYBOX_MOUNT + menuconfig DEVICEKIT_DISKS tristate select HOST_LIBXSLT @@ -11,12 +17,14 @@ menuconfig DEVICEKIT_DISKS select UDEV_LIBUDEV select UDEV_LIBGUDEV # busybox mount can't handle all the options + depends on !BUSYBOX_MOUNT || ALLYES + depends on !BUSYBOX_UMOUNT || ALLYES select UTIL_LINUX_NG select UTIL_LINUX_NG_MOUNT select UTIL_LINUX_NG_UMOUNT select FAKE_OVERLAYFS if DEVICEKIT_DISKS_FAKE_OVERLAYFS - select FAKE_OVERLAYFS_VAR_TMP if DEVICEKIT_DISKS_FAKE_OVERLAYFS - select FAKE_OVERLAYFS_VAR_RUN if DEVICEKIT_DISKS_FAKE_OVERLAYFS + select FAKE_OVERLAYFS_VAR_TMP if DEVICEKIT_DISKS_FAKE_OVERLAYFS && !FAKE_OVERLAYFS_VAR + select FAKE_OVERLAYFS_VAR_RUN if DEVICEKIT_DISKS_FAKE_OVERLAYFS && !FAKE_OVERLAYFS_VAR prompt "devicekit " help abstraction for enumerating block devices diff --git a/rules/dropbear.in b/rules/dropbear.in index 16624d8..21301ba 100644 --- a/rules/dropbear.in +++ b/rules/dropbear.in @@ -99,13 +99,6 @@ config DROPBEAR_DIS_WTMPX Keep dropbear from writing to wtmpx. This option is useful for small or flash-based filesystems. -config DROPBEAR_DIS_LIBUTIL - bool - prompt "disable use of libutil" - help - Enable this option to leave out the use of libutil. - This might help to reduce the size of the binary. - config DROPBEAR_DIS_PUTUTLINE bool prompt "disable use of pututline" @@ -239,6 +232,32 @@ config DROPBEAR_SHA1_96 Although slower than MD5, this larger digest size makes it stronger against brute force attacks. +config DROPBEAR_SHA256 + bool + prompt "sha256" + default n + help + SHA-2 is a set of cryptographic hash functions (SHA-224, SHA-256, + SHA-384, SHA-512) designed by the National Security Agency (NSA) + and published in 2001 by the NIST as a U.S. Federal Information + Processing Standard. SHA stands for Secure Hash Algorithm. SHA-2 + includes a significant number of changes from its predecessor, + SHA-1. SHA-2 consists of a set of four hash functions with digests + that are 224, 256, 384 or 512 bits. + +config DROPBEAR_SHA512 + bool + prompt "sha512" + default n + help + SHA-2 is a set of cryptographic hash functions (SHA-224, SHA-256, + SHA-384, SHA-512) designed by the National Security Agency (NSA) + and published in 2001 by the NIST as a U.S. Federal Information + Processing Standard. SHA stands for Secure Hash Algorithm. SHA-2 + includes a significant number of changes from its predecessor, + SHA-1. SHA-2 consists of a set of four hash functions with digests + that are 224, 256, 384 or 512 bits. + config DROPBEAR_MD5 bool prompt "md5" diff --git a/rules/dropbear.make b/rules/dropbear.make index 0c3183f..74f273f 100644 --- a/rules/dropbear.make +++ b/rules/dropbear.make @@ -18,8 +18,8 @@ PACKAGES-$(PTXCONF_DROPBEAR) += dropbear # # Paths and names # -DROPBEAR_VERSION := 2012.55 -DROPBEAR_MD5 := 8c784baec3054cdb1bb4bfa792c87812 +DROPBEAR_VERSION := 2013.56 +DROPBEAR_MD5 := 700f1ae51ff008486465968db692b6dc DROPBEAR := dropbear-$(DROPBEAR_VERSION) DROPBEAR_SUFFIX := tar.bz2 DROPBEAR_URL := http://matt.ucc.asn.au/dropbear/releases/$(DROPBEAR).$(DROPBEAR_SUFFIX) @@ -34,8 +34,7 @@ DROPBEAR_DIR := $(BUILDDIR)/$(DROPBEAR) # autoconf # DROPBEAR_AUTOCONF := \ - $(CROSS_AUTOCONF_USR) \ - --disable-nls + $(CROSS_AUTOCONF_USR) ifdef PTXCONF_DROPBEAR_ZLIB DROPBEAR_AUTOCONF += --enable-zlib @@ -71,10 +70,6 @@ ifdef PTXCONF_DROPBEAR_DIS_WTMPX DROPBEAR_AUTOCONF += --disable-wtmpx endif -ifdef PTXCONF_DROPBEAR_DIS_LIBUTIL -DROPBEAR_AUTOCONF += --disable-libutil -endif - ifdef PTXCONF_DROPBEAR_DIS_PUTUTLINE DROPBEAR_AUTOCONF += --disable-pututline endif @@ -111,10 +106,12 @@ endif ifdef PTXCONF_DROPBEAR_DIS_AGENT @echo "ptxdist: disabling agent" - @$(call disable_c, $(DROPBEAR_DIR)/options.h,ENABLE_AGENTFWD) + @$(call disable_c, $(DROPBEAR_DIR)/options.h,ENABLE_SVR_AGENTFWD) + @$(call disable_c, $(DROPBEAR_DIR)/options.h,ENABLE_CLI_AGENTFWD) else @echo "ptxdist: enabling agent" - @$(call enable_c, $(DROPBEAR_DIR)/options.h,ENABLE_AGENTFWD) + @$(call enable_c, $(DROPBEAR_DIR)/options.h,ENABLE_SVR_AGENTFWD) + @$(call enable_c, $(DROPBEAR_DIR)/options.h,ENABLE_CLI_AGENTFWD) endif @@ -184,6 +181,22 @@ else @$(call disable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_SHA1_96_HMAC) endif +ifdef PTXCONF_DROPBEAR_SHA256 + @echo "ptxdist: enabling sha256" + @$(call enable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_SHA2_256_HMAC) +else + @echo "ptxdist: disabling sha256" + @$(call disable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_SHA2_256_HMAC) +endif + +ifdef PTXCONF_DROPBEAR_SHA512 + @echo "ptxdist: enabling sha512" + @$(call enable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_SHA2_512_HMAC) +else + @echo "ptxdist: disabling sha512" + @$(call disable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_SHA2_512_HMAC) +endif + ifdef PTXCONF_DROPBEAR_MD5 @echo "ptxdist: enabling md5" @$(call enable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_MD5_HMAC) @@ -211,18 +224,22 @@ endif ifdef PTXCONF_DROPBEAR_PASSWD @echo "ptxdist: enabling passwd" - @$(call enable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_PASSWORD_AUTH) + @$(call enable_c, $(DROPBEAR_DIR)/options.h,ENABLE_SVR_PASSWORD_AUTH) + @$(call enable_c, $(DROPBEAR_DIR)/options.h,ENABLE_CLI_PASSWORD_AUTH) else @echo "ptxdist: disabling passwd" - @$(call disable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_PASSWORD_AUTH) + @$(call disable_c, $(DROPBEAR_DIR)/options.h,ENABLE_SVR_PASSWORD_AUTH) + @$(call disable_c, $(DROPBEAR_DIR)/options.h,ENABLE_CLI_PASSWORD_AUTH) endif ifdef PTXCONF_DROPBEAR_PUBKEY @echo "ptxdist: enabling pubkey" - @$(call enable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_PUBKEY_AUTH) + @$(call enable_c, $(DROPBEAR_DIR)/options.h,ENABLE_SVR_PUBKEY_AUTH) + @$(call enable_c, $(DROPBEAR_DIR)/options.h,ENABLE_CLI_PUBKEY_AUTH) else @echo "ptxdist: disabling pubkey" - @$(call disable_c, $(DROPBEAR_DIR)/options.h,DROPBEAR_PUBKEY_AUTH) + @$(call disable_c, $(DROPBEAR_DIR)/options.h,ENABLE_SVR_PUBKEY_AUTH) + @$(call disable_c, $(DROPBEAR_DIR)/options.h,ENABLE_CLI_PUBKEY_AUTH) endif @$(call touch) diff --git a/rules/dtc.make b/rules/dtc.make index c7a450f..a0eca75 100644 --- a/rules/dtc.make +++ b/rules/dtc.make @@ -25,9 +25,36 @@ ptx/dtb = $(notdir $(basename $(strip $(1)))).dtb %.dtb: @$(call targetinfo) - @$(PTXCONF_SYSROOT_HOST)/bin/dtc \ + @echo CPP `ptxd_print_path "$<.tmp"` + @cpp \ + -Wp,-MD,$(STATEDIR)/dtc.dtc.deps \ + -Wp,-MT,$<.tmp \ + -nostdinc \ + -P \ + -I$(dir $<) \ + -I$(KERNEL_DIR)/arch/$(GENERIC_KERNEL_ARCH)/boot/dts \ + -I$(KERNEL_DIR)/arch/$(GENERIC_KERNEL_ARCH)/boot/dts/include \ + -undef -D__DTS__ -x assembler-with-cpp \ + -o $<.tmp \ + $< + @echo DTC `ptxd_print_path "$@"` + @if $(PTXCONF_SYSROOT_HOST)/bin/dtc -h 2>&1 | grep -q "^[[:space:]]-i$$"; then \ + dtc_include="-i $(dir $<) -i $(KERNEL_DIR)/arch/$(GENERIC_KERNEL_ARCH)/boot/dts"; \ + fi; \ + $(PTXCONF_SYSROOT_HOST)/bin/dtc \ $(call remove_quotes,$(PTXCONF_DTC_EXTRA_ARGS)) \ - -I dts -O dtb -o "$@" "$<" + $$dtc_include \ + -d $(PTXDIST_TEMPDIR)/dtc.dtc.deps \ + -I dts -O dtb -b 0 \ + -o "$@" "$<.tmp" + @awk '{ \ + printf "%s", $$1 ; \ + for (i = 2; i <= NF; i++) { \ + printf " $$(wildcard %s)", $$i; \ + }; \ + print "" \ + }' $(PTXDIST_TEMPDIR)/dtc.dtc.deps >> $(STATEDIR)/dtc.dtc.deps + @$(call finish) DTC_DTB = $(foreach dts, $(call remove_quotes,$(PTXCONF_DTC_OFTREE_DTS)), $(IMAGEDIR)/$(call ptx/dtb, $(dts))) diff --git a/rules/e2fsprogs.make b/rules/e2fsprogs.make index 93d10de..4ab562c 100644 --- a/rules/e2fsprogs.make +++ b/rules/e2fsprogs.make @@ -17,8 +17,8 @@ PACKAGES-$(PTXCONF_E2FSPROGS) += e2fsprogs # # Paths and names # -E2FSPROGS_VERSION := 1.42.4 -E2FSPROGS_MD5 := b6e296f210d642361b7394437ff0f318 +E2FSPROGS_VERSION := 1.42.7 +E2FSPROGS_MD5 := a1ec22ef003688dae9f76c74881b22b9 E2FSPROGS := e2fsprogs-$(E2FSPROGS_VERSION) E2FSPROGS_SUFFIX := tar.gz E2FSPROGS_URL := $(call ptx/mirror, SF, e2fsprogs/$(E2FSPROGS).$(E2FSPROGS_SUFFIX)) diff --git a/rules/evtest.in b/rules/evtest.in index dd4b98f..45b57b2 100644 --- a/rules/evtest.in +++ b/rules/evtest.in @@ -3,7 +3,8 @@ menuconfig EVTEST tristate prompt "evtest " - select LIBXML2 if EVTEST_CAPTURE + select LIBXML2 if EVTEST_CAPTURE + select LIBXML2_WRITER if EVTEST_CAPTURE help Simple tool for Linux's input event debugging @@ -23,11 +24,11 @@ config EVTEST_CAPTURE prompt "evtest-capture" help 'evtest-capture' captures the information and events from the input - device specified on the command line and writes it to a xml file. - Together with with evtest-create-device.xsl, a simple uinput-based + device specified on the command line and writes it to an xml file. + Together with evtest-create-device.xsl, a simple uinput-based software input device can be created that replays the events as if the same input was performed on the physical device. This can be useful to replicate bugs with input devices in upper layers of the - stack.Install the 'evtest-capture' tool (Note: requires libXML2). + stack. Install the 'evtest-capture' tool (Note: requires libXML2). endif diff --git a/rules/evtest.make b/rules/evtest.make index 87f486a..c27ddf5 100644 --- a/rules/evtest.make +++ b/rules/evtest.make @@ -29,6 +29,13 @@ EVTEST_LICENSE := GPLv2 # Prepare # ---------------------------------------------------------------------------- +EVTEST_CONF_ENV := $(CROSS_ENV) + +# disable pkg-config so that libxml2 is never found +ifndef PTXCONF_EVTEST_CAPTURE +EVTEST_CONF_ENV += PKG_CONFIG=false +endif + # # autoconf # diff --git a/rules/fake-overlayfs.in b/rules/fake-overlayfs.in index b090821..ebc4b10 100644 --- a/rules/fake-overlayfs.in +++ b/rules/fake-overlayfs.in @@ -24,18 +24,22 @@ if !FAKE_OVERLAYFS_VAR config FAKE_OVERLAYFS_VAR_RUN bool "/var/run" + select ROOTFS_VAR if ROOTFS select ROOTFS_VAR_RUN if ROOTFS config FAKE_OVERLAYFS_VAR_LIB bool "/var/lib" + select ROOTFS_VAR if ROOTFS select ROOTFS_VAR_LIB if ROOTFS config FAKE_OVERLAYFS_VAR_TMP bool "/var/tmp" + select ROOTFS_VAR if ROOTFS select ROOTFS_VAR_TMP if ROOTFS config FAKE_OVERLAYFS_VAR_CACHE bool "/var/cache" + select ROOTFS_VAR if ROOTFS select ROOTFS_VAR_CACHE if ROOTFS endif diff --git a/rules/gettext.in b/rules/gettext.in index 91f5266..11c66cb 100644 --- a/rules/gettext.in +++ b/rules/gettext.in @@ -10,13 +10,3 @@ menuconfig GETTEXT The gettext program translates a natural language message into the user's language, by looking up the translation in a message catalog. - -if GETTEXT - -config GETTEXT_LIBINTL - bool - prompt "install gnu libintl" - help - libintl is the GNU internationalization runtime library. - -endif diff --git a/rules/gnuplot.make b/rules/gnuplot.make index 0142e7c..39203fc 100644 --- a/rules/gnuplot.make +++ b/rules/gnuplot.make @@ -16,8 +16,9 @@ PACKAGES-$(PTXCONF_GNUPLOT) += gnuplot # # Paths and names # -GNUPLOT_VERSION := 4.4.3 -GNUPLOT_MD5 := 639603752996f4923bc02c895fa03b45 +GNUPLOT_VERSION := 4.6.2 +GNUPLOT_MAJ_VER := $(basename $(GNUPLOT_VERSION)) +GNUPLOT_MD5 := 060e0a77cabb6d6055c5917b0f0b5769 GNUPLOT := gnuplot-$(GNUPLOT_VERSION) GNUPLOT_SUFFIX := tar.gz GNUPLOT_URL := $(call ptx/mirror, SF, gnuplot/$(GNUPLOT).$(GNUPLOT_SUFFIX)) @@ -35,9 +36,6 @@ GNUPLOT_ENV := $(CROSS_ENV) # # autoconf # -# 4.2.4: --disable-datastrings is broken -# --disable-binary-data-file is broken -# GNUPLOT_AUTOCONF = \ $(CROSS_AUTOCONF_USR) \ --disable-history-file \ @@ -58,6 +56,7 @@ GNUPLOT_AUTOCONF = \ --disable-h3d-gridbox \ --disable-wxwidgets \ --without-kpsexpand \ + --without-latex \ --without-lasergnu \ --without-linux-vga \ --without-ggi \ @@ -74,16 +73,12 @@ GNUPLOT_AUTOCONF = \ --$(call ptx/wwo, PTXCONF_GNUPLOT_PLOT)-plot \ --$(call ptx/wwo, PTXCONF_GNUPLOT_PNG)-png \ --$(call ptx/wwo, PTXCONF_GNUPLOT_GD)-gd \ - --$(call ptx/wwo, PTXCONF_GNUPLOT_PDF)-pdf - -# ---------------------------------------------------------------------------- -# Compile -# ---------------------------------------------------------------------------- + --without-plot \ + --$(call ptx/wwo, PTXCONF_GNUPLOT_PDF)-pdf \ + --without-tutorial \ + --without-cairo -$(STATEDIR)/gnuplot.compile: - @$(call targetinfo) - cd $(GNUPLOT_DIR)/src && $(GNUPLOT_PATH) $(MAKE) gnuplot $(PARALLELMFLAGS) - @$(call touch) +GNUPLOT_MAKE_OPT := -C src # ---------------------------------------------------------------------------- # Target-Install @@ -101,19 +96,23 @@ $(STATEDIR)/gnuplot.targetinstall: @$(call install_copy, gnuplot, 0, 0, 0755, -, /usr/bin/gnuplot) ifdef PTXCONF_GNUPLOT_HELP - @$(call install_copy, gnuplot, 0, 0, 0644, -, /usr/share/gnuplot/4.4/gnuplot.gih) + @$(call install_copy, gnuplot, 0, 0, 0644, -, \ + /usr/share/gnuplot/$(GNUPLOT_MAJ_VER)/gnuplot.gih) endif ifdef PTXCONF_GNUPLOT_POSTSCRIPT - @$(call install_tree, gnuplot, 0, 0, -, /usr/share/gnuplot/4.4/PostScript) + @$(call install_tree, gnuplot, 0, 0, -, \ + /usr/share/gnuplot/$(GNUPLOT_MAJ_VER)/PostScript) endif ifdef PTXCONF_GNUPLOT_JS - @$(call install_tree, gnuplot, 0, 0, -, /usr/share/gnuplot/4.4/js) + @$(call install_tree, gnuplot, 0, 0, -, \ + /usr/share/gnuplot/$(GNUPLOT_MAJ_VER)/js) endif ifdef PTXCONF_GNUPLOT_X - @$(call install_copy, gnuplot, 0, 0, 0755, -, /usr/libexec/gnuplot/4.4/gnuplot_x11) + @$(call install_copy, gnuplot, 0, 0, 0755, -, \ + /usr/libexec/gnuplot/$(GNUPLOT_MAJ_VER)/gnuplot_x11) endif @$(call install_finish, gnuplot) diff --git a/rules/graphics_and_multimedia.in b/rules/graphics_and_multimedia.in index 3124cd3..0a0e5d7 100644 --- a/rules/graphics_and_multimedia.in +++ b/rules/graphics_and_multimedia.in @@ -89,3 +89,6 @@ if XORG source "generated/multimedia_xorg.in" endif +menu "wayland " +source "generated/multimedia_wayland.in" +endmenu diff --git a/rules/gst-plugins-bad1.in b/rules/gst-plugins-bad1.in new file mode 100644 index 0000000..d8e112b --- /dev/null +++ b/rules/gst-plugins-bad1.in @@ -0,0 +1,743 @@ +## SECTION=multimedia_gstreamer1 + +menuconfig GST_PLUGINS_BAD1 + tristate + select GLIB + select GSTREAMER1 + select GST_PLUGINS_BASE1 + select BZIP2 if GST_PLUGINS_BAD1_BZ2 + select BZIP2_LIBBZ2 if GST_PLUGINS_BAD1_BZ2 + select LIBCURL if GST_PLUGINS_BAD1_CURL + select MPG123 if GST_PLUGINS_BAD1_MPG123 + select OPUS if GST_PLUGINS_BAD1_OPUS + select ORC if GST_PLUGINS_BAD1_ORC + select RTMPDUMP if GST_PLUGINS_BAD1_RTMP + select SDL if GST_PLUGINS_BAD1_SDL + select VO_AACENC if GST_PLUGINS_BAD1_VOAACENC + select WAYLAND if GST_PLUGINS_BAD1_WAYLAND + + prompt "gst-plugins-bad " + help + GStreamer Bad Plug-ins is a set of plug-ins that aren't + up to par compared to the rest. They might be close to being + good quality, but they're missing something - be it a good + code review, some documentation, a set of tests, a real + live maintainer, or some actual wide use. + + +if GST_PLUGINS_BAD1 + +config GST_PLUGINS_BAD1_ORC + bool + +config GST_PLUGINS_BAD1_ADPCMDEC + bool + prompt "adpcmdec" + +config GST_PLUGINS_BAD1_ADPCMENC + bool + prompt "adpcmenc" + +config GST_PLUGINS_BAD1_AIFF + bool + # Non ported plugin + depends on BROKEN + prompt "aiff" + +config GST_PLUGINS_BAD1_ASFMUX + bool + prompt "asfmux" + +config GST_PLUGINS_BAD1_AUDIOVISUALIZERS + bool + prompt "audiovisualizers" + +config GST_PLUGINS_BAD1_AUTOCONVERT + bool + prompt "autoconvert" + +config GST_PLUGINS_BAD1_BAYER + bool + prompt "bayer" + +config GST_PLUGINS_BAD1_CAMERABIN2 + bool + prompt "camerabin2" + +config GST_PLUGINS_BAD1_CDXAPARSE + bool + # Non ported plugin + depends on BROKEN + prompt "cdxaparse" + +config GST_PLUGINS_BAD1_COLOREFFECTS + bool + prompt "coloreffects" + +config GST_PLUGINS_BAD1_DATAURISRC + bool + prompt "dataurisrc" + +config GST_PLUGINS_BAD1_DCCP + bool + # Non ported plugin + depends on BROKEN + prompt "dccp" + +config GST_PLUGINS_BAD1_DEBUGUTILS + bool + prompt "debugutils" + +config GST_PLUGINS_BAD1_DTMF + bool + prompt "dtmf" + +config GST_PLUGINS_BAD1_DVBSUBOVERLAY + bool + prompt "dvbsuboverlay" + +config GST_PLUGINS_BAD1_DVDSPU + bool + prompt "dvdspu" + +config GST_PLUGINS_BAD1_FACEOVERLAY + bool + # Non ported plugin + depends on BROKEN + prompt "faceoverlay" + +config GST_PLUGINS_BAD1_FESTIVAL + bool + prompt "festival" + +config GST_PLUGINS_BAD1_FIELDANALYSIS + bool + prompt "fieldanalysis" + +config GST_PLUGINS_BAD1_FREEVERB + bool + # Non ported plugin + depends on BROKEN + prompt "freeverb" + +config GST_PLUGINS_BAD1_FREI0R + bool + prompt "frei0r" + +config GST_PLUGINS_BAD1_GAUDIEFFECTS + bool + prompt "gaudieffects" + +config GST_PLUGINS_BAD1_GEOMETRICTRANSFORM + bool + prompt "geometrictransform" + +config GST_PLUGINS_BAD1_GDP + bool + prompt "gdp" + +config GST_PLUGINS_BAD1_HDVPARSE + bool + # Non ported plugin + depends on BROKEN + prompt "hdvparse" + +config GST_PLUGINS_BAD1_HLS + bool + prompt "hls" + +config GST_PLUGINS_BAD1_ID3TAG + bool + prompt "id3tag" + +config GST_PLUGINS_BAD1_INTER + bool + prompt "inter" + +config GST_PLUGINS_BAD1_INTERLACE + bool + prompt "interlace" + +config GST_PLUGINS_BAD1_IVFPARSE + bool + # Non ported plugin + depends on BROKEN + prompt "ivfparse" + +config GST_PLUGINS_BAD1_JP2KDECIMATOR + bool + # Non ported plugin + depends on BROKEN + prompt "jp2kdecimator" + +config GST_PLUGINS_BAD1_JPEGFORMAT + bool + prompt "jpegformat" + +config GST_PLUGINS_BAD1_LIBRFB + bool + # Non ported plugin + depends on BROKEN + prompt "librfb" + +config GST_PLUGINS_BAD1_LIVEADDER + bool + prompt "liveadder" + +config GST_PLUGINS_BAD1_MPEGDEMUX + bool + prompt "mpegdemux" + +config GST_PLUGINS_BAD1_MPEGTSDEMUX + bool + prompt "mpegtsdemux" + +config GST_PLUGINS_BAD1_MPEGTSMUX + bool + prompt "mpegtsmux" + +config GST_PLUGINS_BAD1_MPEGPSMUX + bool + prompt "mpegpsmux" + +config GST_PLUGINS_BAD1_MVE + bool + # Non ported plugin + depends on BROKEN + prompt "mve" + +config GST_PLUGINS_BAD1_MXF + bool + # Non ported plugin + depends on BROKEN + prompt "mxf" + +config GST_PLUGINS_BAD1_NSF + bool + # Non ported plugin + depends on BROKEN + prompt "nsf" + +config GST_PLUGINS_BAD1_NUVDEMUX + bool + # Non ported plugin + depends on BROKEN + prompt "nuvdemux" + +config GST_PLUGINS_BAD1_PATCHDETECT + bool + # Non ported plugin + depends on BROKEN + prompt "patchdetect" + +config GST_PLUGINS_BAD1_PCAPPARSE + bool + prompt "pcapparse" + +config GST_PLUGINS_BAD1_PNM + bool + prompt "pnm" + +config GST_PLUGINS_BAD1_RAWPARSE + bool + prompt "rawparse" + +config GST_PLUGINS_BAD1_REAL + bool + # Non ported plugin + depends on BROKEN + prompt "real" + +config GST_PLUGINS_BAD1_REMOVESILENCE + bool + prompt "removesilence" + +config GST_PLUGINS_BAD1_RTPMUX + bool + prompt "rtpmux" + +config GST_PLUGINS_BAD1_RTPVP8 + bool + prompt "rtpvp8" + +config GST_PLUGINS_BAD1_SCALETEMPO + bool + prompt "scaletempo" + +config GST_PLUGINS_BAD1_SDP + bool + # Non ported plugin + depends on BROKEN + prompt "sdi" + +config GST_PLUGINS_BAD1_SDP + bool + prompt "sdp" + +config GST_PLUGINS_BAD1_SEGMENTCLIP + bool + prompt "segmentclip" + +config GST_PLUGINS_BAD1_SIREN + bool + prompt "siren" + +config GST_PLUGINS_BAD1_SMOOTH + bool + prompt "smooth" + +config GST_PLUGINS_BAD1_SPEED + bool + prompt "speed" + +config GST_PLUGINS_BAD1_SUBENC + bool + prompt "subenc" + +config GST_PLUGINS_BAD1_STEREO + bool + # Non ported plugin + depends on BROKEN + prompt "stereo" + +config GST_PLUGINS_BAD1_TTA + bool + # Non ported plugin + depends on BROKEN + prompt "tta" + +config GST_PLUGINS_BAD1_VIDEOFILTERS + bool + # Non ported plugin + depends on BROKEN + prompt "videofilters" + +config GST_PLUGINS_BAD1_VIDEOMEASURE + bool + # Non ported plugin + depends on BROKEN + prompt "videomeasure" + +config GST_PLUGINS_BAD1_VIDEOPARSERS + bool + prompt "videoparsers" + +config GST_PLUGINS_BAD1_VIDEOSIGNAL + bool + # Non ported plugin + depends on BROKEN + prompt "videosignal" + +config GST_PLUGINS_BAD1_VMNC + bool + # Non ported plugin + depends on BROKEN + prompt "vmnc" + +config GST_PLUGINS_BAD1_Y4M + bool + prompt "j4m" + +config GST_PLUGINS_BAD1_AVC + bool + prompt "avc" + depends on BROKEN + +config GST_PLUGINS_BAD1_SHM + bool + prompt "shm" + +config GST_PLUGINS_BAD1_VCD + bool + # Non ported plugin + depends on BROKEN + prompt "vcd" + +config GST_PLUGINS_BAD1_OPENSLES + bool + depends on BROKEN + prompt "opensles" + +config GST_PLUGINS_BAD1_uvch264 + bool + # Non ported plugin + depends on BROKEN + prompt "uvch264" + +config GST_PLUGINS_BAD1_ASSRENDER + bool + prompt "assrender" + depends on BROKEN + +config GST_PLUGINS_BAD1_VOAMRWBENC + bool + prompt "voamrwbenc" + depends on BROKEN + +config GST_PLUGINS_BAD1_VOAACENC + bool + prompt "voaacenc" + +config GST_PLUGINS_BAD1_APEXSINK + bool + # Non ported plugin + depends on BROKEN + prompt "apexsink" + depends on BROKEN + +config GST_PLUGINS_BAD1_BZ2 + bool + prompt "bz2" + +config GST_PLUGINS_BAD1_CDAUDIO + bool + # Non ported plugin + depends on BROKEN + prompt "cdaudio" + depends on BROKEN + +config GST_PLUGINS_BAD1_CELT + bool + prompt "celt" + depends on BROKEN + +config GST_PLUGINS_BAD1_CHROMAPRINT + bool + depends on BROKEN + prompt "chromaprint" + +config GST_PLUGINS_BAD1_COG + bool + # Non ported plugin + depends on BROKEN + prompt "cog" + depends on BROKEN + +config GST_PLUGINS_BAD1_CURL + bool + prompt "curl" + +config GST_PLUGINS_BAD1_DC1394 + bool + # Non ported plugin + depends on BROKEN + prompt "dc1394" + depends on BROKEN + +config GST_PLUGINS_BAD1_DECKLINK + bool + prompt "decklink" + +config GST_PLUGINS_BAD1_DIRECTFB + bool + # Non ported plugin + depends on BROKEN + prompt "directfb" + +config GST_PLUGINS_BAD1_WAYLAND + bool + prompt "wayland" + +config GST_PLUGINS_BAD1_DIRAC + bool + # Non ported plugin + depends on BROKEN + prompt "dirac" + depends on BROKEN + +config GST_PLUGINS_BAD1_DTS + bool + select GST_PLUGINS_BAD1_ORC + prompt "dts" + depends on BROKEN + +config GST_PLUGINS_BAD1_RESINDVD + bool + # needs dvdnav & dvdread + depends on BROKEN + prompt "resindvd" + +config GST_PLUGINS_BAD1_FAAC + bool + prompt "faac" + depends on BROKEN + +config GST_PLUGINS_BAD1_FAAD + bool + prompt "faad" + depends on BROKEN + +config GST_PLUGINS_BAD1_FBDEV + bool + # Non ported plugin + depends on BROKEN + prompt "fbdev" + +config GST_PLUGINS_BAD1_FLITE + bool + prompt "flite" + depends on BROKEN + +config GST_PLUGINS_BAD1_GSM + bool + prompt "gsm" + depends on BROKEN + +config GST_PLUGINS_BAD1_JASPER + bool + # Non ported plugin + depends on BROKEN + prompt "jasper" + depends on BROKEN + +config GST_PLUGINS_BAD1_KATE + bool + # Non ported plugin + depends on BROKEN + prompt "kate" + depends on BROKEN + +config GST_PLUGINS_BAD1_LADSPA + bool + # Non ported plugin + depends on BROKEN + prompt "ladspa" + depends on BROKEN + +config GST_PLUGINS_BAD1_LV2 + bool + # Non ported plugin + depends on BROKEN + prompt "lv2" + depends on BROKEN + +config GST_PLUGINS_BAD1_LIBMMS + bool + # needs libmms + depends on BROKEN + prompt "libmms" + +config GST_PLUGINS_BAD1_LINSYS + bool + # Non ported plugin + depends on BROKEN + prompt "linsys" + +config GST_PLUGINS_BAD1_MODPLUG + bool + # needs libmodplug + depends on BROKEN + prompt "modplug" + +config GST_PLUGINS_BAD1_MIMIC + bool + prompt "mimic" + depends on BROKEN + +config GST_PLUGINS_BAD1_MPEG2ENC + bool + prompt "mpeg2enc" + depends on BROKEN + +config GST_PLUGINS_BAD1_MPG123 + bool + prompt "mpg123" + depends on BROKEN + +config GST_PLUGINS_BAD1_MPLEX + bool + prompt "mplex" + depends on BROKEN + +config GST_PLUGINS_BAD1_MUSEPACK + bool + # Non ported plugin + depends on BROKEN + prompt "musepack" + depends on BROKEN + +config GST_PLUGINS_BAD1_MUSICBRAINZ + bool + # Non ported plugin + depends on BROKEN + prompt "musicbrainz" + depends on BROKEN + +config GST_PLUGINS_BAD1_MYTHTV + bool + # Non ported plugin + depends on BROKEN + prompt "mythtv" + depends on BROKEN + +config GST_PLUGINS_BAD1_NAS + bool + # Non ported plugin + depends on BROKEN + prompt "nas" + depends on BROKEN + +config GST_PLUGINS_BAD1_NEON + bool + # Non ported plugin + depends on BROKEN + prompt "neon" + depends on BROKEN + +config GST_PLUGINS_BAD1_OFA + bool + prompt "ofa" + depends on BROKEN + +config GST_PLUGINS_BAD1_OPENAL + bool + # Non ported plugin + depends on BROKEN + prompt "openal" + depends on BROKEN + +config GST_PLUGINS_BAD1_OPENCV + bool + prompt "opencv" + depends on BROKEN + +config GST_PLUGINS_BAD1_OPUS + bool + prompt "opus" + +config GST_PLUGINS_BAD1_PVR + bool + prompt "pvr" + depends on BROKEN + +config GST_PLUGINS_BAD1_RSVG + bool + # Non ported plugin + depends on BROKEN + prompt "rsvg" + depends on BROKEN + +config GST_PLUGINS_BAD1_EGLGLES + bool + prompt "eglgles" + depends on BROKEN + +config GST_PLUGINS_BAD1_TIMIDITY + bool + # Non ported plugin + depends on BROKEN + prompt "timidity" + depends on BROKEN + +config GST_PLUGINS_BAD1_TELETEXTDEC + bool + # Non ported plugin + depends on BROKEN + prompt "teletextdec" + depends on BROKEN + +config GST_PLUGINS_BAD1_WILDMIDI + bool + # Non ported plugin + depends on BROKEN + prompt "wildmidi" + depends on BROKEN + +config GST_PLUGINS_BAD1_SDL + bool + # Non ported plugin + depends on BROKEN + prompt "sdl" + +config GST_PLUGINS_BAD1_SNDFILE + bool + # Non ported plugin + depends on BROKEN + # needs sndfile + depends on BROKEN + prompt "sndfile" + +config GST_PLUGINS_BAD1_SOUNDTOUCH + bool + prompt "soundtouch" + depends on BROKEN + +config GST_PLUGINS_BAD1_SPC + bool + prompt "spc" + depends on BROKEN + +config GST_PLUGINS_BAD1_GME + bool + prompt "gme" + depends on BROKEN + +config GST_PLUGINS_BAD1_SWFDEC + bool + prompt "swfdec" + depends on BROKEN + +config GST_PLUGINS_BAD1_XVID + bool + # Non ported plugin + depends on BROKEN + prompt "xvid" + depends on BROKEN + +config GST_PLUGINS_BAD1_DVB + bool + prompt "dvb" + +config GST_PLUGINS_BAD1_WININET + bool + # Non ported plugin + depends on BROKEN + prompt "wininet" + depends on BROKEN + +config GST_PLUGINS_BAD1_ACM + bool + # Non ported plugin + depends on BROKEN + prompt "acm" + depends on BROKEN + +config GST_PLUGINS_BAD1_VDPAU + bool + prompt "vdpau" + depends on BROKEN + +config GST_PLUGINS_BAD1_SCHRO + bool + # needs schroedinger-1.0 + depends on BROKEN + prompt "schro" + +config GST_PLUGINS_BAD1_ZBAR + bool + prompt "zbar" + depends on BROKEN + +config GST_PLUGINS_BAD1_RTMP + bool + prompt "rtmp" + +config GST_PLUGINS_BAD1_SPANDSP + bool + depends on BROKEN + prompt "spandsp" + +config GST_PLUGINS_BAD1_GSETTINGS + bool + # Non ported plugin + depends on BROKEN + prompt "gsettings" + +config GST_PLUGINS_BAD1_SNDIO + bool + # Non ported plugin + depends on BROKEN + prompt "sndio" + +endif + diff --git a/rules/gst-plugins-bad1.make b/rules/gst-plugins-bad1.make new file mode 100644 index 0000000..e852b57 --- /dev/null +++ b/rules/gst-plugins-bad1.make @@ -0,0 +1,254 @@ +# -*-makefile-*- +# +# Copyright (C) 2010 by Erwin Rol +# Copyright (C) 2008 by Sascha Hauer +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_GST_PLUGINS_BAD1) += gst-plugins-bad1 + +# +# Paths and names +# +GST_PLUGINS_BAD1_VERSION := 1.0.8 +GST_PLUGINS_BAD1_MD5 := a2fdf125ee2ae46047dcbcfc305949ee +GST_PLUGINS_BAD1 := gst-plugins-bad-$(GST_PLUGINS_BAD1_VERSION) +GST_PLUGINS_BAD1_SUFFIX := tar.xz +GST_PLUGINS_BAD1_URL := http://gstreamer.freedesktop.org/src/gst-plugins-bad/$(GST_PLUGINS_BAD1).$(GST_PLUGINS_BAD1_SUFFIX) +GST_PLUGINS_BAD1_SOURCE := $(SRCDIR)/$(GST_PLUGINS_BAD1).$(GST_PLUGINS_BAD1_SUFFIX) +GST_PLUGINS_BAD1_DIR := $(BUILDDIR)/$(GST_PLUGINS_BAD1) + + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_ADPCMDEC) += adpcmdec +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_ADPCMENC) += adpcmenc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_AIFF) += aiff +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_ASFMUX) += asfmux +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_AUDIOVISUALIZERS) += audiovisualizers +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_AUTOCONVERT) += autoconvert +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_BAYER) += bayer +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_CAMERABIN2) += camerabin2 +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_CDXAPARSE) += cdxaparse +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_COLOREFFECTS) += coloreffects +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DATAURISRC) += dataurisrc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DCCP) += dccp +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_DEBUGUTILS) += debugutils +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_DEBUGUTILS) += debugutilsbad +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DTMF) += dtmf +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DVBSUBOVERLAY) += dvbsuboverlay +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DVDSPU) += dvdspu +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_FACEOVERLAY) += faceoverlay +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_FESTIVAL) += festival +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_FIELDANALYSIS) += fieldanalysis +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_FREEVERB) += freeverb +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_FREI0R) += frei0r +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_GAUDIEFFECTS) += gaudieffects +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_GEOMETRICTRANSFORM) += geometrictransform +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_GDP) += gdp +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_HDVPARSE) += hdvparse +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_HLS) += hls +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_HLS) += fragmented +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_ID3TAG) += id3tag +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_INTER) += inter +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_INTERLACE) += interlace +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_IVFPARSE) += ivfparse +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_JP2KDECIMATOR) += jp2kdecimator +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_JPEGFORMAT) += jpegformat +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_LIBRFB) += librfb +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_LIBRFB) += rfbsrc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_LIVEADDER) += liveadder +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_MPEGDEMUX) += mpegdemux +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_MPEGDEMUX) += mpegpsdemux +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MPEGTSDEMUX) += mpegtsdemux +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MPEGTSMUX) += mpegtsmux +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MPEGPSMUX) += mpegpsmux +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MVE) += mve +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MXF) += mxf +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_NSF) += nsf +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_NUVDEMUX) += nuvdemux +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_PATCHDETECT) += patchdetect +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_PCAPPARSE) += pcapparse +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_PNM) += pnm +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_RAWPARSE) += rawparse +# real plugin cannot be built on arch != x86 +ifdef PTXCONF_ARCH_X86 +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_REAL) += real +endif +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_REMOVESILENCE) += removesilence +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_RTPMUX) += rtpmux +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_RTPVP8) += rtpvp8 +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_SCALETEMPO) += scaletempo +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_SCALETEMPO) += scaletempoplugin +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SDI) += sdi +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_SDP) += sdp +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_SDP) += sdpelem +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SEGMENTCLIP) += segmentclip +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SIREN) += siren +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SMOOTH) += smooth +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SPEED) += speed +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SUBENC) += subenc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_STEREO) += stereo +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_TTA) += tta +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_VIDEOFILTERS) += videofilters +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_VIDEOMEASURE) += videomeasure +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_VIDEOPARSERS) += videoparsers +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_VIDEOPARSERS) += videoparsersbad +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_VIDEOSIGNAL) += videosignal +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_VMNC) += vmnc +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_Y4M) += y4m +GST_PLUGINS_BAD1_ENABLED-$(PTXCONF_GST_PLUGINS_BAD1_Y4M) += y4mdec +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_AVC) += avc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SHM) += shm +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_VCD) += vcd +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_VCD) += vcdsrc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_OPENSLES) += opensles +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_uvch264) += uvch264 +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_ASSRENDER) += assrender +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_VOAMRWBENC) += voamrwbenc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_VOAACENC) += voaacenc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_APEXSINK) += apexsink +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_BZ2) += bz2 +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_CDAUDIO) += cdaudio +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_CELT) += celt +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_CHROMAPRINT) += chromaprint +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_COG) += cog +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_CURL) += curl +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DC1394) += dc1394 +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DECKLINK) += decklink +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_DIRECTFB) += directfb +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_DIRECTFB) += dfbvideosink +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_WAYLAND) += wayland +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_WAYLAND) += waylandsink +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DIRAC) += dirac +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DTS) += dts +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_RESINDVD) += resindvd +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_FAAC) += faac +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_FAAD) += faad +GST_PLUGINS_BAD1_ENABLEC-$(PTXCONF_GST_PLUGINS_BAD1_FBDEV) += fbdev +GST_PLUGINS_BAD1_ENABLEP-$(PTXCONF_GST_PLUGINS_BAD1_FBDEV) += fbdevsink +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_FLITE) += flite +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_GSM) += gsm +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_JASPER) += jasper +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_KATE) += kate +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_LADSPA) += ladspa +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_LV2) += lv2 +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_LIBMMS) += libmms +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_LINSYS) += linsys +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MODPLUG) += modplug +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MIMIC) += mimic +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MPEG2ENC) += mpeg2enc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MPG123) += mpg123 +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MPLEX) += mplex +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MUSEPACK) += musepack +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MUSICBRAINZ) += musicbrainz +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_MYTHTV) += mythtv +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_NAS) += nas +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_NEON) += neon +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_OFA) += ofa +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_OPENAL) += openal +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_OPENCV) += opencv +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_OPUS) += opus +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_PVR) += pvr +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_RSVG) += rsvg +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_EGLGLES) += eglgles +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_TIMIDITY) += timidity +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_TELETEXTDEC) += teletextdec +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_WILDMIDI) += wildmidi +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SDL) += sdl +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SNDFILE) += sndfile +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SOUNDTOUCH) += soundtouch +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SPC) += spc +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_GME) += gme +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SWFDEC) += swfdec +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_XVID) += xvid +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_DVB) += dvb +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_WININET) += wininet +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_ACM) += acm +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_VDPAU) += vdpau +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SCHRO) += schro +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_ZBAR) += zbar +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_RTMP) += rtmp +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SPANDSP) += spandsp +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_GSETTINGS) += gsettings +GST_PLUGINS_BAD1_ENABLE-$(PTXCONF_GST_PLUGINS_BAD1_SNDIO) += sndio + +GST_PLUGINS_BAD1_ENABLEC-y += $(GST_PLUGINS_BAD1_ENABLE-y) +GST_PLUGINS_BAD1_ENABLEC- += $(GST_PLUGINS_BAD1_ENABLE-) +GST_PLUGINS_BAD1_ENABLEP-y += $(GST_PLUGINS_BAD1_ENABLE-y) + +# +# autoconf +# +GST_PLUGINS_BAD1_CONF_TOOL := autoconf + +GST_PLUGINS_BAD1_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + $(GSTREAMER_GENERIC_CONF_OPT) \ + --enable-external \ + --enable-experimental \ + \ + --$(call ptx/endis,PTXCONF_GST_PLUGINS_BAD1_ORC)-orc \ + \ + --disable-directsound \ + --disable-direct3d \ + --disable-directdraw \ + --disable-direct3d9 \ + --disable-directshow \ + --disable-android_media \ + --disable-apple_media \ + --disable-osx_video \ + --disable-quicktime \ + --disable-sdltest \ + --disable-schemas-compile + +ifneq ($(call remove_quotes,$(GST_PLUGINS_BAD1_ENABLEC-y)),) +GST_PLUGINS_BAD1_CONF_OPT += --enable-$(subst $(space),$(space)--enable-,$(strip $(GST_PLUGINS_BAD1_ENABLEC-y))) +endif + +ifneq ($(call remove_quotes,$(GST_PLUGINS_BAD1_ENABLEC-)),) +GST_PLUGINS_BAD1_CONF_OPT += --disable-$(subst $(space),$(space)--disable-,$(strip $(GST_PLUGINS_BAD1_ENABLEC-))) +endif + +# --enable-gobject-cast-checks=[no/auto/yes] Enable GObject cast checks + + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/gst-plugins-bad1.targetinstall: + @$(call targetinfo) + + @$(call install_init, gst-plugins-bad1) + @$(call install_fixup, gst-plugins-bad1,PRIORITY,optional) + @$(call install_fixup, gst-plugins-bad1,SECTION,base) + @$(call install_fixup, gst-plugins-bad1,AUTHOR,"Sascha Hauer") + @$(call install_fixup, gst-plugins-bad1,DESCRIPTION,missing) + + # install all activated libs + @cd $(GST_PLUGINS_BAD1_PKGDIR)/usr/lib/ && \ + for libs in `find -name "*-1.0.so" -printf '%f\n'`; do \ + $(call install_lib, gst-plugins-bad1, 0, 0, 0644, $${libs%.so}); \ + done + + # install all activated plugins + @for plugin in $(GST_PLUGINS_BAD1_ENABLEP-y); do \ + $(call install_copy, gst-plugins-bad1, 0, 0, 0644, -, \ + /usr/lib/gstreamer-1.0/libgst$${plugin}.so); \ + done + + @$(call install_finish, gst-plugins-bad1) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/gst-plugins-base1.in b/rules/gst-plugins-base1.in new file mode 100644 index 0000000..0cd3325 --- /dev/null +++ b/rules/gst-plugins-base1.in @@ -0,0 +1,188 @@ +## SECTION=multimedia_gstreamer1 + +menuconfig GST_PLUGINS_BASE1 + tristate + + # needed for autogen.sh + select HOST_GETTEXT + + select GLIB + select GSTREAMER1 + + select ALSA_LIB if GST_PLUGINS_BASE1_ALSA + select ALSA_LIB_PCM if GST_PLUGINS_BASE1_ALSA + select ALSA_LIB_MIXER if GST_PLUGINS_BASE1_ALSA + select GLIB if GST_PLUGINS_BASE1_GIO + select LIBOGG if GST_PLUGINS_BASE1_OGG + select LIBTHEORA if GST_PLUGINS_BASE1_THEORA + select LIBVORBIS if GST_PLUGINS_BASE1_VORBIS + select PANGO if GST_PLUGINS_BASE1_PANGO + select LIBXML2 if GST_PLUGINS_BASE1_SUBPARSE + select LIBXML2_HTML if GST_PLUGINS_BASE1_SUBPARSE + select ORC if GST_PLUGINS_BASE1_ORC + select ZLIB if GST_PLUGINS_BASE1_ZLIB + + # x features need libx11 + Xv + select XORG if GST_PLUGINS_BASE1_X + select XORG_LIB_X11 if GST_PLUGINS_BASE1_X + select XORG_LIB_XV if GST_PLUGINS_BASE1_X + prompt "gst-plugins-base " + help + GStreamer is a streaming media framework, based on graphs of + filters which operate on media data. Applications using this + library can do anything from real-time sound processing to + playing videos, and just about anything else + media-related. Its plugin-based architecture means that new + data types or processing capabilities can be added simply by + installing new plug-ins. + + This package contains the GStreamer plugins from the "base" + set, an essential exemplary set of elements. + +if GST_PLUGINS_BASE1 + +config GST_PLUGINS_BASE1_ORC + bool + +comment "dependency-less plugins" +# ------------------------------- + +config GST_PLUGINS_BASE1_ADDER + bool + select GST_PLUGINS_BASE1_ORC + prompt "adder" + +config GST_PLUGINS_BASE1_APP + bool + prompt "app" + +config GST_PLUGINS_BASE1_AUDIOCONVERT + bool + select GST_PLUGINS_BASE1_ORC + prompt "audioconvert" + +config GST_PLUGINS_BASE1_AUDIORATE + bool + prompt "audiorate" + +config GST_PLUGINS_BASE1_AUDIOTESTSRC + bool + prompt "audiotestsrc" + +config GST_PLUGINS_BASE1_ENCODING + bool + prompt "encoding" + +config GST_PLUGINS_BASE1_VIDEOCONVERT + bool + select GST_PLUGINS_BASE1_ORC + prompt "videoconvert" + +config GST_PLUGINS_BASE1_GIO + bool + prompt "gio" + +config GST_PLUGINS_BASE1_PLAYBACK + bool + prompt "playback" + +config GST_PLUGINS_BASE1_AUDIORESAMPLE + bool + select GST_PLUGINS_BASE1_ORC + prompt "audioresample" + +config GST_PLUGINS_BASE1_SUBPARSE + bool + prompt "subparse" + +config GST_PLUGINS_BASE1_TCP + bool + prompt "tcp" + +config GST_PLUGINS_BASE1_TYPEFIND + bool + prompt "typefind" + +config GST_PLUGINS_BASE1_VIDEOTESTSRC + bool + select GST_PLUGINS_BASE1_ORC + prompt "videotestsrc" + +config GST_PLUGINS_BASE1_VIDEORATE + bool + prompt "videorate" + +config GST_PLUGINS_BASE1_VIDEOSCALE + bool + select GST_PLUGINS_BASE1_ORC + prompt "videoscale" + +config GST_PLUGINS_BASE1_VOLUME + bool + select GST_PLUGINS_BASE1_ORC + prompt "volume" + +comment "plugins with dependencies" + +config GST_PLUGINS_BASE1_X + bool + prompt "x based plugins" + +config GST_PLUGINS_BASE1_XVIDEO + bool + depends on GST_PLUGINS_BASE1_X + prompt "xv" + help + This plugin offers an xlib based window that can display a video stream. + +config GST_PLUGINS_BASE1_ALSA + bool + prompt "alsa" + +config GST_PLUGINS_BASE1_CDPARANOIA + bool + depends on BROKEN + prompt "cdparanoia [BROKEN]" + +config GST_PLUGINS_BASE1_IVORBIS + bool + depends on BROKEN + prompt "ivorbis" + +config GST_PLUGINS_BASE1_LIBVISUAL + bool + depends on BROKEN + prompt "libvisual [BROKEN]" + +config GST_PLUGINS_BASE1_OGG + bool + prompt "ogg" + +config GST_PLUGINS_BASE1_PANGO + bool + prompt "pango" + +config GST_PLUGINS_BASE1_THEORA + bool + prompt "theora" + +config GST_PLUGINS_BASE1_VORBIS + bool + prompt "vorbis" + +comment "Support options" + +config GST_PLUGINS_BASE1_XSHM + bool + depends on GST_PLUGINS_BASE1_X + prompt "xshm" + help + xshm support for X and XVideo plaugins + +config GST_PLUGINS_BASE1_ZLIB + bool + prompt "zlib" + help + zlib support for ID3 parsing in libgsttag + +endif diff --git a/rules/gst-plugins-base1.make b/rules/gst-plugins-base1.make new file mode 100644 index 0000000..ebb3838 --- /dev/null +++ b/rules/gst-plugins-base1.make @@ -0,0 +1,136 @@ +# -*-makefile-*- +# +# Copyright (C) 2008 by Robert Schwebel +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_GST_PLUGINS_BASE1) += gst-plugins-base1 + +# +# Paths and names +# +GST_PLUGINS_BASE1_VERSION := 1.0.8 +GST_PLUGINS_BASE1_MD5 := c8b36678186e7d4fb1e6395ffcd1abb1 +GST_PLUGINS_BASE1 := gst-plugins-base-$(GST_PLUGINS_BASE1_VERSION) +GST_PLUGINS_BASE1_SUFFIX := tar.xz +GST_PLUGINS_BASE1_URL := http://gstreamer.freedesktop.org/src/gst-plugins-base/$(GST_PLUGINS_BASE1).$(GST_PLUGINS_BASE1_SUFFIX) +GST_PLUGINS_BASE1_SOURCE := $(SRCDIR)/$(GST_PLUGINS_BASE1).$(GST_PLUGINS_BASE1_SUFFIX) +GST_PLUGINS_BASE1_DIR := $(BUILDDIR)/$(GST_PLUGINS_BASE1) + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_ADDER) += adder +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_APP) += app +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_AUDIOCONVERT) += audioconvert +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_AUDIORATE) += audiorate +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_AUDIOTESTSRC) += audiotestsrc +GST_PLUGINS_BASE1_ENABLEC-$(PTXCONF_GST_PLUGINS_BASE1_ENCODING) += encoding +GST_PLUGINS_BASE1_ENABLEP-$(PTXCONF_GST_PLUGINS_BASE1_ENCODING) += encodebin +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_VIDEOCONVERT) += videoconvert +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_GIO) += gio +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_PLAYBACK) += playback +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_AUDIORESAMPLE) += audioresample +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_SUBPARSE) += subparse +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_TCP) += tcp +GST_PLUGINS_BASE1_ENABLEC-$(PTXCONF_GST_PLUGINS_BASE1_TYPEFIND) += typefind +GST_PLUGINS_BASE1_ENABLEP-$(PTXCONF_GST_PLUGINS_BASE1_TYPEFIND) += typefindfunctions +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_VIDEOTESTSRC) += videotestsrc +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_VIDEORATE) += videorate +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_VIDEOSCALE) += videoscale +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_VOLUME) += volume +GST_PLUGINS_BASE1_ENABLEC-$(PTXCONF_GST_PLUGINS_BASE1_X) += x +GST_PLUGINS_BASE1_ENABLEP-$(PTXCONF_GST_PLUGINS_BASE1_X) += ximagesink +GST_PLUGINS_BASE1_ENABLEC-$(PTXCONF_GST_PLUGINS_BASE1_XVIDEO) += xvideo +GST_PLUGINS_BASE1_ENABLEP-$(PTXCONF_GST_PLUGINS_BASE1_XVIDEO) += xvimagesink +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_ALSA) += alsa +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_CDPARANOIA) += cdparanoia +GST_PLUGINS_BASE1_ENABLEC-$(PTXCONF_GST_PLUGINS_BASE1_IVORBIS) += ivorbis +GST_PLUGINS_BASE1_ENABLEP-$(PTXCONF_GST_PLUGINS_BASE1_IVORBIS) += ivorbisdec +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_LIBVISUAL) += libvisual +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_OGG) += ogg +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_PANGO) += pango +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_THEORA) += theora +GST_PLUGINS_BASE1_ENABLE-$(PTXCONF_GST_PLUGINS_BASE1_VORBIS) += vorbis + +GST_PLUGINS_BASE1_ENABLEC-y += $(GST_PLUGINS_BASE1_ENABLE-y) +GST_PLUGINS_BASE1_ENABLEC- += $(GST_PLUGINS_BASE1_ENABLE-) +GST_PLUGINS_BASE1_ENABLEP-y += $(GST_PLUGINS_BASE1_ENABLE-y) + +# +# autoconf +# +GST_PLUGINS_BASE1_CONF_TOOL = autoconf +GST_PLUGINS_BASE1_CONF_OPT = \ + $(CROSS_AUTOCONF_USR) \ + $(GSTREAMER_GENERIC_CONF_OPT) \ + --enable-external \ + --disable-experimental \ + \ + --$(call ptx/endis,PTXCONF_GST_PLUGINS_BASE1_ORC)-orc \ + --enable-Bsymbolic \ + \ + --disable-iso-codes \ + --$(call ptx/endis,PTXCONF_GST_PLUGINS_BASE1_ZLIB)-zlib \ + --$(call ptx/endis,PTXCONF_GST_PLUGINS_BASE1_XSHM)-xshm \ + --disable-oggtest \ + --disable-vorbistest \ + --disable-freetypetest + +# --with-plugins=foo,bar,baz only works for depencyless plugins and +# when no plugins are given it falls back to its default which is +# to enable all plugins, so --with-plugins is useless for us. + +ifneq ($(call remove_quotes,$(GST_PLUGINS_BASE1_ENABLEC-y)),) +GST_PLUGINS_BASE1_CONF_OPT += --enable-$(subst $(space),$(space)--enable-,$(strip $(GST_PLUGINS_BASE1_ENABLEC-y))) +endif + +ifneq ($(call remove_quotes,$(GST_PLUGINS_BASE1_ENABLEC-)),) +GST_PLUGINS_BASE1_CONF_OPT += --disable-$(subst $(space),$(space)--disable-,$(strip $(GST_PLUGINS_BASE1_ENABLEC-))) +endif + +ifdef PTXCONF_GST_PLUGINS_BASE1_X +GST_PLUGINS_BASE1_CONF_OPT += --with-x=$(SYSROOT)/usr +else +GST_PLUGINS_BASE1_CONF_OPT += --without-x +endif + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/gst-plugins-base1.targetinstall: + @$(call targetinfo) + + @$(call install_init, gst-plugins-base1) + @$(call install_fixup, gst-plugins-base1,PRIORITY,optional) + @$(call install_fixup, gst-plugins-base1,SECTION,base) + @$(call install_fixup, gst-plugins-base1,AUTHOR,"Robert Schwebel ") + @$(call install_fixup, gst-plugins-base1,DESCRIPTION,missing) + + @$(call install_copy, gst-plugins-base1, 0, 0, 0755, -, \ + /usr/bin/gst-discoverer-1.0) + + # install all activated libs + @cd $(GST_PLUGINS_BASE1_PKGDIR)/usr/lib/ && \ + for libs in `find -name "*-1.0.so" -printf '%f\n'`; do \ + $(call install_lib, gst-plugins-base1, 0, 0, 0644, $${libs%.so}); \ + done + + @$(foreach plugin, $(GST_PLUGINS_BASE1_ENABLEP-y), \ + $(call install_copy, gst-plugins-base1, 0, 0, 0644, -, \ + /usr/lib/gstreamer-1.0/libgst$(plugin).so);) + + @$(call install_finish, gst-plugins-base1) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/gst-plugins-gl.in b/rules/gst-plugins-gl.in index 536478d..2aa7761 100644 --- a/rules/gst-plugins-gl.in +++ b/rules/gst-plugins-gl.in @@ -2,10 +2,12 @@ config GST_PLUGINS_GL tristate + select LIBPNG select GLIB select GSTREAMER select GST_PLUGINS_BASE select XORG_LIB_X11 + select XORG_SERVER if RUNTIME select XORG_SERVER_EXT_GLX select MESALIB select GLEW diff --git a/rules/gst-plugins-gl.make b/rules/gst-plugins-gl.make index 311220f..b46a796 100644 --- a/rules/gst-plugins-gl.make +++ b/rules/gst-plugins-gl.make @@ -41,6 +41,7 @@ GST_PLUGINS_GL_CONF_OPT := \ --disable-profiling \ --disable-valgrind \ --disable-gcov \ + --disable-examples \ --disable-gtk-doc # ---------------------------------------------------------------------------- diff --git a/rules/gst-plugins-good1.in b/rules/gst-plugins-good1.in new file mode 100644 index 0000000..fdaa9b1 --- /dev/null +++ b/rules/gst-plugins-good1.in @@ -0,0 +1,342 @@ +## SECTION=multimedia_gstreamer1 + +menuconfig GST_PLUGINS_GOOD1 + tristate + select GLIB + select GSTREAMER1 + select GST_PLUGINS_BASE1 + select LIBPNG if GST_PLUGINS_GOOD1_LIBPNG + select LIBJPEG if GST_PLUGINS_GOOD1_JPEG + select ZLIB if GST_PLUGINS_GOOD1_ZLIB + select BZIP2 if GST_PLUGINS_GOOD1_BZ2 + select BZIP2_LIBBZ2 if GST_PLUGINS_GOOD1_BZ2 + select LIBCACA if GST_PLUGINS_GOOD1_LIBCACA + select XORG_LIB_X11 if GST_PLUGINS_GOOD1_X + select XORG_LIB_X11 if GST_PLUGINS_GOOD1_XVIDEO + select GDK_PIXBUF if GST_PLUGINS_GOOD1_GDK_PIXBUF + select LIBSOUP if GST_PLUGINS_GOOD1_SOUP + select SPEEX if GST_PLUGINS_GOOD1_SPEEX + select FLAC if GST_PLUGINS_GOOD1_FLAC + select CAIRO if GST_PLUGINS_GOOD1_CAIRO + select UDEV if GST_PLUGINS_GOOD1_GST_V4L2 + select UDEV_LIBGUDEV if GST_PLUGINS_GOOD1_GST_V4L2 + select V4L_UTILS if GST_PLUGINS_GOOD1_GST_V4L2_LIBV4L2 + select V4L_UTILS_LIBV4L2 if GST_PLUGINS_GOOD1_GST_V4L2_LIBV4L2 + select ORC if GST_PLUGINS_GOOD1_ORC + + prompt "gst-plugins-good " + help + GStreamer Good Plug-ins is a set of plug-ins that + we consider to have good quality code, correct + functionality, our preferred license (LGPL for the + plug-in code, LGPL or LGPL-compatible for the + supporting library). + +if GST_PLUGINS_GOOD1 + +config GST_PLUGINS_GOOD1_ORC + bool + +# ------------------------------ +comment "dependency-less plugins" +# ------------------------------ + +config GST_PLUGINS_GOOD1_ALPHA + bool + prompt "alpha" + +config GST_PLUGINS_GOOD1_APETAG + bool + prompt "apetag" + +config GST_PLUGINS_GOOD1_AUDIOFX + bool + prompt "audiofx" + +config GST_PLUGINS_GOOD1_AUDIOPARSERS + bool + prompt "audioparsers" + +config GST_PLUGINS_GOOD1_AUPARSE + bool + prompt "auparse" + +config GST_PLUGINS_GOOD1_AUTODETECT + bool + prompt "autodetect" + +config GST_PLUGINS_GOOD1_AVI + bool + prompt "avi" + +config GST_PLUGINS_GOOD1_CUTTER + bool + prompt "cutter" + +config GST_PLUGINS_GOOD1_DEBUGUTILS + bool + prompt "debugutils" + +config GST_PLUGINS_GOOD1_DEINTERLACE + bool + select GST_PLUGINS_GOOD1_ORC + prompt "deinterlace" + +config GST_PLUGINS_GOOD1_EFFECTV + bool + prompt "effectv" + +config GST_PLUGINS_GOOD1_EQUALIZER + bool + prompt "equalizer" + +config GST_PLUGINS_GOOD1_FLV + bool + prompt "flv" + +config GST_PLUGINS_GOOD1_FLX + bool + prompt "flx" + +config GST_PLUGINS_GOOD1_GOOM + bool + select GST_PLUGINS_GOOD1_ORC + prompt "goom" + +config GST_PLUGINS_GOOD1_GOOM2K1 + bool + prompt "goom2k1" + +config GST_PLUGINS_GOOD1_ICYDEMUX + bool + prompt "icydemux" + +config GST_PLUGINS_GOOD1_ID3DEMUX + bool + prompt "id3demux" + +config GST_PLUGINS_GOOD1_IMAGEFREEZE + bool + prompt "imagefreeze" + +config GST_PLUGINS_GOOD1_INTERLEAVE + bool + prompt "interleave" + +config GST_PLUGINS_GOOD1_QTDEMUX + bool + prompt "isomp4" + +config GST_PLUGINS_GOOD1_LAW + bool + prompt "law" + +config GST_PLUGINS_GOOD1_LEVEL + bool + prompt "level" + +config GST_PLUGINS_GOOD1_MATROSKA + bool + prompt "matroska" + +config GST_PLUGINS_GOOD1_MONOSCOPE + bool + prompt "monoscope" + +config GST_PLUGINS_GOOD1_MULTIFILE + bool + prompt "multifile" + +config GST_PLUGINS_GOOD1_MULTIPART + bool + prompt "multipart" + +config GST_PLUGINS_GOOD1_REPLAYGAIN + bool + prompt "replaygain" + +config GST_PLUGINS_GOOD1_RTP + bool + prompt "rtp" + +config GST_PLUGINS_GOOD1_RTPMANAGER + bool + prompt "rtpmanager" + +config GST_PLUGINS_GOOD1_RTSP + bool + prompt "rtsp" + +config GST_PLUGINS_GOOD1_SHAPEWIPE + bool + prompt "shapewipe" + +config GST_PLUGINS_GOOD1_SMPTE + bool + prompt "smpte" + +config GST_PLUGINS_GOOD1_SPECTRUM + bool + prompt "spectrum" + +config GST_PLUGINS_GOOD1_UDP + bool + prompt "udp" + +config GST_PLUGINS_GOOD1_VIDEOBOX + bool + select GST_PLUGINS_GOOD1_ORC + prompt "videobox" + +config GST_PLUGINS_GOOD1_VIDEOCROP + bool + prompt "videocrop" + +config GST_PLUGINS_GOOD1_VIDEOFILTER + bool + prompt "videofilter" + +config GST_PLUGINS_GOOD1_VIDEOMIXER + bool + select GST_PLUGINS_GOOD1_ORC + prompt "videomixer" + +config GST_PLUGINS_GOOD1_WAVENC + bool + prompt "wavenc" + +config GST_PLUGINS_GOOD1_WAVPARSE + bool + prompt "wavparse" + +config GST_PLUGINS_GOOD1_Y4M + bool + prompt "y4m" + +# --------------------------------- +comment "plugins with dependencies" +# --------------------------------- + +config GST_PLUGINS_GOOD1_OSS + bool + prompt "oss" + +config GST_PLUGINS_GOOD1_OSS4 + bool + prompt "oss4" + +config GST_PLUGINS_GOOD1_GST_V4L2 + bool + prompt "gst_v4l2" + +config GST_PLUGINS_GOOD1_GST_V4L2_LIBV4L2 + bool + depends on GST_PLUGINS_GOOD1_GST_V4L2 + prompt "build v4l2 plugin with libv4l2 support" + +config GST_PLUGINS_GOOD1_XVIDEO + bool + depends on GST_PLUGINS_GOOD1_GST_V4L2 + prompt "xvideo support" + +config GST_PLUGINS_GOOD1_X + bool + prompt "x" + +config GST_PLUGINS_GOOD1_XSHM + bool + depends on GST_PLUGINS_GOOD1_X + prompt "xshm support" + +config GST_PLUGINS_GOOD1_AALIB + bool + depends on BROKEN + prompt "aalib" + +config GST_PLUGINS_GOOD1_CAIRO + bool + prompt "cairo" + +config GST_PLUGINS_GOOD1_FLAC + bool + prompt "flac" + +config GST_PLUGINS_GOOD1_GDK_PIXBUF + bool + prompt "gdk_pixbuf" + +config GST_PLUGINS_GOOD1_JACK + bool + prompt "jack" + depends on BROKEN + +config GST_PLUGINS_GOOD1_JPEG + bool + prompt "jpeg" + +config GST_PLUGINS_GOOD1_LIBCACA + bool + prompt "libcaca" + +config GST_PLUGINS_GOOD1_LIBDV + bool + depends on BROKEN + prompt "libdv" + +config GST_PLUGINS_GOOD1_LIBPNG + bool + prompt "libpng" + +config GST_PLUGINS_GOOD1_PULSE + bool + depends on BROKEN + prompt "pulse" + +config GST_PLUGINS_GOOD1_DV1394 + bool + depends on BROKEN + prompt "dv1394" + +config GST_PLUGINS_GOOD1_SHOUT2 + bool + depends on BROKEN + prompt "shout2" + +config GST_PLUGINS_GOOD1_SOUP + bool + prompt "soup" + +config GST_PLUGINS_GOOD1_SPEEX + bool + prompt "speex" + +config GST_PLUGINS_GOOD1_TAGLIB + bool + depends on BROKEN + prompt "taglib" + +config GST_PLUGINS_GOOD1_VPX + bool + depends on BROKEN + prompt "vpx" + +config GST_PLUGINS_GOOD1_WAVPACK + bool + depends on BROKEN + prompt "wavpack" + +comment "Support options" + +config GST_PLUGINS_GOOD1_ZLIB + bool + prompt "zlib" + help + zlib support for id3demux/qtdemux/matroska + +config GST_PLUGINS_GOOD1_BZ2 + bool + prompt "bz2" + help + bz2 support for matroska + +endif diff --git a/rules/gst-plugins-good1.make b/rules/gst-plugins-good1.make new file mode 100644 index 0000000..37426cd --- /dev/null +++ b/rules/gst-plugins-good1.make @@ -0,0 +1,178 @@ +# -*-makefile-*- +# +# Copyright (C) 2008 by Robert Schwebel +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_GST_PLUGINS_GOOD1) += gst-plugins-good1 + +# +# Paths and names +# +GST_PLUGINS_GOOD1_VERSION := 1.0.8 +GST_PLUGINS_GOOD1_MD5 := 4969826043bbd3f76e4a0d49ea475736 +GST_PLUGINS_GOOD1 := gst-plugins-good-$(GST_PLUGINS_GOOD1_VERSION) +GST_PLUGINS_GOOD1_SUFFIX := tar.xz +GST_PLUGINS_GOOD1_URL := http://gstreamer.freedesktop.org/src/gst-plugins-good/$(GST_PLUGINS_GOOD1).$(GST_PLUGINS_GOOD1_SUFFIX) +GST_PLUGINS_GOOD1_SOURCE := $(SRCDIR)/$(GST_PLUGINS_GOOD1).$(GST_PLUGINS_GOOD1_SUFFIX) +GST_PLUGINS_GOOD1_DIR := $(BUILDDIR)/$(GST_PLUGINS_GOOD1) + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_ALPHA) += alpha +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_ALPHA) += alpha alphacolor +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_APETAG) += apetag +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_AUDIOFX) += audiofx +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_AUDIOPARSERS) += audioparsers +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_AUPARSE) += auparse +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_AUTODETECT) += autodetect +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_AVI) += avi +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_CUTTER) += cutter +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_DEBUGUTILS) += debugutils +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_DEBUGUTILS) += debug navigationtest +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_DEINTERLACE) += deinterlace +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_EFFECTV) += effectv +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_EQUALIZER) += equalizer +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_FLV) += flv +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_FLX) += flx +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_FLX) += flxdec +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_GOOM) += goom +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_GOOM2K1) += goom2k1 +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_ICYDEMUX) += icydemux +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_ID3DEMUX) += id3demux +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_IMAGEFREEZE) += imagefreeze +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_INTERLEAVE) += interleave +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_QTDEMUX) += isomp4 +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_LAW) += law +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_LAW) += alaw mulaw +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_LEVEL) += level +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_MATROSKA) += matroska +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_MONOSCOPE) += monoscope +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_MULTIFILE) += multifile +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_MULTIPART) += multipart +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_REPLAYGAIN) += replaygain +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_RTP) += rtp +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_RTPMANAGER) += rtpmanager +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_RTSP) += rtsp +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_SHAPEWIPE) += shapewipe +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_SMPTE) += smpte +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_SPECTRUM) += spectrum +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_UDP) += udp +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_VIDEOBOX) += videobox +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_VIDEOCROP) += videocrop +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_VIDEOFILTER) += videofilter +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_VIDEOMIXER) += videomixer +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_WAVENC) += wavenc +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_WAVPARSE) += wavparse +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_Y4M) += y4m +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_Y4M) += y4menc +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_OSS) += oss +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_OSS) += ossaudio +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_OSS4) += oss4 +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_OSS4) += oss4audio +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_GST_V4L2) += gst_v4l2 +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_GST_V4L2) += video4linux2 +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_X) += x +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_X) += ximagesrc +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_XSHM) += xshm +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_XVIDEO) += xvideo +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_AALIB) += aalib +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_CAIRO) += cairo +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_FLAC) += flac +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_GDK_PIXBUF) += gdk_pixbuf +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_GDK_PIXBUF) += gdkpixbuf +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_JACK) += jack +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_JPEG) += jpeg +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_LIBCACA) += libcaca +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_LIBCACA) += cacasink +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_LIBDV) += libdv +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_LIBPNG) += libpng +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_LIBPNG) += png +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_PULSE) += pulse +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_DV1394) += dv1394 +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_SHOUT2) += shout2 +GST_PLUGINS_GOOD1_ENABLEC-$(PTXCONF_GST_PLUGINS_GOOD1_SOUP) += soup +GST_PLUGINS_GOOD1_ENABLEP-$(PTXCONF_GST_PLUGINS_GOOD1_SOUP) += souphttpsrc +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_SPEEX) += speex +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_TAGLIB) += taglib +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_VPX) += vpx +GST_PLUGINS_GOOD1_ENABLE-$(PTXCONF_GST_PLUGINS_GOOD1_WAVPACK) += wavpack + +GST_PLUGINS_GOOD1_ENABLEC-y += $(GST_PLUGINS_GOOD1_ENABLE-y) +GST_PLUGINS_GOOD1_ENABLEC- += $(GST_PLUGINS_GOOD1_ENABLE-) +GST_PLUGINS_GOOD1_ENABLEP-y += $(GST_PLUGINS_GOOD1_ENABLE-y) + +# for new linux/videodev2.h from kernel headers +GST_PLUGINS_GOOD1_CONF_ENV := \ + $(CROSS_ENV) \ + CPPFLAGS="$(CROSS_CPPFLAGS) -I$(KERNEL_HEADERS_INCLUDE_DIR)" + +# +# autoconf +# +GST_PLUGINS_GOOD1_CONF_TOOL := autoconf +GST_PLUGINS_GOOD1_CONF_OPT = \ + $(CROSS_AUTOCONF_USR) \ + $(GSTREAMER_GENERIC_CONF_OPT) \ + --enable-external \ + --enable-experimental \ + \ + --$(call ptx/endis,PTXCONF_GST_PLUGINS_GOOD1_ORC)-orc \ + --disable-directsound \ + --disable-waveform \ + \ + --disable-sunaudio \ + --disable-osx_audio \ + --disable-osx_video \ + --disable-aalibtest \ + --$(call ptx/endis,PTXCONF_GST_PLUGINS_GOOD1_ZLIB)-zlib \ + --$(call ptx/endis,PTXCONF_GST_PLUGINS_GOOD1_BZ2)-bz2 \ + --$(call ptx/wwo,PTXCONF_GST_PLUGINS_GOOD1_GST_V4L2)-gudev \ + --$(call ptx/wwo,PTXCONF_GST_PLUGINS_GOOD1_GST_V4L2_LIBV4L2)-libv4l2 + +# +# the --with-plugins sadly only applies to depencyless plugings +# and when no plugins are sellected it builds them all. So +# --with-plugins is useless, so we generate a --enable-* +# and --disable-* below +# +ifneq ($(call remove_quotes,$(GST_PLUGINS_GOOD1_ENABLEC-y)),) +GST_PLUGINS_GOOD1_CONF_OPT += --enable-$(subst $(space),$(space)--enable-,$(strip $(GST_PLUGINS_GOOD1_ENABLEC-y))) +endif + +ifneq ($(call remove_quotes,$(GST_PLUGINS_GOOD1_ENABLEC-)),) +GST_PLUGINS_GOOD1_CONF_OPT += --disable-$(subst $(space),$(space)--disable-,$(strip $(GST_PLUGINS_GOOD1_ENABLEC-))) +endif + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/gst-plugins-good1.targetinstall: + @$(call targetinfo) + + @$(call install_init, gst-plugins-good1) + @$(call install_fixup, gst-plugins-good1,PRIORITY,optional) + @$(call install_fixup, gst-plugins-good1,SECTION,base) + @$(call install_fixup, gst-plugins-good1,AUTHOR,"Robert Schwebel ") + @$(call install_fixup, gst-plugins-good1,DESCRIPTION,missing) + + @for plugin in $(GST_PLUGINS_GOOD1_ENABLEP-y); do \ + $(call install_copy, gst-plugins-good1, 0, 0, 0644, -, \ + /usr/lib/gstreamer-1.0/libgst$${plugin}.so); \ + done + + @$(call install_finish, gst-plugins-good1) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/gst-plugins-ugly1.in b/rules/gst-plugins-ugly1.in new file mode 100644 index 0000000..67ed833 --- /dev/null +++ b/rules/gst-plugins-ugly1.in @@ -0,0 +1,101 @@ +## SECTION=multimedia_gstreamer1 + +menuconfig GST_PLUGINS_UGLY1 + tristate + select GLIB + select GSTREAMER1 + select GST_PLUGINS_BASE1 + select LIBMAD if GST_PLUGINS_UGLY1_MAD + select LIBID3TAG if GST_PLUGINS_UGLY1_MAD + select LIBMPEG2 if GST_PLUGINS_UGLY1_MPEG2DEC + select LAME if GST_PLUGINS_UGLY1_LAME + select TWOLAME if GST_PLUGINS_UGLY1_TWOLAME + select ORC if GST_PLUGINS_UGLY1_ORC + prompt "gst-plugins-ugly " + help + GStreamer Ugly Plug-ins is a set of plug-ins that + have good quality and correct functionality, but + distributing them might pose problems. The license + on either the plug-ins or the supporting libraries + might not be how we'd like. The code might be widely + known to present patent problems. + +if GST_PLUGINS_UGLY1 + +config GST_PLUGINS_UGLY1_ORC + bool + +config GST_PLUGINS_UGLY1_ASFDEMUX + bool + prompt "asfdemux" + +config GST_PLUGINS_UGLY1_DVDLPCMDEC + bool + prompt "dvdlpcmdec" + +config GST_PLUGINS_UGLY1_DVDSUB + bool + prompt "dvdsub" + +config GST_PLUGINS_UGLY1_XINGMUX + bool + prompt "xingmux" + +config GST_PLUGINS_UGLY1_REALMEDIA + bool + prompt "realmedia" + +config GST_PLUGINS_UGLY1_A52DEC + bool + depends on BROKEN + select GST_PLUGINS_UGLY1_ORC + prompt "a52dec" + +config GST_PLUGINS_UGLY1_AMRNB + bool + depends on BROKEN + prompt "amrnb" + +config GST_PLUGINS_UGLY1_AMRWBDEC + bool + depends on BROKEN + prompt "amrwbdec" + +config GST_PLUGINS_UGLY1_CDIO + bool + depends on BROKEN + prompt "cdio" + +config GST_PLUGINS_UGLY1_DVDREADSRC + bool + depends on BROKEN + prompt "dvdreadsrc" + +config GST_PLUGINS_UGLY1_LAME + bool + prompt "lame" + +config GST_PLUGINS_UGLY1_MAD + bool + prompt "mad" + +config GST_PLUGINS_UGLY1_MPEG2DEC + bool + prompt "mpeg2dec" + +config GST_PLUGINS_UGLY1_SID + bool + depends on BROKEN + prompt "sid" + +config GST_PLUGINS_UGLY1_TWOLAME + bool + prompt "twolame" + +config GST_PLUGINS_UGLY1_X264 + bool + depends on BROKEN + prompt "x264" + +endif + diff --git a/rules/gst-plugins-ugly1.make b/rules/gst-plugins-ugly1.make new file mode 100644 index 0000000..e6eefe6 --- /dev/null +++ b/rules/gst-plugins-ugly1.make @@ -0,0 +1,111 @@ +# -*-makefile-*- +# +# Copyright (C) 2010 by Erwin Rol +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_GST_PLUGINS_UGLY1) += gst-plugins-ugly1 + +# +# Paths and names +# +GST_PLUGINS_UGLY1_VERSION := 1.0.8 +GST_PLUGINS_UGLY1_MD5 := 67fd24035eccee556ed9e89d75447d94 +GST_PLUGINS_UGLY1 := gst-plugins-ugly-$(GST_PLUGINS_UGLY1_VERSION) +GST_PLUGINS_UGLY1_SUFFIX := tar.xz +GST_PLUGINS_UGLY1_URL := http://gstreamer.freedesktop.org/src/gst-plugins-ugly/$(GST_PLUGINS_UGLY1).$(GST_PLUGINS_UGLY1_SUFFIX) +GST_PLUGINS_UGLY1_SOURCE := $(SRCDIR)/$(GST_PLUGINS_UGLY1).$(GST_PLUGINS_UGLY1_SUFFIX) +GST_PLUGINS_UGLY1_DIR := $(BUILDDIR)/$(GST_PLUGINS_UGLY1) + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +GST_PLUGINS_UGLY1_ENABLEC-$(PTXCONF_GST_PLUGINS_UGLY1_ASFDEMUX) += asfdemux +GST_PLUGINS_UGLY1_ENABLEP-$(PTXCONF_GST_PLUGINS_UGLY1_ASFDEMUX) += asf +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_DVDLPCMDEC) += dvdlpcmdec +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_DVDSUB) += dvdsub +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_XINGMUX) += xingmux +GST_PLUGINS_UGLY1_ENABLEC-$(PTXCONF_GST_PLUGINS_UGLY1_REALMEDIA) += realmedia +GST_PLUGINS_UGLY1_ENABLEP-$(PTXCONF_GST_PLUGINS_UGLY1_REALMEDIA) += rmdemux +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_A52DEC) += a52dec +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_AMRNB) += amrnb +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_AMRWBDEC) += amrwb +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_CDIO) += cdio +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_DVDREADSRC) += dvdread +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_LAME) += lame +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_MAD) += mad +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_MPEG2DEC) += mpeg2dec +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_SID) += sidplay +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_TWOLAME) += twolame +GST_PLUGINS_UGLY1_ENABLE-$(PTXCONF_GST_PLUGINS_UGLY1_X264) += x264 + +GST_PLUGINS_UGLY1_ENABLEC-y += $(GST_PLUGINS_UGLY1_ENABLE-y) +GST_PLUGINS_UGLY1_ENABLEC- += $(GST_PLUGINS_UGLY1_ENABLE-) +GST_PLUGINS_UGLY1_ENABLEP-y += $(GST_PLUGINS_UGLY1_ENABLE-y) + +# +# autoconf +# +GST_PLUGINS_UGLY1_CONF_TOOL := autoconf +GST_PLUGINS_UGLY1_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --enable-option-checking \ + --enable-silent-rules \ + --disable-nls \ + --disable-rpath \ + --disable-debug \ + --disable-profiling \ + --disable-valgrind \ + --disable-gcov \ + --disable-examples \ + --enable-external \ + --enable-experimental \ + --disable-gtk-doc \ + --with-package-origin="PTXDist" + +# +# the --with-plugins sadly only applies to depencyless plugings +# and when no plugins are sellected it builds them all. So +# --with-plugins is useless, so we generate a --enable-* +# and --disable-* below +# +ifneq ($(call remove_quotes,$(GST_PLUGINS_UGLY1_ENABLEC-y)),) +GST_PLUGINS_UGLY1_CONF_OPT += --enable-$(subst $(space),$(space)--enable-,$(strip $(GST_PLUGINS_UGLY1_ENABLEC-y))) +endif + +ifneq ($(call remove_quotes,$(GST_PLUGINS_UGLY1_ENABLEC-)),) +GST_PLUGINS_UGLY1_CONF_OPT += --disable-$(subst $(space),$(space)--disable-,$(strip $(GST_PLUGINS_UGLY1_ENABLEC-))) +endif + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/gst-plugins-ugly1.targetinstall: + @$(call targetinfo) + + @$(call install_init, gst-plugins-ugly1) + @$(call install_fixup, gst-plugins-ugly1,PRIORITY,optional) + @$(call install_fixup, gst-plugins-ugly1,SECTION,base) + @$(call install_fixup, gst-plugins-ugly1,AUTHOR,"Erwin Rol ") + @$(call install_fixup, gst-plugins-ugly1,DESCRIPTION,missing) + + # install all activated plugins + @for plugin in $(GST_PLUGINS_UGLY1_ENABLEP-y); do \ + $(call install_copy, gst-plugins-ugly1, 0, 0, 0644, -, \ + /usr/lib/gstreamer-1.0/libgst$${plugin}.so); \ + done + + @$(call install_finish, gst-plugins-ugly1) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/gstreamer.make b/rules/gstreamer.make index 01b3acd..c4080d7 100644 --- a/rules/gstreamer.make +++ b/rules/gstreamer.make @@ -33,6 +33,7 @@ GSTREAMER_DIR := $(BUILDDIR)/$(GSTREAMER) # autoconf # GSTREAMER_GENERIC_CONF_OPT = \ + --disable-static \ --disable-nls \ --disable-rpath \ --disable-debug \ diff --git a/rules/gstreamer1.in b/rules/gstreamer1.in new file mode 100644 index 0000000..32e12f5 --- /dev/null +++ b/rules/gstreamer1.in @@ -0,0 +1,50 @@ +## SECTION=multimedia_gstreamer1 + +menuconfig GSTREAMER1 + tristate + prompt "gstreamer " + select LIBC_M + select GLIB + select HOST_FLEX + help + GStreamer is a streaming media framework, based on graphs of + filters which operate on media data. Applications using this + library can do anything from real-time sound processing to + playing videos, and just about anything else + media-related. Its plugin-based architecture means that new + data types or processing capabilities can be added simply by + installing new plug-ins. + +if GSTREAMER1 + + comment "compile options" + + config GSTREAMER1_DEBUG + bool + prompt "debug support" + + config GSTREAMER1_CMDLINEPARSER + bool + prompt "commandline parser" + + config GSTREAMER1_OPTIONPARSING + bool + prompt "option parsing when gst init" + + comment "install options" + + config GSTREAMER1_INSTALL_TYPEFIND + bool + prompt "install gst-typefind" + + config GSTREAMER1_INSTALL_INSPECT + bool + prompt "install gst-inspect" + + config GSTREAMER1_INSTALL_LAUNCH + bool + select GSTREAMER1_CMDLINEPARSER + prompt "install gst-launch" + +endif + diff --git a/rules/gstreamer1.make b/rules/gstreamer1.make new file mode 100644 index 0000000..de25040 --- /dev/null +++ b/rules/gstreamer1.make @@ -0,0 +1,126 @@ +# -*-makefile-*- +# +# Copyright (C) 2008 by Robert Schwebel +# 2011 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_GSTREAMER1) += gstreamer1 + +# +# Paths and names +# +GSTREAMER1_VERSION := 1.0.8 +GSTREAMER1_MD5 := fb0c73470e8dd5dab01e5e9e62db9db9 +GSTREAMER1 := gstreamer-$(GSTREAMER1_VERSION) +GSTREAMER1_SUFFIX := tar.xz +GSTREAMER1_URL := http://gstreamer.freedesktop.org/src/gstreamer/$(GSTREAMER1).$(GSTREAMER1_SUFFIX) +GSTREAMER1_SOURCE := $(SRCDIR)/$(GSTREAMER1).$(GSTREAMER1_SUFFIX) +GSTREAMER1_DIR := $(BUILDDIR)/$(GSTREAMER1) + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +GSTREAMER1_GENERIC_CONF_OPT = \ + --disable-nls \ + --disable-rpath \ + --disable-fatal-warnings \ + \ + --disable-debug \ + --disable-profiling \ + --disable-valgrind \ + --disable-gcov \ + --disable-examples \ + --disable-static-plugins \ + \ + $(GLOBAL_LARGE_FILE_OPTION) \ + --disable-introspection \ + \ + --disable-gtk-doc \ + --disable-gtk-doc-html \ + --disable-gtk-doc-pdf \ + --disable-gobject-cast-checks \ + --disable-glib-asserts \ + \ + --without-libiconv-prefix \ + --without-libintl-prefix \ + +GSTREAMER1_AUTOCONF := \ + $(CROSS_AUTOCONF_USR) \ + $(GSTREAMER1_GENERIC_CONF_OPT) \ + --$(call ptx/endis,PTXCONF_GSTREAMER1_DEBUG)-gst-debug \ + --$(call ptx/endis,PTXCONF_GSTREAMER1_CMDLINEPARSER)-parse \ + --$(call ptx/endis,PTXCONF_GSTREAMER1_OPTIONPARSING)-option-parsing \ + --disable-trace \ + --disable-alloc-trace \ + --enable-registry \ + --enable-plugin \ + \ + --disable-tests \ + --disable-failing-tests \ + --disable-benchmarks \ + --enable-tools \ + --disable-poisoning \ + \ + --disable-docbook \ + \ + --disable-check \ + --enable-Bsymbolic + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/gstreamer1.targetinstall: + @$(call targetinfo) + + @$(call install_init, gstreamer1) + @$(call install_fixup, gstreamer1,PRIORITY,optional) + @$(call install_fixup, gstreamer1,SECTION,base) + @$(call install_fixup, gstreamer1,AUTHOR,"Robert Schwebel ") + @$(call install_fixup, gstreamer1,DESCRIPTION,missing) + +ifdef PTXCONF_GSTREAMER1_INSTALL_TYPEFIND + @$(call install_copy, gstreamer1, 0, 0, 0755, -, \ + /usr/bin/gst-typefind-1.0) +endif +ifdef PTXCONF_GSTREAMER1_INSTALL_INSPECT + @$(call install_copy, gstreamer1, 0, 0, 0755, -, \ + /usr/bin/gst-inspect-1.0) +endif +ifdef PTXCONF_GSTREAMER1_INSTALL_LAUNCH + @$(call install_copy, gstreamer1, 0, 0, 0755, -, \ + /usr/bin/gst-launch-1.0) +endif + @$(call install_lib, gstreamer1, 0, 0, 0644, libgstbase-1.0) + @$(call install_lib, gstreamer1, 0, 0, 0644, libgstcontroller-1.0) + @$(call install_lib, gstreamer1, 0, 0, 0644, libgstnet-1.0) + @$(call install_lib, gstreamer1, 0, 0, 0644, libgstreamer-1.0) + + @$(call install_lib, gstreamer1, 0, 0, 0644, \ + gstreamer-1.0/libgstcoreelements) + + @$(call install_copy, gstreamer1, 0, 0, 0755, -, \ + /usr/libexec/gstreamer-1.0/gst-plugin-scanner) + +ifdef PTXCONF_PRELINK + @$(call install_alternative, gstreamer1, 0, 0, 0644, \ + /etc/prelink.conf.d/gstreamer1) +endif + + @$(call install_finish, gstreamer1) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/gtk.in b/rules/gtk.in index 3500aa6..72a5242 100644 --- a/rules/gtk.in +++ b/rules/gtk.in @@ -15,11 +15,15 @@ menuconfig GTK select CAIRO_GOBJECT select GDK_PIXBUF + # disabling xkb is broken + select GTK_XKB + select XORG_LIB_X11 if GTK_XKB select XORG_LIB_X11_XKB if GTK_XKB select XORG_LIB_XINERAMA if GTK_XINERAMA # FIXME - gtk's configure doesn't check for XInput.h. Should be patched. - select XORG_LIB_XI if GTK_XINPUT + # gdk needs XInput.h even with xinput disabled + select XORG_LIB_XI select XORG_LIB_XRANDR if GTK_XRANDR select XORG_LIB_XFIXES if GTK_XFIXES select XORG_LIB_XCOMPOSITE if GTK_XCOMPOSITE diff --git a/rules/host-apr-util.in b/rules/host-apr-util.in index b9aaaee..83a4058 100644 --- a/rules/host-apr-util.in +++ b/rules/host-apr-util.in @@ -3,4 +3,5 @@ config HOST_APR_UTIL tristate default ALLYES + select HOST_EXPAT select HOST_APR diff --git a/rules/host-apr-util.make b/rules/host-apr-util.make index cb3b53c..bfd604c 100644 --- a/rules/host-apr-util.make +++ b/rules/host-apr-util.make @@ -23,6 +23,7 @@ HOST_PACKAGES-$(PTXCONF_HOST_APR_UTIL) += host-apr-util HOST_APR_UTIL_CONF_TOOL := autoconf HOST_APR_UTIL_CONF_OPT := \ $(HOST_AUTOCONF) \ + --with-expat=$(PTXDIST_SYSROOT_HOST) \ --with-apr=$(PTXDIST_SYSROOT_HOST)/bin/apr-config # ---------------------------------------------------------------------------- diff --git a/rules/host-autotools-autoconf.in b/rules/host-autotools-autoconf.in index cea2ea4..2af70df 100644 --- a/rules/host-autotools-autoconf.in +++ b/rules/host-autotools-autoconf.in @@ -2,4 +2,5 @@ config HOST_AUTOTOOLS_AUTOCONF bool + select HOST_SYSTEM_PERL default y diff --git a/rules/host-autotools-automake.in b/rules/host-autotools-automake.in index 91b5e89..538e524 100644 --- a/rules/host-autotools-automake.in +++ b/rules/host-autotools-automake.in @@ -3,4 +3,5 @@ config HOST_AUTOTOOLS_AUTOMAKE bool default y + select HOST_SYSTEM_PERL select HOST_AUTOTOOLS_AUTOCONF diff --git a/rules/host-bzip2.in b/rules/host-bzip2.in index 3760cfc..b2b24c7 100644 --- a/rules/host-bzip2.in +++ b/rules/host-bzip2.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_BZIP2 tristate diff --git a/rules/host-cdrkit.in b/rules/host-cdrkit.in index d1c83e5..b586c69 100644 --- a/rules/host-cdrkit.in +++ b/rules/host-cdrkit.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_CDRKIT tristate diff --git a/rules/host-ckermit.make b/rules/host-ckermit.make index 8b3f4bb..7889211 100644 --- a/rules/host-ckermit.make +++ b/rules/host-ckermit.make @@ -30,18 +30,20 @@ HOST_CKERMIT_CONF_TOOL := NO # Compile # ---------------------------------------------------------------------------- -HOST_CKERMIT_MAKEVARS := \ - xermit \ - KTARGET=linuxa \ +HOST_CKERMIT_MAKE_OPT := \ + linuxa \ prefix= \ - CFLAGS='$(HOST_CPPFLAGS) $(HOST_CFLAGS) -O2 -g -DLINUX -DFNFLOAT -DCK_POSIX_SIG -DCK_NEWTERM -DTCPSOCKET -DLINUXFSSTND -DNOCOTFMC -DPOSIX -DUSE_STRERROR -DCK_NCURSES -DHAVE_PTMX' \ - LNKFLAGS='$(HOST_LDFLAGS)' \ - LIBS='-lncurses -lutil -lresolv -lcrypt -lm' + KFLAGS='-O2 -DCK_NCURSES -DHAVE_PTMX' \ + LIBS='-lncurses -lutil -lresolv -lcrypt' # ---------------------------------------------------------------------------- # Install # ---------------------------------------------------------------------------- +HOST_CKERMIT_INSTALL_OPT := \ + prefix= \ + install + $(STATEDIR)/host-ckermit.install: @$(call targetinfo) @$(call install, HOST_CKERMIT) diff --git a/rules/host-cmake.in b/rules/host-cmake.in index bf64cc1..d0413fb 100644 --- a/rules/host-cmake.in +++ b/rules/host-cmake.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_CMAKE tristate diff --git a/rules/host-cmake.make b/rules/host-cmake.make index 5599543..4925264 100644 --- a/rules/host-cmake.make +++ b/rules/host-cmake.make @@ -17,8 +17,8 @@ HOST_PACKAGES-$(PTXCONF_HOST_CMAKE) += host-cmake # # Paths and names # -HOST_CMAKE_VERSION := 2.8.8 -HOST_CMAKE_MD5 := ba74b22c788a0c8547976b880cd02b17 +HOST_CMAKE_VERSION := 2.8.11 +HOST_CMAKE_MD5 := be6008f2299613d23fe82ab53ef7472e HOST_CMAKE := cmake-$(HOST_CMAKE_VERSION) HOST_CMAKE_SUFFIX := tar.gz HOST_CMAKE_URL := http://www.cmake.org/files/v2.8/$(HOST_CMAKE).$(HOST_CMAKE_SUFFIX) diff --git a/rules/host-cramfs.in b/rules/host-cramfs.in index bde1bc8..03f9371 100644 --- a/rules/host-cramfs.in +++ b/rules/host-cramfs.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_CRAMFS tristate diff --git a/rules/host-cramfs.make b/rules/host-cramfs.make index fae78a9..d065523 100644 --- a/rules/host-cramfs.make +++ b/rules/host-cramfs.make @@ -29,9 +29,7 @@ HOST_CRAMFS_DIR := $(HOST_BUILDDIR)/$(HOST_CRAMFS) # Prepare # ---------------------------------------------------------------------------- -HOST_CRAMFS_PATH := PATH=$(HOST_PATH) -HOST_CRAMFS_MAKE_ENV := $(HOST_ENV) -HOST_CRAMFS_MAKE_OPT := CPPFLAGS="-I. $(HOST_CPPFLAGS)" +HOST_CRAMFS_CONF_TOOL := NO # ---------------------------------------------------------------------------- # Install diff --git a/rules/host-dosfstools.in b/rules/host-dosfstools.in index 4f4a5b5..074056c 100644 --- a/rules/host-dosfstools.in +++ b/rules/host-dosfstools.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_DOSFSTOOLS tristate diff --git a/rules/host-e2fsprogs.in b/rules/host-e2fsprogs.in index bf754f1..343768b 100644 --- a/rules/host-e2fsprogs.in +++ b/rules/host-e2fsprogs.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_E2FSPROGS tristate diff --git a/rules/host-genext2fs.in b/rules/host-genext2fs.in index 13d342f..2b3061a 100644 --- a/rules/host-genext2fs.in +++ b/rules/host-genext2fs.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_GENEXT2FS tristate diff --git a/rules/host-genimage.in b/rules/host-genimage.in index 50705e2..8b732dc 100644 --- a/rules/host-genimage.in +++ b/rules/host-genimage.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_GENIMAGE tristate diff --git a/rules/host-genimage.make b/rules/host-genimage.make index 52c6f99..12fa1f9 100644 --- a/rules/host-genimage.make +++ b/rules/host-genimage.make @@ -16,8 +16,8 @@ HOST_PACKAGES-$(PTXCONF_HOST_GENIMAGE) += host-genimage # # Paths and names # -HOST_GENIMAGE_VERSION := 4 -HOST_GENIMAGE_MD5 := accbbee9c4782e2607e3cc27c0ba7cb1 +HOST_GENIMAGE_VERSION := 5 +HOST_GENIMAGE_MD5 := 3b3fb265830028c8562247ba0569a114 HOST_GENIMAGE := genimage-$(HOST_GENIMAGE_VERSION) HOST_GENIMAGE_SUFFIX := tar.xz HOST_GENIMAGE_URL := http://www.pengutronix.de/software/genimage/download/$(HOST_GENIMAGE).$(HOST_GENIMAGE_SUFFIX) diff --git a/rules/host-genpart.in b/rules/host-genpart.in index 103e81d..450ef80 100644 --- a/rules/host-genpart.in +++ b/rules/host-genpart.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_GENPART tristate diff --git a/rules/host-gettext.in b/rules/host-gettext.in index 5b37cdb..19d2f1e 100644 --- a/rules/host-gettext.in +++ b/rules/host-gettext.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_GETTEXT tristate diff --git a/rules/host-intltool.in b/rules/host-intltool.in index 1639c27..a3bb3a0 100644 --- a/rules/host-intltool.in +++ b/rules/host-intltool.in @@ -4,6 +4,8 @@ config HOST_INTLTOOL tristate default ALLYES select HOST_GETTEXT + select HOST_SYSTEM_PERL + select HOST_SYSTEM_PERL_XMLPARSER help intltool is a set of tools to centralise translation of many different file formats using GNU gettext-compatible PO files. diff --git a/rules/host-intltool.make b/rules/host-intltool.make index 143c3c3..71e6ec7 100644 --- a/rules/host-intltool.make +++ b/rules/host-intltool.make @@ -13,14 +13,6 @@ # HOST_PACKAGES-$(PTXCONF_HOST_INTLTOOL) += host-intltool -ifdef PTXCONF_HOST_INTLTOOL -ifeq ($(shell perl -e "require XML::Parser" 2>/dev/null || echo no),no) - $(warning *** XML::Parser perl module is required for host-intltool) - $(warning *** please install libxml-parser-perl (debian)) - $(error ) -endif -endif - # # Paths and names # @@ -41,4 +33,14 @@ HOST_INTLTOOL_DIR := $(HOST_BUILDDIR)/$(HOST_INTLTOOL) # HOST_INTLTOOL_CONF_TOOL := autoconf +# ---------------------------------------------------------------------------- +# Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/host-intltool.install.post: + @$(call targetinfo) + @$(call world/install.post, HOST_INTLTOOL) + @sed -i "s;^prefix=$$;prefix=$(PTXCONF_SYSROOT_HOST);" $(PTXCONF_SYSROOT_HOST)/bin/intltoolize + @$(call touch) + # vim: syntax=make diff --git a/rules/host-libblkid.in b/rules/host-libblkid.in index 9416eb4..ee0108b 100644 --- a/rules/host-libblkid.in +++ b/rules/host-libblkid.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_LIBBLKID tristate diff --git a/rules/host-libcap.in b/rules/host-libcap.in index 7b0ca3b..0ab7bf4 100644 --- a/rules/host-libcap.in +++ b/rules/host-libcap.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_LIBCAP tristate diff --git a/rules/host-libconfuse.in b/rules/host-libconfuse.in index 41773fa..ff01a4f 100644 --- a/rules/host-libconfuse.in +++ b/rules/host-libconfuse.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_LIBCONFUSE tristate diff --git a/rules/host-libiconv.in b/rules/host-libiconv.in index b51c228..39267c8 100644 --- a/rules/host-libiconv.in +++ b/rules/host-libiconv.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_LIBICONV tristate diff --git a/rules/host-libkmod.in b/rules/host-libkmod.in index 60613a2..5d672e8 100644 --- a/rules/host-libkmod.in +++ b/rules/host-libkmod.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_LIBKMOD tristate diff --git a/rules/host-libkmod.make b/rules/host-libkmod.make index 6a55cfd..ccd151c 100644 --- a/rules/host-libkmod.make +++ b/rules/host-libkmod.make @@ -26,6 +26,7 @@ HOST_LIBKMOD_CONF_OPT := \ --disable-static \ --enable-shared \ --enable-tools \ + --disable-manpages \ --disable-logging \ --disable-debug \ --disable-gtk-doc \ diff --git a/rules/host-liblzo.in b/rules/host-liblzo.in index 7dd75ef..3c58e72 100644 --- a/rules/host-liblzo.in +++ b/rules/host-liblzo.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_LIBLZO tristate diff --git a/rules/host-libpcre.in b/rules/host-libpcre.in index 4af3111..e50a5b0 100644 --- a/rules/host-libpcre.in +++ b/rules/host-libpcre.in @@ -1,4 +1,4 @@ -## SECTION=project_specific +## SECTION=hosttools_noprompt config HOST_LIBPCRE tristate diff --git a/rules/host-libuuid.in b/rules/host-libuuid.in index 83d43d7..3c6db41 100644 --- a/rules/host-libuuid.in +++ b/rules/host-libuuid.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_LIBUUID tristate diff --git a/rules/host-lzop.in b/rules/host-lzop.in index c2675b3..60d7b33 100644 --- a/rules/host-lzop.in +++ b/rules/host-lzop.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_LZOP tristate diff --git a/rules/host-mkelfImage.in b/rules/host-mkelfImage.in index 8ebc3d8..fad8a77 100644 --- a/rules/host-mkelfImage.in +++ b/rules/host-mkelfImage.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_MKELFIMAGE tristate diff --git a/rules/host-mkelfImage.make b/rules/host-mkelfImage.make index 5f9a377..60703c9 100644 --- a/rules/host-mkelfImage.make +++ b/rules/host-mkelfImage.make @@ -33,11 +33,6 @@ HOST_MKELFIMAGE_DIR := $(HOST_BUILDDIR)/$(HOST_MKELFIMAGE) # Prepare # ---------------------------------------------------------------------------- -# -# autoconf -# -HOST_MKELFIMAGE_AUTOCONF := $(HOST_AUTOCONF) - -HOST_MKELFIMAGE_MAKE_OPT := MY_CPPFLAGS="$(HOST_CPPFLAGS)" LDFLAGS="$(HOST_LDFLAGS)" +HOST_MKELFIMAGE_CONF_TOOL := autoconf # vim: syntax=make diff --git a/rules/host-mtd-utils.in b/rules/host-mtd-utils.in index 29a1b59..f5107c2 100644 --- a/rules/host-mtd-utils.in +++ b/rules/host-mtd-utils.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_MTD_UTILS tristate diff --git a/rules/host-mtools.in b/rules/host-mtools.in index 23fa567..55cce5a 100644 --- a/rules/host-mtools.in +++ b/rules/host-mtools.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_MTOOLS tristate diff --git a/rules/host-openssl.in b/rules/host-openssl.in index 33a3862..214b0a7 100644 --- a/rules/host-openssl.in +++ b/rules/host-openssl.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_OPENSSL tristate diff --git a/rules/host-qemu.in b/rules/host-qemu.in new file mode 100644 index 0000000..77bc492 --- /dev/null +++ b/rules/host-qemu.in @@ -0,0 +1,19 @@ +## SECTION=hosttools + +menuconfig HOST_QEMU + tristate + prompt "host-side qemu " + select HOST_GLIB + select HOST_ZLIB + +if HOST_QEMU + +config HOST_QEMU_SYS + bool + prompt "system emulation" + +config HOST_QEMU_USR + bool + prompt "user-space emulation" + +endif diff --git a/rules/host-qemu.make b/rules/host-qemu.make new file mode 100644 index 0000000..3b7d5f0 --- /dev/null +++ b/rules/host-qemu.make @@ -0,0 +1,93 @@ +# -*-makefile-*- +# +# Copyright (C) 2012 by Bernhard Walle +# (C) 2013 by Michael Olbrich +# (C) 2013 by Jan Luebbe +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +HOST_PACKAGES-$(PTXCONF_HOST_QEMU) += host-qemu + +# +# Paths and names +# +HOST_QEMU_VERSION := 1.5.0 +HOST_QEMU_MD5 := b6f3265b8ed39d77e8f354f35cc26e16 +HOST_QEMU := qemu-$(HOST_QEMU_VERSION) +HOST_QEMU_SUFFIX := tar.bz2 +HOST_QEMU_URL := http://wiki.qemu.org/download/$(HOST_QEMU).$(HOST_QEMU_SUFFIX) +HOST_QEMU_SOURCE := $(SRCDIR)/$(HOST_QEMU).$(HOST_QEMU_SUFFIX) +HOST_QEMU_DIR := $(HOST_BUILDDIR)/$(HOST_QEMU) + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# + +HOST_QEMU_TARGETS := $(call ptx/ifdef, PTXCONF_ARCH_X86,i386,$(PTXCONF_ARCH_STRING)) +HOST_QEMU_SYS_TARGETS := $(patsubst %,%-softmmu,$(HOST_QEMU_TARGETS)) +HOST_QEMU_USR_TARGETS := $(patsubst %,%-linux-user,$(HOST_QEMU_TARGETS)) + +HOST_QEMU_CONF_TOOL := autoconf +# 'net user' support: there is no --enable-slirp, so we have to leave out --disable-slirp +# firmware blobs: there is no --enable-blobs, so we have to leave out --disable-blobs +HOST_QEMU_CONF_OPT := \ + $(HOST_AUTOCONF) \ + --target-list=" \ + $(call ptx/ifdef, PTXCONF_HOST_QEMU_SYS,$(HOST_QEMU_SYS_TARGETS),) \ + $(call ptx/ifdef, PTXCONF_HOST_QEMU_USR,$(HOST_QEMU_USR_TARGETS),) \ + " \ + --disable-debug-tcg \ + --disable-debug-info \ + --disable-sparse \ + --disable-werror \ + --disable-sdl \ + --disable-gtk \ + --disable-vnc \ + --disable-cocoa \ + --audio-drv-list= \ + --disable-xen \ + --disable-brlapi \ + --disable-curses \ + --disable-curl \ + --disable-fdt \ + --disable-bluez \ + --disable-kvm \ + --disable-tcg-interpreter \ + --enable-nptl \ + --$(call ptx/endis, PTXCONF_HOST_QEMU_SYS)-system \ + --disable-user \ + --$(call ptx/endis, PTXCONF_HOST_QEMU_USR)-linux-user \ + --disable-bsd-user \ + --enable-guest-base \ + --disable-uuid \ + --disable-linux-aio \ + --disable-cap-ng \ + --disable-attr \ + --disable-docs \ + --disable-vhost-net \ + --disable-spice \ + --disable-glx \ + --disable-rbd \ + --disable-libiscsi \ + --disable-smartcard-nss \ + --disable-libusb \ + --disable-usb-redir \ + --disable-guest-agent \ + --disable-seccomp \ + --disable-glusterfs \ + --disable-libssh2 \ + --disable-virtio-blk-data-plane \ + --disable-tools + +# vim: syntax=make diff --git a/rules/host-squashfs-tools.in b/rules/host-squashfs-tools.in index d16909e..239148c 100644 --- a/rules/host-squashfs-tools.in +++ b/rules/host-squashfs-tools.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_SQUASHFS_TOOLS tristate diff --git a/rules/host-system-jdk.in b/rules/host-system-jdk.in new file mode 100644 index 0000000..9e1c2b5 --- /dev/null +++ b/rules/host-system-jdk.in @@ -0,0 +1,12 @@ +## SECTION=hosttools_noprompt + +config HOST_SYSTEM_JDK + tristate + +if HOST_SYSTEM_JDK + +config HOST_SYSTEM_JDK_ANT + bool + +endif + diff --git a/rules/host-system-jdk.make b/rules/host-system-jdk.make new file mode 100644 index 0000000..2e31adc --- /dev/null +++ b/rules/host-system-jdk.make @@ -0,0 +1,38 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_HOST_SYSTEM_JDK) += host-system-jdk + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +$(STATEDIR)/host-system-jdk.prepare: + @$(call targetinfo) + @echo "Checking Java SDK ..." + @test "$(PTXCONF_SETUP_JAVA_SDK)" != "/usr" || \ + ptxd_bailout "SETUP_JAVA_SDK must not be '/usr'. \ + Please run 'ptxdist setup' to change this." + @echo "Checking for javac ..." + @test -x $(PTXCONF_SETUP_JAVA_SDK)/bin/javac || \ + ptxd_bailout "'$(PTXCONF_SETUP_JAVA_SDK)' is not a valid Java SDK. \ + Please run 'ptxdist setup' to change this." +ifdef PTXCONF_HOST_SYSTEM_JDK_ANT + @echo "Checking for ant ..." + @ant -h >/dev/null 2>&1 || \ + ptxd_bailout "'ant' not found! Please install."; +endif + @echo + @$(call touch) + +# vim: syntax=make diff --git a/rules/host-system-perl.in b/rules/host-system-perl.in new file mode 100644 index 0000000..fc487ce --- /dev/null +++ b/rules/host-system-perl.in @@ -0,0 +1,12 @@ +## SECTION=hosttools_noprompt + +config HOST_SYSTEM_PERL + tristate + +if HOST_SYSTEM_PERL + +config HOST_SYSTEM_PERL_XMLPARSER + bool + +endif + diff --git a/rules/host-system-perl.make b/rules/host-system-perl.make new file mode 100644 index 0000000..8a7b33c --- /dev/null +++ b/rules/host-system-perl.make @@ -0,0 +1,34 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_HOST_SYSTEM_PERL) += host-system-perl + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +$(STATEDIR)/host-system-perl.prepare: + @$(call targetinfo) + @echo "Checking for Perl ..." + @perl -v >/dev/null 2>&1 || \ + ptxd_bailout "'perl' not found! Please install."; +ifdef PTXCONF_HOST_SYSTEM_PERL_XMLPARSER + @echo "Checking for Perl: XML::Parser" + @perl -e "require XML::Parser" 2>/dev/null || \ + ptxd_bailout "XML::Parser perl module is required. \ + Please install libxml-parser-perl (debian)." +endif + @echo + @$(call touch) + +# vim: syntax=make diff --git a/rules/host-system-python.in b/rules/host-system-python.in new file mode 100644 index 0000000..c8c5028 --- /dev/null +++ b/rules/host-system-python.in @@ -0,0 +1,11 @@ +## SECTION=hosttools_noprompt + +config HOST_SYSTEM_PYTHON + tristate + +if HOST_SYSTEM_PYTHON + +config HOST_SYSTEM_PYTHON_XML2 + bool + +endif diff --git a/rules/host-system-python.make b/rules/host-system-python.make new file mode 100644 index 0000000..9ada60c --- /dev/null +++ b/rules/host-system-python.make @@ -0,0 +1,34 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_HOST_SYSTEM_PYTHON) += host-system-python + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +$(STATEDIR)/host-system-python.prepare: + @$(call targetinfo) + @echo "Checking for Python ..." + @python -V >/dev/null 2>&1 || \ + ptxd_bailout "'python' not found! Please install."; +ifdef PTXCONF_HOST_SYSTEM_PYTHON_XML2 + @echo "Checking for Python libxml2 bindings ..." + @python -c 'import libxml2' 2>/dev/null || \ + ptxd_bailout "Python libxml2 module not found! \ + Please install python-libxml2 (debian)"; +endif + @echo + @$(call touch) + +# vim: syntax=make diff --git a/rules/host-system-ruby.in b/rules/host-system-ruby.in new file mode 100644 index 0000000..2cecbe1 --- /dev/null +++ b/rules/host-system-ruby.in @@ -0,0 +1,4 @@ +## SECTION=hosttools_noprompt + +config HOST_SYSTEM_RUBY + tristate diff --git a/rules/host-system-ruby.make b/rules/host-system-ruby.make new file mode 100644 index 0000000..9f535d6 --- /dev/null +++ b/rules/host-system-ruby.make @@ -0,0 +1,28 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_HOST_SYSTEM_RUBY) += host-system-ruby + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +$(STATEDIR)/host-system-ruby.prepare: + @$(call targetinfo) + @echo "Checking for Ruby ..." + @ruby --version >/dev/null 2>&1 || \ + ptxd_bailout "'ruby' not found! Please install."; + @echo + @$(call touch) + +# vim: syntax=make diff --git a/rules/host-systemd.in b/rules/host-systemd.in new file mode 100644 index 0000000..c8f58dc --- /dev/null +++ b/rules/host-systemd.in @@ -0,0 +1,8 @@ +## SECTION=hosttools_noprompt + +config HOST_SYSTEMD + bool + select HOST_INTLTOOL + select HOST_GPERF + select HOST_DBUS + select HOST_LIBCAP diff --git a/rules/host-systemd.make b/rules/host-systemd.make new file mode 100644 index 0000000..d72973b --- /dev/null +++ b/rules/host-systemd.make @@ -0,0 +1,74 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +HOST_PACKAGES-$(PTXCONF_HOST_SYSTEMD) += host-systemd + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +HOST_SYSTEMD_CONF_TOOL := autoconf +HOST_SYSTEMD_CONF_OPT := \ + $(HOST_AUTOCONF) \ + --enable-largefile \ + --enable-silent-rules \ + --disable-static \ + --disable-nls \ + --disable-gtk-doc \ + --disable-gtk-doc-html \ + --disable-gtk-doc-pdf \ + --disable-introspection \ + --disable-kmod \ + --disable-blkid \ + --disable-ima \ + --disable-chkconfig \ + --disable-selinux \ + --disable-xz \ + --disable-tcpwrap \ + --disable-pam \ + --disable-acl \ + --disable-xattr \ + --disable-gcrypt \ + --disable-audit \ + --disable-libcryptsetup \ + --disable-qrencode \ + --disable-microhttpd \ + --disable-binfmt \ + --disable-vconsole \ + --disable-readahead \ + --disable-bootchart \ + --disable-quotacheck \ + --disable-randomseed \ + --disable-logind \ + --disable-hostnamed \ + --disable-timedated \ + --disable-localed \ + --disable-coredump \ + --disable-polkit \ + --disable-efi \ + --disable-myhostname \ + --disable-gudev \ + --disable-keymap \ + --disable-manpages \ + --enable-split-usr \ + --disable-tests \ + --with-sysvinit-path="" \ + --with-sysvrcnd-path="" \ + --without-python \ + --with-rootprefix= \ + --with-rootlibdir=/lib + +# vim: syntax=make diff --git a/rules/host-u-boot-tools.in b/rules/host-u-boot-tools.in index c89c04d..cb2bdf6 100644 --- a/rules/host-u-boot-tools.in +++ b/rules/host-u-boot-tools.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_U_BOOT_TOOLS tristate diff --git a/rules/host-util-linux-ng.in b/rules/host-util-linux-ng.in index 51b2432..edf29b3 100644 --- a/rules/host-util-linux-ng.in +++ b/rules/host-util-linux-ng.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_UTIL_LINUX_NG tristate diff --git a/rules/host-util-linux-ng.make b/rules/host-util-linux-ng.make index d578c5a..9398642 100644 --- a/rules/host-util-linux-ng.make +++ b/rules/host-util-linux-ng.make @@ -28,34 +28,56 @@ HOST_UTIL_LINUX_NG_DIR = $(HOST_BUILDDIR)/$(UTIL_LINUX_NG) HOST_UTIL_LINUX_NG_AUTOCONF := \ $(HOST_AUTOCONF) \ - --disable-nls \ - --disable-use-tty-group \ - --disable-makeinstall-chown \ --disable-gtk-doc \ + --disable-nls \ + --disable-most-builds \ + --enable-libuuid \ + --enable-libblkid \ + --disable-libmount \ + --disable-deprecated-mount \ --disable-mount \ + --disable-losetup \ --disable-fsck \ + --disable-partx \ --disable-uuidd \ - --disable-nls \ + --disable-mountpoint \ + --disable-fallocate \ + --disable-unshare \ + --disable-arch \ + --disable-ddate \ + --disable-eject \ --disable-agetty \ --disable-cramfs \ + --disable-wdctl \ --disable-switch_root \ --disable-pivot_root \ - --disable-fallocate \ - --disable-unshare \ - --disable-init \ + --disable-elvtune \ --disable-kill \ --disable-last \ + --disable-utmpdump \ + --disable-line \ --disable-mesg \ - --disable-partx \ --disable-raw \ --disable-rename \ --disable-reset \ - --disable-login-utils \ + --disable-vipw \ + --disable-newgrp \ + --disable-chfn-chsh \ + --disable-chsh-only-listed \ + --disable-login \ + --disable-login-chown-vcs \ + --disable-login-stat-mail \ + --disable-sulogin \ + --disable-su \ --disable-schedutils \ --disable-wall \ --disable-write \ - --enable-libuuid \ - --enable-libblkid \ - --enable-libmount + --disable-chkdupexe \ + --disable-socket-activation \ + --disable-pg-bell \ + --enable-require-password \ + --disable-use-tty-group \ + --disable-makeinstall-chown \ + --disable-makeinstall-setuid # vim: syntax=make diff --git a/rules/host-wayland.in b/rules/host-wayland.in new file mode 100644 index 0000000..b741e1a --- /dev/null +++ b/rules/host-wayland.in @@ -0,0 +1,6 @@ +## SECTION=hosttools_noprompt + +config HOST_WAYLAND + tristate + select HOST_EXPAT + select HOST_LIBFFI diff --git a/rules/host-wayland.make b/rules/host-wayland.make new file mode 100644 index 0000000..535e820 --- /dev/null +++ b/rules/host-wayland.make @@ -0,0 +1,30 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Philipp Zabel +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +HOST_PACKAGES-$(PTXCONF_HOST_WAYLAND) += host-wayland + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +HOST_WAYLAND_CONF_TOOL := autoconf +HOST_WAYLAND_CONF_OPT := \ + $(HOST_AUTOCONF) \ + --disable-static \ + --enable-scanner \ + --disable-documentation + +# vim: syntax=make diff --git a/rules/host-xl-tools.in b/rules/host-xl-tools.in index 566b37f..2e1a147 100644 --- a/rules/host-xl-tools.in +++ b/rules/host-xl-tools.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_XL_TOOLS tristate diff --git a/rules/host-xz.in b/rules/host-xz.in index 7246a92..e5594c8 100644 --- a/rules/host-xz.in +++ b/rules/host-xz.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_XZ tristate diff --git a/rules/host-zlib.in b/rules/host-zlib.in index 591f95b..4bb6174 100644 --- a/rules/host-zlib.in +++ b/rules/host-zlib.in @@ -1,4 +1,5 @@ ## SECTION=hosttools_noprompt +## SECTION=hosttools_platform config HOST_ZLIB tristate diff --git a/rules/ima-evm-utils.in b/rules/ima-evm-utils.in new file mode 100644 index 0000000..8e7b8d6 --- /dev/null +++ b/rules/ima-evm-utils.in @@ -0,0 +1,11 @@ +## SECTION=selinux + +config IMA_EVM_UTILS + tristate + select ATTR + select KEYUTILS + select OPENSSL + prompt "ima-evm-utils" + help + Integrity Measurement Architecture to know + EXACTLY what has been run on your machine. diff --git a/rules/ima-evm-utils.make b/rules/ima-evm-utils.make new file mode 100644 index 0000000..cb3c867 --- /dev/null +++ b/rules/ima-evm-utils.make @@ -0,0 +1,50 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Grzeschik +# + +PACKAGES-$(PTXCONF_IMA_EVM_UTILS) += ima-evm-utils + +# +# Paths and names +# +IMA_EVM_UTILS_VERSION := 0.2 +IMA_EVM_UTILS_MD5 := 3d31ff2bbd42690b6825068447b15dfd +IMA_EVM_UTILS := ima-evm-utils-$(IMA_EVM_UTILS_VERSION) +IMA_EVM_UTILS_SUFFIX := tar.gz +IMA_EVM_UTILS_URL := $(call ptx/mirror, SF, linux-ima/$(IMA_EVM_UTILS).$(IMA_EVM_UTILS_SUFFIX)) +IMA_EVM_UTILS_SOURCE := $(SRCDIR)/$(IMA_EVM_UTILS).$(IMA_EVM_UTILS_SUFFIX) +IMA_EVM_UTILS_DIR := $(BUILDDIR)/$(IMA_EVM_UTILS) +IMA_EVM_UTILS_LICENSE := LGPLv2+ + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +IMA_EVM_UTILS_CONF_TOOL := autoconf +IMA_EVM_UTILS_AUTOCONF := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static \ + --disable-debug + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/ima-evm-utils.targetinstall: + @$(call targetinfo) + + @$(call install_init, ima-evm-utils) + @$(call install_fixup, ima-evm-utils,PRIORITY,optional) + @$(call install_fixup, ima-evm-utils,SECTION,base) + @$(call install_fixup, ima-evm-utils,AUTHOR,"Michael Grzeschik ") + @$(call install_fixup, ima-evm-utils,DESCRIPTION,missing) + + @$(call install_copy, ima-evm-utils, 0, 0, 0755, -, /usr/bin/evmctl) + @$(call install_tree, ima-evm-utils, 0, 0, -, /usr/lib/ima-evm-utils/) + + @$(call install_finish, ima-evm-utils) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/inetutils.in b/rules/inetutils.in index fa79dfd..876c298 100644 --- a/rules/inetutils.in +++ b/rules/inetutils.in @@ -54,6 +54,17 @@ config INETUTILS_PING comment "BusyBox' ping is selected!" depends on BUSYBOX_PING +config INETUTILS_PING6 + bool + depends on !BUSYBOX_PING6 && GLOBAL_IPV6 || ALLYES + prompt "ping6" + help + Ping is a small tool to check if another host is alive in the network. + This version of ping is for ipv6 networks. + +comment "BusyBox' ping6 is selected!" + depends on BUSYBOX_PING6 + # ----- config INETUTILS_RCP @@ -83,6 +94,7 @@ config INETUTILS_RSHD bool prompt "rshd" select INETUTILS_INETD + depends on !BUSYBOX_INETD || ALLYES help Rshd is the server for the program. The server provides remote execution facilities with authentication based on privileged diff --git a/rules/inetutils.make b/rules/inetutils.make index 92f5c1a..8fcc1ce 100644 --- a/rules/inetutils.make +++ b/rules/inetutils.make @@ -55,6 +55,7 @@ INETUTILS_AUTOCONF := $(CROSS_AUTOCONF_USR) \ --disable-ifconfig \ --$(call ptx/endis, PTXCONF_INETUTILS_INETD)-inetd \ --$(call ptx/endis, PTXCONF_INETUTILS_PING)-ping \ + --$(call ptx/endis, PTXCONF_INETUTILS_PING6)-ping6 \ --$(call ptx/endis, PTXCONF_INETUTILS_RCP)-rcp \ --$(call ptx/endis, PTXCONF_INETUTILS_RLOGIND)-rlogind \ --$(call ptx/endis, PTXCONF_INETUTILS_RSH)-rsh \ @@ -91,6 +92,10 @@ ifdef PTXCONF_INETUTILS_PING @$(call install_copy, inetutils, 0, 0, 0755, \ $(INETUTILS_PKGDIR)/usr/bin/ping, /bin/ping) endif +ifdef PTXCONF_INETUTILS_PING6 + @$(call install_copy, inetutils, 0, 0, 0755, \ + $(INETUTILS_PKGDIR)/usr/bin/ping6, /bin/ping6) +endif ifdef PTXCONF_INETUTILS_RCP @$(call install_copy, inetutils, 0, 0, 0755, -, /usr/bin/rcp) endif diff --git a/rules/ipkg.in b/rules/ipkg.in index 1f93af3..fc35ee9 100644 --- a/rules/ipkg.in +++ b/rules/ipkg.in @@ -3,7 +3,8 @@ menuconfig IPKG tristate prompt "ipkg " # ipkg calls wget with long options! - select BUSYBOX_FEATURE_WGET_LONG_OPTIONS if BUSYBOX_WGET + select BUSYBOX_LONG_OPTS if BUSYBOX_WGET + select BUSYBOX_FEATURE_WGET_LONG_OPTIONS if BUSYBOX_WGET help IPKG is a small packet mechanism for embedded systems to maintain the applications on the system. diff --git a/rules/iproute2.in b/rules/iproute2.in index 08589ab..5c71127 100644 --- a/rules/iproute2.in +++ b/rules/iproute2.in @@ -29,6 +29,12 @@ config IPROUTE2_ARPD Enabling this extry will enlarge your system by the berkely DB4.x library. +config IPROUTE2_BRIDGE + bool + prompt "bridge" + help + Show / manipulate bridge addresses and devices + config IPROUTE2_CTSTAT bool prompt "ctstat" diff --git a/rules/iproute2.make b/rules/iproute2.make index b9c0080..f8a618b 100644 --- a/rules/iproute2.make +++ b/rules/iproute2.make @@ -17,12 +17,11 @@ PACKAGES-$(PTXCONF_IPROUTE2) += iproute2 # # Paths and names # -IPROUTE2_VERSION := 2.6.39 -IPROUTE2_MD5 := 8a3b6bc77c2ecf752284aa4a6fc630a6 +IPROUTE2_VERSION := 3.9.0 +IPROUTE2_MD5 := fd9db28e4f411a1e74de65c919ae590f IPROUTE2 := iproute2-$(IPROUTE2_VERSION) -IPROUTE2_SUFFIX := tar.gz -IPROUTE2_URL := \ - http://www.linuxgrill.com/anonymous/iproute2/NEW-OSDL/$(IPROUTE2).$(IPROUTE2_SUFFIX) +IPROUTE2_SUFFIX := tar.xz +IPROUTE2_URL := $(call ptx/mirror, KERNEL, utils/net/iproute2/$(IPROUTE2).$(IPROUTE2_SUFFIX)) IPROUTE2_SOURCE := $(SRCDIR)/$(IPROUTE2).$(IPROUTE2_SUFFIX) IPROUTE2_DIR := $(BUILDDIR)/$(IPROUTE2) IPROUTE2_LICENSE := GPLv2 @@ -31,28 +30,30 @@ IPROUTE2_LICENSE := GPLv2 # Prepare # ---------------------------------------------------------------------------- -IPROUTE2_PATH := PATH=$(CROSS_PATH) -IPROUTE2_ENV := $(CROSS_ENV) -IPROUTE2_MAKEVARS := \ - CC=$(PTXCONF_GNU_TARGET)-gcc \ - CROSS_CPPFLAGS='$(CROSS_CPPFLAGS) -g' \ - LDFLAGS='$(CROSS_LDFLAGS) -g -rdynamic' \ - DBM_INCLUDE=$(SYSROOT)/usr/include - $(STATEDIR)/iproute2.prepare: @$(call targetinfo) - @touch $(IPROUTE2_DIR)/Config + @$(call world/prepare, IPROUTE2) +# overwrite options we don't want, or may be misdetected + @echo 'TC_CONFIG_ATM:=n' >> $(IPROUTE2_DIR)/Config + @echo 'TC_CONFIG_XT:=n' >> $(IPROUTE2_DIR)/Config + @echo 'IPT_LIB_DIR:=/usr/lib' >> $(IPROUTE2_DIR)/Config ifdef PTXCONF_IPROUTE2_ARPD @echo BUILD_ARPD=y >> $(IPROUTE2_DIR)/Config endif @$(call touch) +IPROUTE2_MAKE_OPT := \ + ROOTDIR=$(SYSROOT) \ + LDFLAGS='-rdynamic' \ + WFLAGS="-Wall" + # ---------------------------------------------------------------------------- # Target-Install # ---------------------------------------------------------------------------- IPROUTE2_INSTALL_FILES-y = IPROUTE2_INSTALL_FILES-$(PTXCONF_IPROUTE2_ARPD) += /sbin/arpd +IPROUTE2_INSTALL_FILES-$(PTXCONF_IPROUTE2_BRIDGE) += /sbin/bridge IPROUTE2_INSTALL_FILES-$(PTXCONF_IPROUTE2_CTSTAT) += /sbin/ctstat IPROUTE2_INSTALL_FILES-$(PTXCONF_IPROUTE2_GENL) += /sbin/genl IPROUTE2_INSTALL_FILES-$(PTXCONF_IPROUTE2_IP) += /sbin/ip diff --git a/rules/iptables.in b/rules/iptables.in index 1d23a49..e6f3699 100644 --- a/rules/iptables.in +++ b/rules/iptables.in @@ -41,7 +41,7 @@ config IPTABLES_INSTALL_TOOLS IPv6: ip6tables, ip6tables-save, ip6tables-restore comment "iptables-apply depends on bash" - depends on !BASH + depends on BASH = n config IPTABLES_INSTALL_IPTABLES_APPLY bool diff --git a/rules/json-c.make b/rules/json-c.make index 794826a..9e354b2 100644 --- a/rules/json-c.make +++ b/rules/json-c.make @@ -16,11 +16,11 @@ PACKAGES-$(PTXCONF_JSON_C) += json-c # # Paths and names # -JSON_C_VERSION := 0.9 -JSON_C_MD5 := 3a13d264528dcbaf3931b0cede24abae +JSON_C_VERSION := 0.10 +JSON_C_MD5 := a4edc79410eb894f08d7d52ca9f88732 JSON_C := json-c-$(JSON_C_VERSION) JSON_C_SUFFIX := tar.gz -JSON_C_URL := http://oss.metaparadigm.com/json-c/$(JSON_C).$(JSON_C_SUFFIX) +JSON_C_URL := https://s3.amazonaws.com/json-c_releases/releases/$(JSON_C).$(JSON_C_SUFFIX) JSON_C_SOURCE := $(SRCDIR)/$(JSON_C).$(JSON_C_SUFFIX) JSON_C_DIR := $(BUILDDIR)/$(JSON_C) JSON_C_LICENSE := MIT @@ -56,4 +56,4 @@ $(STATEDIR)/json-c.targetinstall: @$(call touch) -# vim: syntax=make +# vim: ft=make noet diff --git a/rules/jvisu.in b/rules/jvisu.in index 29ffa13..c8dc5a5 100644 --- a/rules/jvisu.in +++ b/rules/jvisu.in @@ -1,6 +1,8 @@ ## SECTION=web menuconfig JVISU tristate + select HOST_SYSTEM_JDK + select HOST_SYSTEM_JDK_ANT prompt "JVisu " help JVISU - A java applet based visualisation suite diff --git a/rules/jvisu.make b/rules/jvisu.make index c18a51c..9931882 100644 --- a/rules/jvisu.make +++ b/rules/jvisu.make @@ -13,19 +13,6 @@ # PACKAGES-$(PTXCONF_JVISU) += jvisu -ifdef PTXCONF_JVISU -ifeq ($(shell which ant 2>/dev/null),) - $(warning *** ant is mandatory to build JVisu) - $(warning *** please install ant) - $(error ) -endif -ifeq ($(shell test -x $(PTXCONF_SETUP_JAVA_SDK)/bin/java || echo no),no) - $(warning *** java is mandatory to build JVisu) - $(warning *** please run 'ptxdist setup' and set the path to the java sdk) - $(error ) -endif -endif - # # Paths and names # diff --git a/rules/kernel-header.in b/rules/kernel-header.in index 2ddacb3..8db63d5 100644 --- a/rules/kernel-header.in +++ b/rules/kernel-header.in @@ -3,6 +3,7 @@ menuconfig KERNEL_HEADER tristate select BASE + select HOST_SYSTEM_PERL prompt "Linux kernel headers " help Kernel headers used to build tools that need newer kernel @@ -13,12 +14,12 @@ if KERNEL_HEADER config KERNEL_HEADER_VERSION prompt "kernel version" string - default "2.6.39" + default "${PTXCONF_KERNEL_VERSION}" config KERNEL_HEADER_MD5 prompt "kernel source md5sum" string - default "1aab7a741abe08d42e8eccf20de61e05" + default "${PTXCONF_KERNEL_MD5}" endif diff --git a/rules/kernel-header.make b/rules/kernel-header.make index 819a5e8..ce4b432 100644 --- a/rules/kernel-header.make +++ b/rules/kernel-header.make @@ -33,6 +33,7 @@ KERNEL_HEADER_CONF_ENV := $(CROSS_ENV) KERNEL_HEADER_PATH := PATH=$(CROSS_PATH) KERNEL_HEADER_CONF_TOOL := NO KERNEL_HEADER_MAKE_OPT := \ + V=$(PTXDIST_VERBOSE) \ HOSTCC=$(HOSTCC) \ ARCH=$(GENERIC_KERNEL_ARCH) \ CROSS_COMPILE=$(PTXCONF_COMPILER_PREFIX) diff --git a/rules/kernel.make b/rules/kernel.make index ed9d120..514478f 100644 --- a/rules/kernel.make +++ b/rules/kernel.make @@ -53,13 +53,11 @@ KERNEL_WRAPPER_BLACKLIST := \ KERNEL_PATH := PATH=$(CROSS_PATH) KERNEL_ENV := \ KCONFIG_NOTIMESTAMP=1 \ - HOST_EXTRACFLAGS="$(HOST_CPPFLAGS)" \ pkg_wrapper_blacklist="$(KERNEL_WRAPPER_BLACKLIST)" KERNEL_MAKEVARS := \ $(PARALLELMFLAGS) \ V=$(PTXDIST_VERBOSE) \ - HOSTCC=$(HOSTCC) \ ARCH=$(PTXCONF_KERNEL_ARCH_STRING) \ CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) \ INSTALL_MOD_PATH=$(KERNEL_PKGDIR) \ diff --git a/rules/kexec-tools.make b/rules/kexec-tools.make index 3ceedc9..e0b49bd 100644 --- a/rules/kexec-tools.make +++ b/rules/kexec-tools.make @@ -17,8 +17,8 @@ PACKAGES-$(PTXCONF_KEXEC_TOOLS) += kexec-tools # # Paths and names # -KEXEC_TOOLS_VERSION := 2.0.3 -KEXEC_TOOLS_MD5 := b3ced2097ce3981abba38ceedc84f939 +KEXEC_TOOLS_VERSION := 2.0.4 +KEXEC_TOOLS_MD5 := 05992bc8c0673fc55be7b6d27e48a8db KEXEC_TOOLS := kexec-tools-$(KEXEC_TOOLS_VERSION) KEXEC_TOOLS_SUFFIX := tar.bz2 KEXEC_TOOLS_URL := $(call ptx/mirror, KERNEL, utils/kernel/kexec/$(KEXEC_TOOLS).$(KEXEC_TOOLS_SUFFIX)) diff --git a/rules/keyutils.in b/rules/keyutils.in new file mode 100644 index 0000000..9866f07 --- /dev/null +++ b/rules/keyutils.in @@ -0,0 +1,8 @@ +## SECTION=selinux + +config KEYUTILS + tristate + prompt "keyutils" + help + Tools to control the key management system + build into the Linux kernel. diff --git a/rules/keyutils.make b/rules/keyutils.make new file mode 100644 index 0000000..c517eb5 --- /dev/null +++ b/rules/keyutils.make @@ -0,0 +1,59 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Grzeschik +# + +PACKAGES-$(PTXCONF_KEYUTILS) += keyutils + +# +# Paths and names +# +KEYUTILS_VERSION := 1.5.5 +KEYUTILS_MD5 := d759680b2f23c99af95938f5026f25fb +KEYUTILS := keyutils-$(KEYUTILS_VERSION) +KEYUTILS_SUFFIX := tar.bz2 +KEYUTILS_URL := http://people.redhat.com/~dhowells/keyutils/$(KEYUTILS).$(KEYUTILS_SUFFIX) +KEYUTILS_SOURCE := $(SRCDIR)/$(KEYUTILS).$(KEYUTILS_SUFFIX) +KEYUTILS_DIR := $(BUILDDIR)/$(KEYUTILS) +KEYUTILS_LICENSE := GPLv2+, LGPLv2.1+ + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +KEYUTILS_CONF_TOOL := NO +KEYUTILS_MAKE_OPT := \ + $(CROSS_ENV_CC) \ + BUILDFOR="" + +KEYUTILS_INSTALL_OPT := \ + $(KEYUTILS_MAKE_OPT) \ + LIBDIR=/lib \ + USRLIBDIR=/usr/lib \ + install + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/keyutils.targetinstall: + @$(call targetinfo) + + @$(call install_init, keyutils) + @$(call install_fixup, keyutils,PRIORITY,optional) + @$(call install_fixup, keyutils,SECTION,base) + @$(call install_fixup, keyutils,AUTHOR,"Michael Grzeschik ") + @$(call install_fixup, keyutils,DESCRIPTION,missing) + + @$(call install_lib, keyutils, 0, 0, 0644, libkeyutils) + + @$(call install_alternative, keyutils, 0, 0, 0644, /etc/request-key.conf) + @$(call install_copy, keyutils, 0, 0, 0755, -, /sbin/key.dns_resolver) + @$(call install_copy, keyutils, 0, 0, 0755, -, /sbin/request-key) + @$(call install_copy, keyutils, 0, 0, 0755, -, /bin/keyctl) + + @$(call install_finish, keyutils) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/lame.make b/rules/lame.make index a4e2a1a..402eede 100644 --- a/rules/lame.make +++ b/rules/lame.make @@ -47,7 +47,7 @@ LAME_CONF_OPT := \ --$(call ptx/endis, PTXCONF_LAME_FRONTEND)-frontend \ --disable-mp3x \ --enable-mp3rtp \ - --enable-expopt=full \ + --enable-expopt \ --disable-debug \ --without-dmalloc @@ -65,6 +65,9 @@ $(STATEDIR)/lame.targetinstall: @$(call install_fixup, lame,DESCRIPTION,missing) @$(call install_lib, lame, 0, 0, 0644, libmp3lame) +ifdef PTXCONF_LAME_FRONTEND + @$(call install_copy, lame, 0, 0, 0755, -, /usr/bin/lame) +endif @$(call install_finish, lame) diff --git a/rules/libezv24.make b/rules/libezv24.make index 19786b0..a31749e 100644 --- a/rules/libezv24.make +++ b/rules/libezv24.make @@ -29,7 +29,11 @@ LIBEZV24_DIR := $(BUILDDIR)/$(LIBEZV24) # Prepare # ---------------------------------------------------------------------------- -LIBEZV24_CONF_TOOL := autoconf +LIBEZV24_CONF_TOOL := autoconf +LIBEZV24_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static \ + --disable-debug # ---------------------------------------------------------------------------- # Target-Install diff --git a/rules/libffi.make b/rules/libffi.make index 13ea6fb..2024dbd 100644 --- a/rules/libffi.make +++ b/rules/libffi.make @@ -17,8 +17,8 @@ PACKAGES-$(PTXCONF_LIBFFI) += libffi # # Paths and names # -LIBFFI_VERSION := 3.0.11 -LIBFFI_MD5 := f69b9693227d976835b4857b1ba7d0e3 +LIBFFI_VERSION := 3.0.13 +LIBFFI_MD5 := 45f3b6dbc9ee7c7dfbbbc5feba571529 LIBFFI := libffi-$(LIBFFI_VERSION) LIBFFI_SUFFIX := tar.gz LIBFFI_SOURCE := $(SRCDIR)/$(LIBFFI).$(LIBFFI_SUFFIX) @@ -31,17 +31,21 @@ LIBFFI_LICENSE := MIT # ---------------------------------------------------------------------------- # Prepare # ---------------------------------------------------------------------------- +LIBFFI_CONF_ENV := \ + $(CROSS_ENV) \ + CROSS_PREFIX=$(PTXCONF_COMPILER_PREFIX) LIBFFI_CONF_TOOL := autoconf - -# ---------------------------------------------------------------------------- -# Install -# ---------------------------------------------------------------------------- - -$(STATEDIR)/libffi.install: - @$(call targetinfo) - @$(call install, LIBFFI) - @$(call touch) +LIBFFI_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static \ + --enable-portable-binary \ + --disable-pax_emutramp \ + --disable-debug \ + --enable-structs \ + --enable-raw-api \ + --disable-purify-safety \ + --without-gcc-arch # ---------------------------------------------------------------------------- # Target-Install diff --git a/rules/libftdi1.in b/rules/libftdi1.in new file mode 100644 index 0000000..d0b34ab --- /dev/null +++ b/rules/libftdi1.in @@ -0,0 +1,43 @@ +## SECTION=system_libraries + +menuconfig LIBFTDI1 + tristate + prompt "libftdi1 " + select HOST_CMAKE + select GCCLIBS_GCC_S if LIBFTDI1_CPP_WRAPPER + select LIBUSB + select BOOST if LIBFTDI1_CPP_WRAPPER + select LIBCONFUSE if LIBFTDI1_FTDI_EEPROM + help + libFTDI is an open source library to talk to FTDI chips: + FT232BM, FT245BM, FT2232C, FT2232D, FT245R and FT232H + including the popular bitbang mode. + + libftdi1 is the successor of libftdi based on libusb1 + +if LIBFTDI1 + +config LIBFTDI1_EXAMPLES + bool + prompt "build and install examples" + help + Build and install example programes. + Will be installed to /usr/bin/libftdi1/ + +config LIBFTDI1_FTDI_EEPROM + bool + prompt "build and install ftdi_eeprom" + help + Advanced tool to read and write ftdi eeprom. + Simpler tools are available when installing examples. + Will be installed to /usr/bin/ + + Needs library confuse + +config LIBFTDI1_CPP_WRAPPER + bool + prompt "enable C++ wrapper" + help + Needs library boost + +endif diff --git a/rules/libftdi1.make b/rules/libftdi1.make new file mode 100644 index 0000000..6b099db --- /dev/null +++ b/rules/libftdi1.make @@ -0,0 +1,82 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Andreas Helmcke +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_LIBFTDI1) += libftdi1 + +# +# Paths and names +# +LIBFTDI1_VERSION := 1.0 +LIBFTDI1_MD5 := e02dd77ee10b82b5edfbb8c199185bbf +LIBFTDI1 := libftdi1-$(LIBFTDI1_VERSION) +LIBFTDI1_SUFFIX := tar.bz2 +LIBFTDI1_URL := http://www.intra2net.com/en/developer/libftdi/download/$(LIBFTDI1).$(LIBFTDI1_SUFFIX) +LIBFTDI1_SOURCE := $(SRCDIR)/$(LIBFTDI1).$(LIBFTDI1_SUFFIX) +LIBFTDI1_DIR := $(BUILDDIR)/$(LIBFTDI1) +LIBFTDI1_LICENSE := LGPLv2.1 + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# cmake +# +LIBFTDI1_CONF_TOOL := cmake +LIBFTDI1_CONF_OPT := \ + $(CROSS_CMAKE_USR) \ + -DCMAKE_SKIP_RPATH=ON \ + -DDOCUMENTATION=OFF \ + -DPYTHON_BINDINGS=OFF \ + -DEXAMPLES=$(call ptx/ifdef,PTXCONF_LIBFTDI1_EXAMPLES,ON,OFF) \ + -DFTDIPP=$(call ptx/ifdef,PTXCONF_LIBFTDI1_CPP_WRAPPER,ON,OFF) \ + -DFTDI_EEPROM=$(call ptx/ifdef,PTXCONF_LIBFTDI1_FTDI_EEPROM,ON,OFF) + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/libftdi1.targetinstall: + @$(call targetinfo) + + @$(call install_init, libftdi1) + @$(call install_fixup, libftdi1, PRIORITY, optional) + @$(call install_fixup, libftdi1, SECTION, base) + @$(call install_fixup, libftdi1, AUTHOR, "Andreas Helmcke ") + @$(call install_fixup, libftdi1, DESCRIPTION, missing) + +ifdef PTXCONF_LIBFTDI1_EXAMPLES + @cd $(LIBFTDI1_DIR)-build/examples && \ + for i in `find . -maxdepth 1 -type f -executable -printf "%f\n"`; do \ + $(call install_copy, libftdi1, 0, 0, 0755, \ + $(LIBFTDI1_DIR)-build/examples/$$i, \ + /usr/bin/libftdi1/$$i); \ + done + +endif + +ifdef PTXCONF_LIBFTDI1_FTDI_EEPROM + @$(call install_copy, libftdi1, 0, 0, 0755, -, /usr/bin/ftdi_eeprom) +endif + + @$(call install_lib, libftdi1, 0, 0, 0644, libftdi1) + +ifdef PTXCONF_LIBFTDI1_CPP_WRAPPER + @$(call install_lib, libftdi1, 0, 0, 0644, libftdipp1) +endif + + @$(call install_finish, libftdi1) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/libgsf.in b/rules/libgsf.in index 7ca9251..832dfc1 100644 --- a/rules/libgsf.in +++ b/rules/libgsf.in @@ -5,11 +5,12 @@ menuconfig LIBGSF prompt "libgsf " select ZLIB select LIBXML2 + select LIBXML2_HTTP select BZIP2 if LIBGSF_BZ2 select BZIP2_LIBBZ2 if LIBGSF_BZ2 select GLIB if LIBGSF_GIO select PYTHON if LIBGSF_PYTHON - select HOST_INTLTOOL if LIBGSF_NLS + select HOST_INTLTOOL help Structured File Library diff --git a/rules/libiodbc.in b/rules/libiodbc.in index b7ffe31..0aa6d88 100644 --- a/rules/libiodbc.in +++ b/rules/libiodbc.in @@ -42,6 +42,8 @@ choice config LIBIODBC_DRIVER_VERSION_2 bool "2.x" + # currently not supported + depends on BROKEN help build ODBC 2.x compatible driver manager diff --git a/rules/libkmod.make b/rules/libkmod.make index 4a9fe26..4595b68 100644 --- a/rules/libkmod.make +++ b/rules/libkmod.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_LIBKMOD) += libkmod # # Paths and names # -LIBKMOD_VERSION := 10 -LIBKMOD_MD5 := e2a883c4df15a50f78a7a61d5b64089f +LIBKMOD_VERSION := 13 +LIBKMOD_MD5 := d5aba43b9370cd52f3cb35e82a1aa595 LIBKMOD := kmod-$(LIBKMOD_VERSION) LIBKMOD_SUFFIX := tar.xz LIBKMOD_URL := $(call ptx/mirror, KERNEL, utils/kernel/kmod/$(LIBKMOD).$(LIBKMOD_SUFFIX)) @@ -37,6 +37,7 @@ LIBKMOD_CONF_OPT := \ --disable-static \ --enable-shared \ --$(call ptx/endis, PTXCONF_LIBKMOD_TOOLS)-tools \ + --disable-manpages \ --$(call ptx/endis, PTXCONF_LIBKMOD_LOGGING)-logging \ --$(call ptx/endis, PTXCONF_LIBKMOD_DEBUG)-debug \ --disable-gtk-doc \ diff --git a/rules/libmikmod.make b/rules/libmikmod.make index c9a97a2..c971bb7 100644 --- a/rules/libmikmod.make +++ b/rules/libmikmod.make @@ -29,6 +29,10 @@ LIBMIKMOD_LICENSE := LGPLv2+ # Prepare # ---------------------------------------------------------------------------- +LIBMIKMOD_CONF_ENV := \ + $(CROSS_ENV) \ + MAKEINFO=: + # # autoconf # diff --git a/rules/libnl3.make b/rules/libnl3.make index f1d78d6..fae4a25 100644 --- a/rules/libnl3.make +++ b/rules/libnl3.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_LIBNL3) += libnl3 # # Paths and names # -LIBNL3_VERSION := 3.2.21 -LIBNL3_MD5 := 6fe7136558a9071e70673dcda38545b3 +LIBNL3_VERSION := 3.2.22 +LIBNL3_MD5 := 2e1c889494d274aca24ce5f6a748e66e LIBNL3 := libnl-$(LIBNL3_VERSION) LIBNL3_SUFFIX := tar.gz LIBNL3_URL := http://www.infradead.org/~tgr/libnl/files/$(LIBNL3).$(LIBNL3_SUFFIX) diff --git a/rules/libsoup.in b/rules/libsoup.in index a9d4384..8c05f26 100644 --- a/rules/libsoup.in +++ b/rules/libsoup.in @@ -2,6 +2,7 @@ config LIBSOUP tristate + select LIBXML2 prompt "libsoup" help HTTP library implementation in C. diff --git a/rules/libxcb.make b/rules/libxcb.make index d80c529..157e683 100644 --- a/rules/libxcb.make +++ b/rules/libxcb.make @@ -40,6 +40,7 @@ endif LIBXCB_CONF_TOOL := autoconf LIBXCB_CONF_OPT := \ $(CROSS_AUTOCONF_USR) \ + --disable-static \ --disable-build-docs \ --enable-composite \ --enable-damage \ diff --git a/rules/libxkbcommon.in b/rules/libxkbcommon.in new file mode 100644 index 0000000..f80e8b8 --- /dev/null +++ b/rules/libxkbcommon.in @@ -0,0 +1,9 @@ +## SECTION=multimedia_libs + +config LIBXKBCOMMON + tristate + prompt "libxkbcommon" + select XKEYBOARD_CONFIG if RUNTIME + help + A library to handle keyboard descriptions, to be used by + Wayland, kmscon, GTK+, Qt, Clutter, etc. diff --git a/rules/libxkbcommon.make b/rules/libxkbcommon.make new file mode 100644 index 0000000..2285e14 --- /dev/null +++ b/rules/libxkbcommon.make @@ -0,0 +1,63 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Philipp Zabel +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_LIBXKBCOMMON) += libxkbcommon + +# +# Paths and names +# +LIBXKBCOMMON_VERSION := 0.2.0 +LIBXKBCOMMON_MD5 := 2be3d4a255d02c7d46fc6a9486f21f6a +LIBXKBCOMMON := libxkbcommon-$(LIBXKBCOMMON_VERSION) +LIBXKBCOMMON_SUFFIX := tar.bz2 +LIBXKBCOMMON_URL := http://xkbcommon.org/download/$(LIBXKBCOMMON).$(LIBXKBCOMMON_SUFFIX) +LIBXKBCOMMON_SOURCE := $(SRCDIR)/$(LIBXKBCOMMON).$(LIBXKBCOMMON_SUFFIX) +LIBXKBCOMMON_DIR := $(BUILDDIR)/$(LIBXKBCOMMON) +LIBXKBCOMMON_LICENSE := MIT/X11 + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +LIBXKBCOMMON_CONF_TOOL := autoconf +LIBXKBCOMMON_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static \ + --disable-selective-werror \ + --disable-strict-compilation \ + --disable-docs \ + --with-xkb-config-root=$(PTXCONF_XORG_DEFAULT_DATA_DIR)/X11/xkb + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/libxkbcommon.targetinstall: + @$(call targetinfo) + + @$(call install_init, libxkbcommon) + @$(call install_fixup, libxkbcommon,PRIORITY,optional) + @$(call install_fixup, libxkbcommon,SECTION,base) + @$(call install_fixup, libxkbcommon,AUTHOR,"Philipp Zabel ") + @$(call install_fixup, libxkbcommon,DESCRIPTION,missing) + + @$(call install_lib, libxkbcommon, 0, 0, 0644, libxkbcommon) + + @$(call install_finish, libxkbcommon) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/lm_sensors.in b/rules/lm_sensors.in index 77c41d0..75c6842 100644 --- a/rules/lm_sensors.in +++ b/rules/lm_sensors.in @@ -4,7 +4,7 @@ menuconfig LM_SENSORS tristate prompt "lm_sensors " select LIBC_M - select BASH if LM_SENSORS_FANCONTROL || LM_SENSORS_PWMCONFIG + select BASH if (LM_SENSORS_FANCONTROL || LM_SENSORS_PWMCONFIG) && RUNTIME help Lm-sensors is a hardware health monitoring package for Linux. It contains a library (libsensors) providing generic access to hwmon diff --git a/rules/lm_sensors.make b/rules/lm_sensors.make index 3bde4e5..e381460 100644 --- a/rules/lm_sensors.make +++ b/rules/lm_sensors.make @@ -17,31 +17,29 @@ PACKAGES-$(PTXCONF_LM_SENSORS) += lm_sensors # # Paths and names # -LM_SENSORS_VERSION := 3.1.2 -LM_SENSORS_MD5 := 58a9a225808ac4587c4c8cbd12b40b5c +LM_SENSORS_VERSION := 3.3.3 +LM_SENSORS_MD5 := 73c2fcccdab6049d289c5e0c596192a1 LM_SENSORS := lm_sensors-$(LM_SENSORS_VERSION) LM_SENSORS_SUFFIX := tar.bz2 LM_SENSORS_URL := http://dl.lm-sensors.org/lm-sensors/releases/$(LM_SENSORS).$(LM_SENSORS_SUFFIX) LM_SENSORS_SOURCE := $(SRCDIR)/$(LM_SENSORS).$(LM_SENSORS_SUFFIX) LM_SENSORS_DIR := $(BUILDDIR)/$(LM_SENSORS) -LM_SENSORS_LICENSE := GPLv2+ +LM_SENSORS_LICENSE := GPLv2+, LGPLv2.1+ # ---------------------------------------------------------------------------- # Prepare # ---------------------------------------------------------------------------- -LM_SENSORS_PATH := PATH=$(CROSS_PATH) -LM_SENSORS_ENV := $(CROSS_ENV) - -LM_SENSORS_MAKEVARS := \ +LM_SENSORS_CONF_TOOL := NO +LM_SENSORS_MAKE_OPT := \ PREFIX=/usr \ LIBICONV="" \ MACHINE=$(PTXCONF_ARCH_STRING) \ $(CROSS_ENV_CC) -$(STATEDIR)/lm_sensors.prepare: - @$(call targetinfo) - @$(call touch) +LM_SENSORS_INSTALL_OPT := \ + $(LM_SENSORS_MAKE_OPT) \ + install # ---------------------------------------------------------------------------- # Target-Install diff --git a/rules/lpc21isp.make b/rules/lpc21isp.make index 2999eae..132a0c9 100644 --- a/rules/lpc21isp.make +++ b/rules/lpc21isp.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_LPC21ISP) += lpc21isp # # Paths and names # -LPC21ISP_VERSION := 1.83 -LPC21ISP_MD5 := 4b437a6d6e718afa6d182f0c18f5363f +LPC21ISP_VERSION := 1.85 +LPC21ISP_MD5 := e80c16b252a5198b6ed3b5559af350d6 LPC21ISP_STRIP_LEVEL := 0 LPC21ISP := lpc21isp_$(subst .,,$(LPC21ISP_VERSION)) LPC21ISP_SUFFIX := tar.gz diff --git a/rules/ltp.in b/rules/ltp.in index 1e31f89..fa2cd01 100644 --- a/rules/ltp.in +++ b/rules/ltp.in @@ -2,6 +2,7 @@ menuconfig LTP tristate + depends on BROKEN prompt "linux test project " help The Linux Test Project is a joint project with SGI, IBM, OSDL, diff --git a/rules/lua-filesystem.in b/rules/lua-filesystem.in new file mode 100644 index 0000000..0496311 --- /dev/null +++ b/rules/lua-filesystem.in @@ -0,0 +1,8 @@ +## SECTION=scripting_languages + +config LUA_FILESYSTEM + tristate + prompt "lua-filesystem" + select LUA + help + luafilesystem library for the Lua language diff --git a/rules/lua-filesystem.make b/rules/lua-filesystem.make new file mode 100644 index 0000000..1c60b9f --- /dev/null +++ b/rules/lua-filesystem.make @@ -0,0 +1,60 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Joerg Platte +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_LUA_FILESYSTEM) += lua-filesystem + +# +# Paths and names +# +LUA_FILESYSTEM_VERSION := 1.5.0 +LUA_FILESYSTEM_MD5 := af4c07a7d9c0834e4f52fc0572180ef9 +LUA_FILESYSTEM := lua-filesystem_1.5.0+16+g84f1af5 +LUA_FILESYSTEM_SUFFIX := orig.tar.gz +LUA_FILESYSTEM_URL := $(call ptx/mirror, DEB, pool/main/l/lua-filesystem/$(LUA_FILESYSTEM).$(LUA_FILESYSTEM_SUFFIX)) +LUA_FILESYSTEM_SOURCE := $(SRCDIR)/$(LUA_FILESYSTEM).$(LUA_FILESYSTEM_SUFFIX) +LUA_FILESYSTEM_DIR := $(BUILDDIR)/$(LUA_FILESYSTEM) +LUA_FILESYSTEM_LICENSE := unknown + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +LUA_FILESYSTEM_MAKE_OPT := \ + $(CROSS_ENV_CC) \ + LUA_INC=. + +LUA_FILESYSTEM_INSTALL_OPT := \ + $(LUA_FILESYSTEM_MAKE_OPT) \ + LUA_LIBDIR=$(LUA_FILESYSTEM_PKGDIR)/usr/lib/lua/5.1 \ + install + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/lua-filesystem.targetinstall: + @$(call targetinfo) + + @$(call install_init, lua-filesystem) + @$(call install_fixup, lua-filesystem,PRIORITY,optional) + @$(call install_fixup, lua-filesystem,SECTION,base) + @$(call install_fixup, lua-filesystem,AUTHOR,"Joerg Platte ") + @$(call install_fixup, lua-filesystem,DESCRIPTION,missing) + + @$(call install_lib, lua-filesystem, 0, 0, 0644, lua/5.1/lfs) + + @$(call install_finish, lua-filesystem) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/luaexpat.in b/rules/luaexpat.in new file mode 100644 index 0000000..170e5e4 --- /dev/null +++ b/rules/luaexpat.in @@ -0,0 +1,9 @@ +## SECTION=scripting_languages + +config LUAEXPAT + tristate + select LUA + select EXPAT + prompt "lua-expat" + help + libexpat bindings for the Lua language diff --git a/rules/luaexpat.make b/rules/luaexpat.make new file mode 100644 index 0000000..caccbb6 --- /dev/null +++ b/rules/luaexpat.make @@ -0,0 +1,65 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Joerg Platte +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_LUAEXPAT) += luaexpat + +# +# Paths and names +# +LUAEXPAT_VERSION := 1.2.0 +LUAEXPAT_MD5 := 03efe50c7f30a34580701e6527d7bfee +LUAEXPAT := luaexpat-$(LUAEXPAT_VERSION) +LUAEXPAT_SUFFIX := tar.gz +LUAEXPAT_URL := http://matthewwild.co.uk/projects/luaexpat/$(LUAEXPAT).$(LUAEXPAT_SUFFIX) +LUAEXPAT_SOURCE := $(SRCDIR)/$(LUAEXPAT).$(LUAEXPAT_SUFFIX) +LUAEXPAT_DIR := $(BUILDDIR)/$(LUAEXPAT) +LUAEXPAT_LICENSE := unknown + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +LUAEXPAT_CONF_TOOL := NO + +LUAEXPAT_MAKE_OPT := \ + $(CROSS_ENV_CC) \ + LUA_VERSION_NUM=501 \ + LUA_INC=. \ + EXPAT_INC=. + +LUAEXPAT_INSTALL_OPT := \ + $(LUAEXPAT_MAKE_OPT) \ + LUA_LIBDIR=$(LUAEXPAT_PKGDIR)/usr/lib/lua/5.1 \ + LUA_DIR=$(LUAEXPAT_PKGDIR)/usr/share/lua/5.1 \ + install + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/luaexpat.targetinstall: + @$(call targetinfo) + + @$(call install_init, luaexpat) + @$(call install_fixup, luaexpat,PRIORITY,optional) + @$(call install_fixup, luaexpat,SECTION,base) + @$(call install_fixup, luaexpat,AUTHOR,"Joerg Platte ") + @$(call install_fixup, luaexpat,DESCRIPTION,missing) + + @$(call install_copy, luaexpat, 0, 0, 0644, -, /usr/share/lua/5.1/lxp/lom.lua) + @$(call install_lib, luaexpat, 0, 0, 0644, lua/5.1/lxp) + @$(call install_finish, luaexpat) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/mesalib.in b/rules/mesalib.in index 279f065..9494949 100644 --- a/rules/mesalib.in +++ b/rules/mesalib.in @@ -7,6 +7,8 @@ menuconfig MESALIB select DRI2PROTO select HOST_MESALIB select HOST_MAKEDEPEND + select HOST_SYSTEM_PYTHON + select HOST_SYSTEM_PYTHON_XML2 select XORG_LIB_X11 if MESALIB_DRI select XORG_LIB_XEXT if MESALIB_DRI || MESALIB_XLIB_GLX select XORG_LIB_XXF86VM if MESALIB_DRI diff --git a/rules/mesalib.make b/rules/mesalib.make index 741a9b2..e988333 100644 --- a/rules/mesalib.make +++ b/rules/mesalib.make @@ -27,13 +27,6 @@ MESALIB_URL := ftp://ftp.freedesktop.org/pub/mesa/$(MESALIB_VERSION)/$(MESALIB). MESALIB_SOURCE := $(SRCDIR)/$(MESALIB).$(MESALIB_SUFFIX) MESALIB_DIR := $(BUILDDIR)/Mesa-$(MESALIB_VERSION) -ifdef PTXCONF_MESALIB -ifeq ($(shell $(PTXDIST_TOPDIR)/bin/python -c 'import libxml2' 2>/dev/null || echo no),no) - $(warning *** libxml2 Python module is required for Mesa) - $(error please install python-libxml2 (debian)) -endif -endif - # ---------------------------------------------------------------------------- # Prepare # ---------------------------------------------------------------------------- diff --git a/rules/mtdev.in b/rules/mtdev.in new file mode 100644 index 0000000..20aaa02 --- /dev/null +++ b/rules/mtdev.in @@ -0,0 +1,7 @@ +## SECTION=multimedia_libs + +config MTDEV + tristate + prompt "mtdev" + help + multitouch protocol translation library diff --git a/rules/mtdev.make b/rules/mtdev.make new file mode 100644 index 0000000..42f8151 --- /dev/null +++ b/rules/mtdev.make @@ -0,0 +1,59 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Philipp Zabel +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_MTDEV) += mtdev + +# +# Paths and names +# +MTDEV_VERSION := 1.1.3 +MTDEV_MD5 := 8a236569ad3dd79eaeed45f1935359be +MTDEV := mtdev-$(MTDEV_VERSION) +MTDEV_SUFFIX := tar.bz2 +MTDEV_URL := http://bitmath.org/code/mtdev/$(MTDEV).$(MTDEV_SUFFIX) +MTDEV_SOURCE := $(SRCDIR)/$(MTDEV).$(MTDEV_SUFFIX) +MTDEV_DIR := $(BUILDDIR)/$(MTDEV) +MTDEV_LICENSE := MIT/X11 + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +MTDEV_CONF_TOOL := autoconf +MTDEV_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/mtdev.targetinstall: + @$(call targetinfo) + + @$(call install_init, mtdev) + @$(call install_fixup, mtdev,PRIORITY,optional) + @$(call install_fixup, mtdev,SECTION,base) + @$(call install_fixup, mtdev,AUTHOR,"Philipp Zabel ") + @$(call install_fixup, mtdev,DESCRIPTION,multitouch protocol translation library) + + @$(call install_lib, mtdev, 0, 0, 0644, libmtdev) + + @$(call install_finish, mtdev) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/ncurses.make b/rules/ncurses.make index cb6da68..4e419ed 100644 --- a/rules/ncurses.make +++ b/rules/ncurses.make @@ -197,6 +197,7 @@ endif ifdef PTXCONF_NCURSES_TERMCAP @$(call install_copy, ncurses, 0, 0, 0644, -, /usr/share/terminfo/x/xterm, n); @$(call install_copy, ncurses, 0, 0, 0644, -, /usr/share/terminfo/x/xterm-color, n); + @$(call install_copy, ncurses, 0, 0, 0644, -, /usr/share/terminfo/x/xterm-256color, n); @$(call install_copy, ncurses, 0, 0, 0644, -, /usr/share/terminfo/x/xterm-xfree86, n); @$(call install_copy, ncurses, 0, 0, 0644, -, /usr/share/terminfo/v/vt100, n); @$(call install_copy, ncurses, 0, 0, 0644, -, /usr/share/terminfo/v/vt102, n); diff --git a/rules/net-snmp.in b/rules/net-snmp.in index 6205a19..aed84a8 100644 --- a/rules/net-snmp.in +++ b/rules/net-snmp.in @@ -6,8 +6,6 @@ menuconfig NET_SNMP select GCCLIBS_GCC_S if NET_SNMP_AGENT select LIBC_DL if NET_SNMP_AGENT || NET_SNMP_APPLICATIONS select LIBNL if NET_SNMP_AGENT || NET_SNMP_APPLICATIONS - select NET_SNMP_MD5 -# ^ build fix for 5.6.1 (see http://sourceforge.net/tracker/index.php?func=detail&aid=3184697&group_id=12694&atid=112694) if NET_SNMP @@ -118,4 +116,9 @@ config NET_SNMP_MIB_INSTALL_DIR string default "/usr/share/snmp/mibs" +config NET_SNMP_DOM_SOCK_ONLY + bool "Only allow domain socket connections to the agent" if NET_SNMP_AGENT + default y + help + Enable this to disable TCP and UDP connections to the agent. endif diff --git a/rules/net-snmp.make b/rules/net-snmp.make index 24efa72..7a25043 100644 --- a/rules/net-snmp.make +++ b/rules/net-snmp.make @@ -17,8 +17,8 @@ PACKAGES-$(PTXCONF_NET_SNMP) += net-snmp # # Paths and names # -NET_SNMP_VERSION := 5.6.1 -NET_SNMP_MD5 := b4e30ead5783b0bb1d280172c6095ea4 +NET_SNMP_VERSION := 5.7.2 +NET_SNMP_MD5 := 5bddd02e2f82b62daa79f82717737a14 NET_SNMP := net-snmp-$(NET_SNMP_VERSION) NET_SNMP_SUFFIX := tar.gz NET_SNMP_URL := $(call ptx/mirror, SF, net-snmp/$(NET_SNMP).$(NET_SNMP_SUFFIX)) @@ -50,7 +50,16 @@ NET_SNMP_AUTOCONF := \ --enable-shared \ --disable-embedded-perl \ --without-perl-modules \ - --disable-static + --disable-static \ + --disable-privacy \ + --disable-internal-md5 \ + --$(call ptx/endis, PTXCONF_NET_SNMP_DOM_SOCK_ONLY)-agentx-dom-sock-only \ + --disable-mib-config-checking \ + --disable-mfd-rewrites \ + --disable-testing-code \ + --disable-reentrant \ + --disable-embedded-perl \ + --disable-ucd-snmp-compatibility ifdef PTXCONF_ENDIAN_LITTLE NET_SNMP_AUTOCONF += --with-endianness=little @@ -144,60 +153,6 @@ else NET_SNMP_AUTOCONF += --disable-developer endif -ifdef PTXCONF_NET_SNMP_PRIVACY -NET_SNMP_AUTOCONF += --enable-privacy -else -NET_SNMP_AUTOCONF += --disable-privacy -endif - -ifdef PTXCONF_NET_SNMP_INTERNAL_MD5 -NET_SNMP_AUTOCONF += --enable-internal-md5 -else -NET_SNMP_AUTOCONF += --disable-internal-md5 -endif - -ifdef PTXCONF_NET_SNMP_AGENTX_DOM_SOCK_ONLY -NET_SNMP_AUTOCONF += --enable-agentx-dom-sock-only -else -NET_SNMP_AUTOCONF += --disable-agentx-dom-sock-only -endif - -ifdef PTXCONF_NET_SNMP_MIB_CONFIG_CHECKING -NET_SNMP_AUTOCONF += --enable-mib-config-checking -else -NET_SNMP_AUTOCONF += --disable-mib-config-checking -endif - -ifdef PTXCONF_NET_SNMP_MFD_REWRITES -NET_SNMP_AUTOCONF += --enable-mfd-rewrites -else -NET_SNMP_AUTOCONF += --disable-mfd-rewrites -endif - -ifdef PTXCONF_NET_SNMP_TESTING_CODE -NET_SNMP_AUTOCONF += --enable-testing-code -else -NET_SNMP_AUTOCONF += --disable-testing-code -endif - -ifdef PTXCONF_NET_SNMP_REENTRANT -NET_SNMP_AUTOCONF += --enable-reentrant -else -NET_SNMP_AUTOCONF += --disable-reentrant -endif - -ifdef PTXCONF_NET_SNMP_EMBEDDED_PERL -NET_SNMP_AUTOCONF += --enable-embedded-perl -else -NET_SNMP_AUTOCONF += --disable-embedded-perl -endif - -ifdef PTXCONF_NET_SNMP_UCD_COMPAT -NET_SNMP_AUTOCONF += --enable-ucd-snmp-compatibility -else -NET_SNMP_AUTOCONF += --disable-ucd-snmp-compatibility -endif - ##NET_SNMP_AUTOCONF += --with-mib-modules=mibII ##NET_SNMP_AUTOCONF += --with-sys-contact=root@localhost ##NET_SNMP_AUTOCONF += --with-sys-location=unknown @@ -240,14 +195,15 @@ NET_SNMP_RFCMIBS := IF-MIB.txt IF-INVERTED-STACK-MIB.txt \ SNMP-USM-DH-OBJECTS-MIB.txt NET_SNMP_NETSNMPMIBS := NET-SNMP-TC.txt NET-SNMP-MIB.txt NET-SNMP-AGENT-MIB.txt \ - NET-SNMP-EXAMPLES-MIB.txt NET-SNMP-EXTEND-MIB.txt + NET-SNMP-EXAMPLES-MIB.txt NET-SNMP-EXTEND-MIB.txt \ + NET-SNMP-PASS-MIB.txt NET_SNMP_UCDMIBS := UCD-SNMP-MIB.txt UCD-DEMO-MIB.txt UCD-IPFWACC-MIB.txt \ UCD-DLMOD-MIB.txt UCD-DISKIO-MIB.txt ## FIXME: for now, you need to manually edit this list to represent what mibs to install on target. NET_SNMP_MIBS := $(NET_SNMP_V1MIBS) $(NET_SNMP_V2MIBS) $(NET_SNMP_V3MIBS) \ - $(NET_SNMP_AGENTMIBS) $(NET_SNMP_IANAMIBS) $(NET_SNMP_RFCMIBS) $(NET_SNMP_NETSNMPMIBS) $(NET_SNNP_UCDMIBS) + $(NET_SNMP_AGENTMIBS) $(NET_SNMP_IANAMIBS) $(NET_SNMP_RFCMIBS) $(NET_SNMP_NETSNMPMIBS) $(NET_SNMP_UCDMIBS) $(STATEDIR)/net-snmp.targetinstall: @$(call targetinfo) diff --git a/rules/networkmanager.in b/rules/networkmanager.in index 8578b1c..1335fa2 100644 --- a/rules/networkmanager.in +++ b/rules/networkmanager.in @@ -9,7 +9,7 @@ menuconfig NETWORKMANAGER select UDEV select UDEV_LIBGUDEV select DBUS_GLIB - select LIBNL + select LIBNL3 select LIBUUID select WPA_SUPPLICANT if RUNTIME select GNUTLS diff --git a/rules/networkmanager.make b/rules/networkmanager.make index 909b97c..8bcfdcc 100644 --- a/rules/networkmanager.make +++ b/rules/networkmanager.make @@ -17,8 +17,8 @@ PACKAGES-$(PTXCONF_NETWORKMANAGER) += networkmanager # # Paths and names # -NETWORKMANAGER_VERSION := 0.9.6.4 -NETWORKMANAGER_MD5 := 54ca5200edeb5155086ced43d00b0cad +NETWORKMANAGER_VERSION := 0.9.8.0 +NETWORKMANAGER_MD5 := 38d28f6bd9220d85dfff47210706195c NETWORKMANAGER := NetworkManager-$(NETWORKMANAGER_VERSION) NETWORKMANAGER_SUFFIX := tar.xz NETWORKMANAGER_URL := http://ftp.gnome.org/pub/GNOME/sources/NetworkManager/0.9/$(NETWORKMANAGER).$(NETWORKMANAGER_SUFFIX) @@ -39,23 +39,32 @@ NETWORKMANAGER_CONF_OPT := \ --enable-shared \ --disable-nls \ --disable-rpath \ + --disable-ifcfg-rh \ + --disable-ifcfg-suse \ + --enable-ifupdown \ + --disable-ifnet \ --disable-qt \ - --disable-ppp \ --disable-wimax \ --disable-polkit \ + --disable-modify-system \ + --disable-ppp \ + --disable-concheck \ --enable-more-warnings \ - --disable-gtk-doc \ --disable-vala \ - --without-docs \ - --with-gnu-ld \ - --with-crypto=gnutls \ - --with-distro=debian \ + --disable-tests \ + --disable-doc \ + --disable-gtk-doc \ + --with-systemdsystemunitdir=/lib/systemd/system \ --with-session-tracking=none \ + --with-crypto=gnutls \ + --without-modem-manager-1 \ --with-dhclient=/sbin/dhclient \ - --with-dhcpcd=no \ - --with-resolvconf=no \ + --without-dhcpcd \ + --without-resolvconf \ + --without-netconfig \ --with-iptables=/usr/sbin/iptables + # ---------------------------------------------------------------------------- # Install # ---------------------------------------------------------------------------- @@ -101,6 +110,8 @@ $(STATEDIR)/networkmanager.targetinstall: # # unmanage NFS root devices @$(call install_alternative, networkmanager, 0, 0, 0755, /lib/init/nm-unmanage.sh) + @$(call install_copy, networkmanager, 0, 0, 0755, /var/lib/NetworkManager) + ifdef PTXCONF_INITMETHOD_BBINIT ifdef PTXCONF_NETWORKMANAGER_STARTSCRIPT @$(call install_alternative, networkmanager, 0, 0, 0755, /etc/init.d/NetworkManager) @@ -121,6 +132,8 @@ ifdef PTXCONF_NETWORKMANAGER_SYSTEMD_UNIT /lib/systemd/system/NetworkManager-unmanage.service) @$(call install_link, networkmanager, ../NetworkManager-unmanage.service, \ /lib/systemd/system/NetworkManager.service.wants/NetworkManager-unmanage.service) + @$(call install_alternative, networkmanager, 0, 0, 0644, \ + /lib/systemd/system/NetworkManager-wait-online.service) endif @$(call install_copy, networkmanager, 0, 0, 0755, -, /usr/sbin/NetworkManager) diff --git a/rules/ntp.in b/rules/ntp.in index 736cd29..26addd5 100644 --- a/rules/ntp.in +++ b/rules/ntp.in @@ -233,6 +233,12 @@ config NTP_NTPD_STARTSCRIPT depends on NTP_NTPD prompt "install /etc/init.d/ntp-server" +config NTP_NTPD_SYSTEMD_UNIT + bool + default y + depends on SYSTEMD + prompt "install systemd service file" + config NTP_NTPDC bool prompt "install ntpdc" diff --git a/rules/ntp.make b/rules/ntp.make index 720d522..84d48c1 100644 --- a/rules/ntp.make +++ b/rules/ntp.make @@ -322,6 +322,12 @@ ifneq ($(call remove_quotes,$(PTXCONF_NTP_NTPD_BBINIT_LINK)),) endif endif endif +ifdef PTXCONF_NTP_NTPD_SYSTEMD_UNIT + @$(call install_alternative, ntp, 0, 0, 0644, \ + /lib/systemd/system/ntpd.service) + @$(call install_link, ntp, ../ntpd.service, \ + /lib/systemd/system/multi-user.target.wants/ntpd.service) +endif # # # # ntpdc diff --git a/rules/openntpd.in b/rules/openntpd.in index 44c7973..174feaa 100644 --- a/rules/openntpd.in +++ b/rules/openntpd.in @@ -6,6 +6,7 @@ menuconfig OPENNTPD tristate prompt "openntpd " select ROOTFS_VAR_RUN + select OPENSSL if OPENNTPD_ARC4RANDOM depends on !BUSYBOX_NTPD || ALLYES help This will install the BSD Open NTPD Daemon diff --git a/rules/openntpd.make b/rules/openntpd.make index f8e51be..9246d99 100644 --- a/rules/openntpd.make +++ b/rules/openntpd.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_OPENNTPD) += openntpd # # Paths and names # -OPENNTPD_VERSION := 3.7p1 -OPENNTPD_MD5 := 10ed8eefd760e5819efcf3277b118f47 +OPENNTPD_VERSION := 3.9p1 +OPENNTPD_MD5 := afc34175f38d08867c1403d9008600b3 OPENNTPD := openntpd-$(OPENNTPD_VERSION) OPENNTPD_SUFFIX := tar.gz OPENNTPD_URL := http://ftp.eu.openbsd.org/pub/OpenBSD/OpenNTPD/$(OPENNTPD).$(OPENNTPD_SUFFIX) @@ -28,22 +28,15 @@ OPENNTPD_DIR := $(BUILDDIR)/$(OPENNTPD) # Prepare # ---------------------------------------------------------------------------- -OPENNTPD_PATH := PATH=$(CROSS_PATH) -OPENNTPD_ENV := $(CROSS_ENV) - # # autoconf # -OPENNTPD_AUTOCONF := \ +OPENNTPD_CONF_TOOL := autoconf +OPENNTPD_CONF_OPT := \ $(CROSS_AUTOCONF_USR) \ --with-privsep-user=ntp \ - --with-privsep-path=/var/run/ntp - -ifdef PTXCONF_OPENNTPD_ARC4RANDOM -OPENNTPD_AUTOCONF += --with-builtin-arc4random -else -OPENNTPD_AUTOCONF += --without-builtin-arc4random -endif + --with-privsep-path=/var/run/ntp \ + --$(call ptx/wwo, PTXCONF_OPENNTPD_ARC4RANDOM)-builtin-arc4random # ---------------------------------------------------------------------------- # Target-Install diff --git a/rules/openssl.make b/rules/openssl.make index 2c61ed2..67ad7d3 100644 --- a/rules/openssl.make +++ b/rules/openssl.make @@ -18,8 +18,8 @@ PACKAGES-$(PTXCONF_OPENSSL) += openssl # # Paths and names # -OPENSSL_VERSION := 1.0.0j -OPENSSL_MD5 := cbe4ac0d8f598680f68a951e04b0996b +OPENSSL_VERSION := 1.0.0k +OPENSSL_MD5 := 99af9b319f928da5ea3e860311b396ef OPENSSL := openssl-$(OPENSSL_VERSION) OPENSSL_SUFFIX := tar.gz OPENSSL_URL := http://openssl.org/source//$(OPENSSL).$(OPENSSL_SUFFIX) diff --git a/rules/opkg.in b/rules/opkg.in index 842942a..fca58c1 100644 --- a/rules/opkg.in +++ b/rules/opkg.in @@ -58,6 +58,8 @@ config OPKG_GPG prompt "signature checking with gpg" # gpg and openssl are mutually exclusive depends on ! OPKG_OPENSSL + # needs gpgme + depends on BROKEN help FIXME diff --git a/rules/opus.in b/rules/opus.in new file mode 100644 index 0000000..7412eb7 --- /dev/null +++ b/rules/opus.in @@ -0,0 +1,7 @@ +## SECTION=multimedia_libs + +config OPUS + tristate + prompt "opus" + help + Opus is a totally open, royalty-free, highly versatile audio codec. diff --git a/rules/opus.make b/rules/opus.make new file mode 100644 index 0000000..a26e0dc --- /dev/null +++ b/rules/opus.make @@ -0,0 +1,67 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_OPUS) += opus + +# +# Paths and names +# +OPUS_VERSION := 1.0.2 +OPUS_MD5 := c503ad05a59ddb44deab96204401be03 +OPUS := opus-$(OPUS_VERSION) +OPUS_SUFFIX := tar.gz +OPUS_URL := http://downloads.xiph.org/releases/opus/$(OPUS).$(OPUS_SUFFIX) +OPUS_SOURCE := $(SRCDIR)/$(OPUS).$(OPUS_SUFFIX) +OPUS_DIR := $(BUILDDIR)/$(OPUS) +OPUS_LICENSE := unknown + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +OPUS_CONF_TOOL := autoconf +OPUS_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static \ + --enable-fixed-point \ + --disable-fixed-point-debug \ + --disable-custom-modes \ + --enable-float-approx \ + --disable-assertions \ + --disable-fuzzing \ + --disable-doc + + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/opus.targetinstall: + @$(call targetinfo) + + @$(call install_init, opus) + @$(call install_fixup, opus,PRIORITY,optional) + @$(call install_fixup, opus,SECTION,base) + @$(call install_fixup, opus,AUTHOR,"Michael Olbrich ") + @$(call install_fixup, opus,DESCRIPTION,missing) + + @$(call install_lib, opus, 0, 0, 0644, libopus) + + @$(call install_finish, opus) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/orc.make b/rules/orc.make index 7b6bfbb..67e5ebb 100644 --- a/rules/orc.make +++ b/rules/orc.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_ORC) += orc # # Paths and names # -ORC_VERSION := 0.4.16 -ORC_MD5 := e482932e544c847761449b106ecbc483 +ORC_VERSION := 0.4.18 +ORC_MD5 := 1a2552e8d127526c48d644fe6437b377 ORC := orc-$(ORC_VERSION) ORC_SUFFIX := tar.gz ORC_URL := http://code.entropywave.com/download/orc/$(ORC).$(ORC_SUFFIX) diff --git a/rules/owfs.in b/rules/owfs.in index 19c6552..e02bf7d 100644 --- a/rules/owfs.in +++ b/rules/owfs.in @@ -1,4 +1,11 @@ ## SECTION=system_libraries + +comment "owfs conflicts with BusyBox' mount!" + depends on BUSYBOX_MOUNT + +comment "owfs conflicts with BusyBox' umount!" + depends on BUSYBOX_MOUNT + menuconfig OWFS tristate prompt "owfs " @@ -7,6 +14,8 @@ menuconfig OWFS select GCCLIBS_GCC_S select FUSE if OWFS_OWFS select FUSE__LIB if OWFS_OWFS + depends on !BUSYBOX_MOUNT || ALLYES + depends on !BUSYBOX_UMOUNT || ALLYES select UTIL_LINUX_NG if OWFS_OWFS select UTIL_LINUX_NG_MOUNT if OWFS_OWFS select UTIL_LINUX_NG_UMOUNT if OWFS_OWFS diff --git a/rules/pciutils.make b/rules/pciutils.make index 3342852..1490a53 100644 --- a/rules/pciutils.make +++ b/rules/pciutils.make @@ -70,8 +70,6 @@ ifdef PTXCONF_PCIUTILS_COMPRESS @$(call install_copy, pciutils, 0, 0, 0644, -, \ /usr/share/pci.ids.gz, n) else - @gunzip -c $(PCIUTILS_PKGDIR)/usr/share/pci.ids.gz > \ - $(PCIUTILS_PKGDIR)/usr/share/pci.ids @$(call install_copy, pciutils, 0, 0, 0644, -, \ /usr/share/pci.ids, n) endif diff --git a/rules/php5.in b/rules/php5.in index d175546..2e08037 100644 --- a/rules/php5.in +++ b/rules/php5.in @@ -4,7 +4,7 @@ menuconfig PHP5 tristate prompt "php5 " - select APACHE2 if PHP5_SAPI_APXS2 + select APACHE2 if PHP5_SAPI_APXS2 || PHP5_SAPI_APXS2FILTER select LIBCURL if PHP5_EXT_CURL select LIBXML2 if PHP5_XML_LIBXML2 select LIBXSLT if PHP5_XML_LIBXML2_XSLT diff --git a/rules/php5.make b/rules/php5.make index 75bfabc..b24cd33 100644 --- a/rules/php5.make +++ b/rules/php5.make @@ -65,7 +65,7 @@ PHP5_AUTOCONF += --without-aolserver endif ifdef PTXCONF_PHP5_SAPI_APXS2FILTER -PHP5_AUTOCONF += --with-apxs2filter +PHP5_AUTOCONF += --with-apxs2filter=$(PTXDIST_SYSROOT_TARGET)/usr/bin/apxs else #PHP5_AUTOCONF += --without-apxs2filter endif diff --git a/rules/pixman.make b/rules/pixman.make index c7bc72d..cfcc327 100644 --- a/rules/pixman.make +++ b/rules/pixman.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_PIXMAN) += pixman # # Paths and names # -PIXMAN_VERSION := 0.26.0 -PIXMAN_MD5 := d0c41a51db89efec669812e66a5582fa +PIXMAN_VERSION := 0.30.0 +PIXMAN_MD5 := 11b7e062e20ae40e49c2871dd9f82b0b PIXMAN := pixman-$(PIXMAN_VERSION) PIXMAN_SUFFIX := tar.bz2 PIXMAN_URL := $(call ptx/mirror, XORG, individual/lib/$(PIXMAN).$(PIXMAN_SUFFIX)) @@ -33,16 +33,22 @@ PIXMAN_DIR := $(BUILDDIR)/$(PIXMAN) # PIXMAN_AUTOCONF := \ $(CROSS_AUTOCONF_USR) \ + --disable-static \ --disable-openmp \ + --disable-loongson-mmi \ --$(call ptx/endis, PTXCONF_ARCH_X86)-mmx \ --$(call ptx/endis, PTXCONF_ARCH_X86)-sse2 \ --disable-vmx \ --disable-arm-simd \ --$(call ptx/endis, PTXCONF_ARCH_ARM_NEON)-arm-neon \ + --disable-arm-iwmmxt \ + --disable-arm-iwmmxt2 \ + --disable-mips-dspr2 \ --enable-gcc-inline-asm \ --disable-static-testprogs \ --disable-timers \ - --disable-gtk + --disable-gtk \ + --disable-libpng # ---------------------------------------------------------------------------- # Target-Install diff --git a/rules/policycoreutils.in b/rules/policycoreutils.in index 78e930d..2704f6b 100644 --- a/rules/policycoreutils.in +++ b/rules/policycoreutils.in @@ -10,7 +10,9 @@ menuconfig POLICYCOREUTILS select LIBSEPOL select DBUS_GLIB if POLICYCOREUTILS_RESTORECOND select SEPOLGEN if POLICYCOREUTILS_PYTHON + select BUSYBOX_FEATURE_FIND_DEPTH if BUSYBOX_FIND select BUSYBOX_FEATURE_FIND_DELETE if BUSYBOX_FIND + select BUSYBOX_SELINUX if BUSYBOX_FIND select BUSYBOX_FEATURE_FIND_CONTEXT if BUSYBOX_FIND help This package contains the core policy utilities that are required diff --git a/rules/portmap.make b/rules/portmap.make index d89c42e..c32cb1b 100644 --- a/rules/portmap.make +++ b/rules/portmap.make @@ -22,7 +22,7 @@ PORTMAP_VERSION := 6.0 PORTMAP_MD5 := ac108ab68bf0f34477f8317791aaf1ff PORTMAP := portmap_$(PORTMAP_VERSION) PORTMAP_SUFFIX := tgz -PORTMAP_URL := http://neil.brown.name/portmap/portmap-$(PORTMAP_VERSION).$(PORTMAP_SUFFIX) +PORTMAP_URL := http://fossies.org/unix/misc/portmap-$(PORTMAP_VERSION).$(PORTMAP_SUFFIX) PORTMAP_SOURCE := $(SRCDIR)/portmap-$(PORTMAP_VERSION).$(PORTMAP_SUFFIX) PORTMAP_DIR := $(BUILDDIR)/$(PORTMAP) diff --git a/rules/pre/kernel.make b/rules/pre/kernel.make index 7a28510..b5f8092 100644 --- a/rules/pre/kernel.make +++ b/rules/pre/kernel.make @@ -36,15 +36,15 @@ KERNEL_HEADERS_DIR := $(PTXDIST_SYSROOT_TARGET)/kernel-headers KERNEL_HEADERS_INCLUDE_DIR := $(KERNEL_HEADERS_DIR)/include kernel/url = \ + $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).x/$($(1)).$($(1)_SUFFIX)) \ + $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).x/testing/$($(1)).$($(1)_SUFFIX)) \ + $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).x/testing/v$(call kernel-major,$(1)).$(call kernel-minor,$(1))/$($(1)).$($(1)_SUFFIX)) \ + $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).x/longterm/v$(call kernel-major,$(1)).$(call kernel-minor,$(1))/$($(1)).$($(1)_SUFFIX)) \ + \ $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).$(call kernel-minor,$(1))/$($(1)).$($(1)_SUFFIX)) \ $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).$(call kernel-minor,$(1))/testing/$($(1)).$($(1)_SUFFIX)) \ $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).$(call kernel-minor,$(1))/testing/v$(call kernel-major,$(1)).$(call kernel-minor,$(1)).$(call kernel-micro,$(1))/$($(1)).$($(1)_SUFFIX)) \ $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).$(call kernel-minor,$(1))/longterm/v$(call kernel-major,$(1)).$(call kernel-minor,$(1)).$(call kernel-micro,$(1))/$($(1)).$($(1)_SUFFIX)) \ - \ - $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).x/$($(1)).$($(1)_SUFFIX)) \ - $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).x/testing/$($(1)).$($(1)_SUFFIX)) \ - $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).x/testing/v$(call kernel-major,$(1)).$(call kernel-minor,$(1))/$($(1)).$($(1)_SUFFIX)) \ - $(call ptx/mirror, KERNEL, kernel/v$(call kernel-major,$(1)).x/longterm/v$(call kernel-major,$(1)).$(call kernel-minor,$(1))/$($(1)).$($(1)_SUFFIX)) kernel-url = \ $(call kernel/url,$(strip $(1))) diff --git a/rules/pyside.make b/rules/pyside.make index b72e9cb..a47a76a 100644 --- a/rules/pyside.make +++ b/rules/pyside.make @@ -52,8 +52,8 @@ $(STATEDIR)/pyside.targetinstall: @$(call install_lib, pyside, 0, 0, 0644, \ libpyside-python$(PYTHON_MAJORMINOR)) @$(call install_tree, pyside, 0, 0, \ - $(PYSIDE_PKGDIR)/usr/lib/python2.6/site-packages/PySide, \ - /usr/lib/python2.6/site-packages/PySide) + $(PYSIDE_PKGDIR)/usr/lib/python$(PYTHON_MAJORMINOR)/site-packages/PySide, \ + /usr/lib/python$(PYTHON_MAJORMINOR)/site-packages/PySide) @$(call install_finish, pyside) diff --git a/rules/python.make b/rules/python.make index 1b9dc14..5b52058 100644 --- a/rules/python.make +++ b/rules/python.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_PYTHON) += python # # Paths and names # -PYTHON_VERSION := 2.6.6 -PYTHON_MD5 := cf4e6881bb84a7ce6089e4a307f71f14 +PYTHON_VERSION := 2.7.5 +PYTHON_MD5 := 6334b666b7ff2038c761d7b27ba699c1 PYTHON_MAJORMINOR := $(basename $(PYTHON_VERSION)) PYTHON_SITEPACKAGES := /usr/lib/python$(PYTHON_MAJORMINOR)/site-packages PYTHON := Python-$(PYTHON_VERSION) @@ -36,16 +36,20 @@ CROSS_PYTHON := $(PTXCONF_SYSROOT_CROSS)/bin/python$(PYTHON_MAJORMINOR) # ---------------------------------------------------------------------------- PYTHON_PATH := PATH=$(CROSS_PATH) -PYTHON_ENV := \ +PYTHON_CONF_ENV := \ $(CROSS_ENV) \ - PYTHON_FOR_BUILD=$(PTXCONF_SYSROOT_HOST)/bin/python$(PYTHON_MAJORMINOR) \ + PYTHON_FOR_BUILD=$(PTXCONF_SYSROOT_CROSS)/bin/build-python \ ac_sys_system=Linux \ ac_sys_release=2 \ MACHDEP=linux2 \ ac_cv_have_chflags=no \ ac_cv_have_lchflags=no \ - ac_cv_py_format_size_t=yes \ - ac_cv_broken_sem_getvalue=no + ac_cv_have_size_t_format=yes \ + ac_cv_broken_sem_getvalue=no \ + ac_cv_buggy_getaddrinfo=no \ + ac_cv_file__dev_ptmx=yes \ + ac_cv_file__dev_ptc=no \ + ac_cv_have_long_long_format=yes PYTHON_BINCONFIG_GLOB := "" @@ -62,7 +66,34 @@ PYTHON_AUTOCONF := \ --with-wctype-functions \ --without-doc-strings -PYTHON_MAKEVARS := \ +PYTHON_BUILD_PYTHONPATH := \ + $(PTXCONF_SYSROOT_HOST)/lib/python$(PYTHON_MAJORMINOR)/lib-dynload \ + $(PYTHON_DIR)/build/lib.linux2-$(PTXCONF_ARCH_STRING)-$(PYTHON_MAJORMINOR) \ + $(PYTHON_DIR)/Lib \ + $(PYTHON_DIR)/Lib/plat-linux2 + +$(STATEDIR)/python.prepare: + @$(call targetinfo) + + @rm -f $(PTXCONF_SYSROOT_CROSS)/bin/{link,build}-python + @ln -s $(PTXCONF_SYSROOT_HOST)/bin/python$(PYTHON_MAJORMINOR) \ + $(PTXCONF_SYSROOT_CROSS)/bin/link-python + @echo '#!/bin/sh' >> $(PTXCONF_SYSROOT_CROSS)/bin/build-python + @echo '' >> $(PTXCONF_SYSROOT_CROSS)/bin/build-python + @echo '_PYTHON_PROJECT_BASE="$(PYTHON_DIR)"' >> $(PTXCONF_SYSROOT_CROSS)/bin/build-python + @echo '_PYTHON_HOST_PLATFORM=linux2-$(PTXCONF_ARCH_STRING)' >> $(PTXCONF_SYSROOT_CROSS)/bin/build-python + @echo 'PYTHONPATH=$(subst $(space),:,$(PYTHON_BUILD_PYTHONPATH))' \ + >> $(PTXCONF_SYSROOT_CROSS)/bin/build-python + @echo 'export _PYTHON_PROJECT_BASE _PYTHON_HOST_PLATFORM PYTHONPATH' \ + >> $(PTXCONF_SYSROOT_CROSS)/bin/build-python + @echo '' >> $(PTXCONF_SYSROOT_CROSS)/bin/build-python + @echo 'exec $(PTXCONF_SYSROOT_CROSS)/bin/link-python "$${@}"' >> $(PTXCONF_SYSROOT_CROSS)/bin/build-python + @chmod a+x $(PTXCONF_SYSROOT_CROSS)/bin/build-python + + @$(call world/prepare, PYTHON) + @$(call touch) + +PYTHON_MAKE_OPT := \ PGEN_FOR_BUILD=$(PTXCONF_SYSROOT_HOST)/bin/pgen # ---------------------------------------------------------------------------- @@ -72,13 +103,16 @@ PYTHON_MAKEVARS := \ $(STATEDIR)/python.install: @$(call targetinfo) @$(call install, PYTHON) - @cp "$(PYTHON_DIR)/cross-python-wrapper" "$(PYTHON_PKGDIR)/usr/bin/" @sed -i \ -e "s:$(SYSROOT):@SYSROOT@:g" \ -e "s:$(PTXCONF_SYSROOT_HOST):@SYSROOT_HOST@:g" \ $(PYTHON_PKGDIR)/usr/lib/python$(PYTHON_MAJORMINOR)/config/Makefile @$(call touch) +PYTHON_PYTHONPATH := \ + $(SYSROOT)/usr/lib/python$(PYTHON_MAJORMINOR) \ + $(SYSROOT)/usr/lib/python$(PYTHON_MAJORMINOR)/plat-linux2 \ + $(PTXCONF_SYSROOT_HOST)/lib/python$(PYTHON_MAJORMINOR)/lib-dynload $(STATEDIR)/python.install.post: @$(call targetinfo) @@ -86,25 +120,18 @@ $(STATEDIR)/python.install.post: -e "s:@SYSROOT@:$(SYSROOT):g" \ -e "s:@SYSROOT_HOST@:$(PTXCONF_SYSROOT_HOST):g" \ $(PYTHON_PKGDIR)/usr/lib/python$(PYTHON_MAJORMINOR)/config/Makefile + @$(call world/install.post, PYTHON) @rm -f "$(CROSS_PYTHON)" - @echo '#!/bin/sh' >> "$(CROSS_PYTHON)" - @echo '' >> "$(CROSS_PYTHON)" - @echo 'prefix="/usr"' >> "$(CROSS_PYTHON)" - @echo 'exec_prefix="$${prefix}"' >> "$(CROSS_PYTHON)" - @echo '' >> "$(CROSS_PYTHON)" - @echo 'CROSS_COMPILING=yes' >> "$(CROSS_PYTHON)" - @echo '_python_sysroot="$(SYSROOT)"' >> "$(CROSS_PYTHON)" - @echo '_python_prefix="$${prefix}"' >> "$(CROSS_PYTHON)" - @echo '_python_exec_prefix="$${exec_prefix}"' >> "$(CROSS_PYTHON)" - @echo '' >> "$(CROSS_PYTHON)" - @echo 'export CROSS_COMPILING _python_sysroot _python_prefix _python_exec_prefix' \ - >> "$(CROSS_PYTHON)" - @echo '' >> "$(CROSS_PYTHON)" + @echo '#!/bin/sh' >> "$(CROSS_PYTHON)" + @echo '' >> "$(CROSS_PYTHON)" + @echo 'PYTHONHOME=$(SYSROOT)/usr' >> "$(CROSS_PYTHON)" + @echo '_PYTHON_HOST_PLATFORM=linux2-$(PTXCONF_ARCH_STRING)' >> "$(CROSS_PYTHON)" + @echo 'PYTHONPATH=$(subst $(space),:,$(PYTHON_PYTHONPATH))' >> "$(CROSS_PYTHON)" + @echo 'export _PYTHON_HOST_PLATFORM PYTHONPATH PYTHONHOME' >> "$(CROSS_PYTHON)" + @echo '' >> "$(CROSS_PYTHON)" @echo 'exec $(PTXCONF_SYSROOT_HOST)/bin/python$(PYTHON_MAJORMINOR) "$${@}"' \ - >> "$(CROSS_PYTHON)" - -# @cp "$(PYTHON_PKGDIR)/usr/bin/cross-python-wrapper" "$(CROSS_PYTHON)" + >> "$(CROSS_PYTHON)" @chmod a+x "$(CROSS_PYTHON)" @echo "#!/bin/sh" \ diff --git a/rules/qt4-demos.in b/rules/qt4-demos.in index 5399bcb..ffeacc5 100644 --- a/rules/qt4-demos.in +++ b/rules/qt4-demos.in @@ -38,6 +38,7 @@ config QT4_DEMOS_BOXES config QT4_DEMOS_BROWSER bool prompt "browser" + depends on QT4_BUILD_SVG depends on QT4_BUILD_WEBKIT depends on QT4_BUILD_GUI depends on QT4_BUILD_NETWORK diff --git a/rules/qt4.make b/rules/qt4.make index 95712a7..eca820b 100644 --- a/rules/qt4.make +++ b/rules/qt4.make @@ -17,11 +17,11 @@ PACKAGES-$(PTXCONF_QT4) += qt4 # # Paths and names # -QT4_VERSION := 4.8.4 -QT4_MD5 := 89c5ecba180cae74c66260ac732dc5cb +QT4_VERSION := 4.8.5 +QT4_MD5 := 1864987bdbb2f58f8ae8b350dfdbe133 QT4 := qt-everywhere-opensource-src-$(QT4_VERSION) QT4_SUFFIX := tar.gz -QT4_URL := http://releases.qt-project.org/qt4/source/$(QT4).$(QT4_SUFFIX) +QT4_URL := http://download.qt-project.org/official_releases/qt/4.8/$(QT4_VERSION)/$(QT4).$(QT4_SUFFIX) QT4_SOURCE := $(SRCDIR)/$(QT4).$(QT4_SUFFIX) QT4_DIR := $(BUILDDIR)/$(QT4) QT4_BUILD_OOT := YES @@ -553,12 +553,14 @@ ifdef PTXCONF_QT4_BUILD_SVG /usr/plugins/iconengines/libqsvgicon.$(QT4_PLUGIN_EXT)) endif -ifndef PTXCONF_QT4_BUILD_NETWORK +ifdef PTXCONF_QT4_BUILD_NETWORK @$(call install_copy, qt4, 0, 0, 0644, -, \ /usr/plugins/bearer/libqgenericbearer.$(QT4_PLUGIN_EXT)) +ifdef PTXCONF_QT4_DBUS @$(call install_copy, qt4, 0, 0, 0644, -, \ /usr/plugins/bearer/libqnmbearer.$(QT4_PLUGIN_EXT)) endif +endif ifdef PTXCONF_QT4_BUILD_PHONON @$(call install_copy, qt4, 0, 0, 0644, -, \ /usr/plugins/phonon_backend/libphonon_gstreamer.$(QT4_PLUGIN_EXT)) diff --git a/rules/rootfs.in b/rules/rootfs.in index c36a79a..86d57cb 100644 --- a/rules/rootfs.in +++ b/rules/rootfs.in @@ -330,7 +330,7 @@ config ROOTFS_MTAB_LINK_VAR_FAKE_OVERLAYFS bool depends on ROOTFS_MTAB_LINK_VAR select FAKE_OVERLAYFS - select FAKE_OVERLAYFS_VAR_TMP + select FAKE_OVERLAYFS_VAR_TMP if !FAKE_OVERLAYFS_VAR prompt "use fake-overlayfs to create /var/tmp/mtab" config ROOTFS_HOSTNAME diff --git a/rules/rsync.in b/rules/rsync.in index efef569..e906041 100644 --- a/rules/rsync.in +++ b/rules/rsync.in @@ -3,6 +3,7 @@ menuconfig RSYNC tristate prompt "rsync " select GCCLIBS_GCC_S + select OPENSSH if RUNTIME select OPENSSH_SSH help rsync is a program that behaves in much the same way that rcp does, diff --git a/rules/rsync3.in b/rules/rsync3.in index f01f294..3781f50 100644 --- a/rules/rsync3.in +++ b/rules/rsync3.in @@ -2,6 +2,7 @@ menuconfig RSYNC3 tristate prompt "rsync v3 " + select OPENSSH if RUNTIME select OPENSSH_SSH select ACL if RSYNC3_ACL select ATTR if RSYNC3_ATTR diff --git a/rules/rt-tests.make b/rules/rt-tests.make index 1880beb..da7f7f0 100644 --- a/rules/rt-tests.make +++ b/rules/rt-tests.make @@ -19,11 +19,11 @@ PACKAGES-$(PTXCONF_RT_TESTS) += rt-tests # # Paths and names # -RT_TESTS_VERSION := 0.73 -RT_TESTS_MD5 := 98da46135f0a91c96cb7e5b27c7e3bb6 +RT_TESTS_VERSION := 0.85 +RT_TESTS_MD5 := f62f58c2f1d9c1ec37bafc73e40d42ad RT_TESTS_LICENSE := GPLv2, GPLv2+ RT_TESTS := rt-tests-$(RT_TESTS_VERSION) -RT_TESTS_SUFFIX := tar.bz2 +RT_TESTS_SUFFIX := tar.gz RT_TESTS_URL := $(call ptx/mirror, KERNEL, kernel/people/clrkwllms/rt-tests/$(RT_TESTS).$(RT_TESTS_SUFFIX)) RT_TESTS_SOURCE := $(SRCDIR)/$(RT_TESTS).$(RT_TESTS_SUFFIX) RT_TESTS_DIR := $(BUILDDIR)/$(RT_TESTS) @@ -33,7 +33,7 @@ RT_TESTS_DIR := $(BUILDDIR)/$(RT_TESTS) # ---------------------------------------------------------------------------- RT_TESTS_CONF_TOOL := NO -RT_TESTS_MAKE_OPT := $(CROSS_ENV_CC) prefix=/usr +RT_TESTS_MAKE_OPT := $(CROSS_ENV_CC) prefix=/usr NUMA=0 RT_TESTS_MAKE_ENV := $(CROSS_ENV_FLAGS) RT_TESTS_INSTALL_OPT := $(RT_TESTS_MAKE_OPT) install diff --git a/rules/rxtx.in b/rules/rxtx.in index 30962f5..2bc1d9f 100644 --- a/rules/rxtx.in +++ b/rules/rxtx.in @@ -2,6 +2,7 @@ config RXTX tristate prompt "rxtx" + select HOST_SYSTEM_JDK select LIBC_PTHREAD help RXTX is a native lib providing serial and parallel communication diff --git a/rules/rxtx.make b/rules/rxtx.make index ebdf6c6..b530b7f 100644 --- a/rules/rxtx.make +++ b/rules/rxtx.make @@ -13,14 +13,6 @@ # PACKAGES-$(PTXCONF_RXTX) += rxtx -ifdef PTXCONF_RXTX -ifeq ($(shell test -x $(PTXCONF_SETUP_JAVA_SDK)/bin/javac || echo no),no) - $(warning *** javac is mandatory to build rxtx) - $(warning *** please run 'ptxdist setup' and set the path to the java sdk) - $(error ) -endif -endif - # # Paths and names # diff --git a/rules/serdisplib.make b/rules/serdisplib.make index 47c335b..24b14ea 100644 --- a/rules/serdisplib.make +++ b/rules/serdisplib.make @@ -30,6 +30,10 @@ SERDISPLIB_LICENSE := GPL # Prepare # ---------------------------------------------------------------------------- +SERDISPLIB_CONF_ENV := \ + $(CROSS_ENV) \ + ac_cv_func_gdImageCreateTrueColor=no \ + ac_cv_func_SDL_SetVideoMode=no # # autoconf # diff --git a/rules/sqlite.make b/rules/sqlite.make index 7a624d0..a406157 100644 --- a/rules/sqlite.make +++ b/rules/sqlite.make @@ -20,8 +20,8 @@ PACKAGES-$(PTXCONF_SQLITE) += sqlite # # Paths and names # -SQLITE_VERSION := 3071300 -SQLITE_MD5 := c97df403e8a3d5b67bb408fcd6aabd8e +SQLITE_VERSION := 3071502 +SQLITE_MD5 := bcb0ab0b5b30116b2531cfeef3c861b4 SQLITE := sqlite-autoconf-$(SQLITE_VERSION) SQLITE_SUFFIX := tar.gz SQLITE_URL := http://www.sqlite.org/$(SQLITE).$(SQLITE_SUFFIX) diff --git a/rules/strongswan.in b/rules/strongswan.in new file mode 100644 index 0000000..5402ffb --- /dev/null +++ b/rules/strongswan.in @@ -0,0 +1,46 @@ +## SECTION=networking + +menuconfig STRONGSWAN + bool + prompt "strongswan " + select LIBGMP + select LIBCURL if STRONGSWAN_LIBCURL + help + strongSwan is a complete IPsec implementation. + Please keep in mind to configure the kernel accordingly to fulfill + strongSwan's needs. See 'Required Kernel Modules' here: + http://wiki.strongswan.org/projects/strongswan/wiki/KernelModules + +if STRONGSWAN + +config STRONGSWAN_LIBCURL + bool + default y + prompt "CURL fetcher plugin to fetch files" + help + If you intend to dynamically fetch Certificate Revocation Lists + (CRLs) from an HTTP server or as an alternative want to use + the Online Certificate Status Protocol (OCSP) say yes. + +config STRONGSWAN_AFALG + bool + default y + prompt "AF_ALG crypto interface to Linux Crypto API" + help + Linux 2.6.38 introduced the AF_ALG Crypto API which makes the + crypto algorithms of the kernel available in userland. + If your strongswan configuration depends on this, be sure to + enable the appropriate crypto algorithm in your kernel. + For test configurations see af-alg-* categories here: + http://www.strongswan.org/uml/testresults4/index.html + For a list of cipher suite keywords see: + http://wiki.strongswan.org/projects/strongswan/wiki/IKEv2CipherSuites + http://wiki.strongswan.org/projects/strongswan/wiki/IKEv1CipherSuites + +config STRONGSWAN_SYSTEMD_UNIT + bool + default y + depends on SYSTEMD + prompt "install systemd service file" + +endif diff --git a/rules/strongswan.make b/rules/strongswan.make new file mode 100644 index 0000000..6401832 --- /dev/null +++ b/rules/strongswan.make @@ -0,0 +1,265 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Christoph Fritz +# +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_STRONGSWAN) += strongswan + +# +# Paths and names +# +STRONGSWAN_VERSION := 5.0.4 +STRONGSWAN_MD5 := 0ab0397b44b197febfd0f89148344035 +STRONGSWAN := strongswan-$(STRONGSWAN_VERSION) +STRONGSWAN_SUFFIX := tar.bz2 +STRONGSWAN_URL := http://download.strongswan.org/$(STRONGSWAN).$(STRONGSWAN_SUFFIX) +STRONGSWAN_SOURCE := $(SRCDIR)/$(STRONGSWAN).$(STRONGSWAN_SUFFIX) +STRONGSWAN_DIR := $(BUILDDIR)/$(STRONGSWAN) +STRONGSWAN_LICENSE := GPL + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +STRONGSWAN_CONF_TOOL := autoconf +STRONGSWAN_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --$(call ptx/endis, PTXCONF_STRONGSWAN_LIBCURL)-curl \ + --disable-unbound \ + --disable-soup \ + --disable-ldap \ + --enable-aes \ + --enable-des \ + --disable-blowfish \ + --disable-md4 \ + --enable-md5 \ + --enable-sha1 \ + --enable-sha2 \ + --enable-fips-prf \ + --enable-gmp \ + --disable-rdrand \ + --enable-random \ + --enable-nonce \ + --enable-x509 \ + --enable-revocation \ + --enable-constraints \ + --enable-pubkey \ + --enable-pkcs1 \ + --enable-pkcs7 \ + --enable-pkcs8 \ + --enable-pgp \ + --enable-dnskey \ + --disable-ipseckey \ + --enable-pem \ + --enable-hmac \ + --enable-cmac \ + --enable-xcbc \ + --$(call ptx/endis, PTXCONF_STRONGSWAN_AFALG)-af-alg \ + --disable-test-vectors \ + --disable-mysql \ + --disable-sqlite \ + --enable-stroke \ + --disable-medsrv \ + --disable-medcli \ + --disable-smp \ + --disable-sql \ + --disable-leak-detective \ + --disable-lock-profiler \ + --disable-unit-tester \ + --disable-load-tester \ + --disable-eap-sim \ + --disable-eap-sim-file \ + --disable-eap-sim-pcsc \ + --disable-eap-aka \ + --disable-eap-aka-3gpp2 \ + --disable-eap-simaka-sql \ + --disable-eap-simaka-pseudonym \ + --disable-eap-simaka-reauth \ + --disable-eap-identity \ + --disable-eap-md5 \ + --disable-eap-gtc \ + --disable-eap-mschapv2 \ + --disable-eap-tls \ + --disable-eap-ttls \ + --disable-eap-peap \ + --disable-eap-tnc \ + --disable-eap-dynamic \ + --disable-eap-radius \ + --enable-xauth-generic \ + --disable-xauth-eap \ + --disable-xauth-pam \ + --disable-xauth-noauth \ + --disable-tnc-ifmap \ + --disable-tnc-pdp \ + --disable-tnc-imc \ + --disable-tnc-imv \ + --disable-tnccs-11 \ + --disable-tnccs-20 \ + --disable-tnccs-dynamic \ + --disable-imc-test \ + --disable-imv-test \ + --disable-imc-scanner \ + --disable-imv-scanner \ + --disable-imc-os \ + --disable-imv-os \ + --disable-imc-attestation \ + --disable-imv-attestation \ + --enable-kernel-netlink \ + --disable-kernel-pfkey \ + --disable-kernel-pfroute \ + --disable-kernel-klips \ + --disable-libipsec \ + --enable-socket-default \ + --disable-socket-dynamic \ + --disable-farp \ + --disable-dumm \ + --disable-fast \ + --disable-manager \ + --disable-mediation \ + --disable-integrity-test \ + --enable-load-warning \ + --enable-ikev1 \ + --enable-ikev2 \ + --enable-charon \ + --enable-tools \ + --enable-scripts \ + --disable-conftest \ + --enable-updown \ + --enable-attr \ + --disable-attr-sql \ + --disable-dhcp \ + --enable-resolve \ + --disable-padlock \ + --disable-openssl \ + --disable-gcrypt \ + --disable-agent \ + --disable-pkcs11 \ + --disable-ctr \ + --disable-ccm \ + --disable-gcm \ + --disable-addrblock \ + --disable-unity \ + --disable-uci \ + --disable-android-dns \ + --disable-android-log \ + --disable-maemo \ + --disable-nm \ + --disable-ha \ + --disable-whitelist \ + --disable-lookip \ + --disable-error-notify \ + --disable-certexpire \ + --disable-systime-fix \ + --disable-led \ + --disable-duplicheck \ + --disable-coupling \ + --disable-radattr \ + --disable-vstr \ + --disable-monolithic \ + --disable-bfd-backtraces \ + --disable-unit-tests \ + --disable-tkm \ + --disable-defaults \ + --enable-dependency-tracking \ + --enable-shared \ + --disable-static \ + --enable-fast-install \ + --enable-libtool-lock \ + --with-ipseclibdir=/usr/lib \ + --with-systemdsystemunitdir=/lib/systemd/system + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +STRONGSWAN_PLUGINS := \ + libstrongswan-aes.so \ + libstrongswan-attr.so \ + libstrongswan-cmac.so \ + libstrongswan-constraints.so \ + libstrongswan-des.so \ + libstrongswan-dnskey.so \ + libstrongswan-fips-prf.so \ + libstrongswan-gmp.so \ + libstrongswan-hmac.so \ + libstrongswan-kernel-netlink.so \ + libstrongswan-md5.so \ + libstrongswan-nonce.so \ + libstrongswan-pem.so \ + libstrongswan-pgp.so \ + libstrongswan-pkcs1.so \ + libstrongswan-pkcs7.so \ + libstrongswan-pkcs8.so \ + libstrongswan-pubkey.so \ + libstrongswan-random.so \ + libstrongswan-resolve.so \ + libstrongswan-revocation.so \ + libstrongswan-sha1.so \ + libstrongswan-sha2.so \ + libstrongswan-socket-default.so \ + libstrongswan-stroke.so \ + libstrongswan-updown.so \ + libstrongswan-x509.so \ + libstrongswan-xauth-generic.so \ + libstrongswan-xcbc.so + +ifdef PTXCONF_STRONGSWAN_LIBCUR + STRONGSWAN_PLUGINS += libstrongswan-curl.so +endif +ifdef PTXCONF_STRONGSWAN_AFALG + STRONGSWAN_PLUGINS += libstrongswan-af-alg.so +endif + +$(STATEDIR)/strongswan.targetinstall: + @$(call targetinfo) + + @$(call install_init, strongswan) + @$(call install_fixup, strongswan,PRIORITY,optional) + @$(call install_fixup, strongswan,SECTION,base) + @$(call install_fixup, strongswan,AUTHOR,"Christoph Fritz ") + @$(call install_fixup, strongswan,DESCRIPTION,missing) + + @$(call install_alternative, strongswan, 0, 0, 0644, /etc/strongswan.conf) + + @$(call install_copy, strongswan, 0, 0, 0755, -, /usr/sbin/ipsec) + + @$(call install_tree, strongswan, 0, 0, -, /usr/libexec/ipsec) + + @$(call install_lib, strongswan, 0, 0, 0644, libcharon) + @$(call install_lib, strongswan, 0, 0, 0644, libhydra) + @$(call install_lib, strongswan, 0, 0, 0644, libstrongswan) + + @$(foreach plugin, $(STRONGSWAN_PLUGINS), \ + $(call install_copy, strongswan, 0, 0, 0644, -, \ + /usr/lib/plugins/$(plugin));) + +ifdef PTXCONF_STRONGSWAN_SYSTEMD_UNIT + @$(call install_alternative, strongswan, 0, 0, 0644, \ + /lib/systemd/system/strongswan.service) + @$(call install_link, strongswan, ../strongswan.service, \ + /lib/systemd/system/multi-user.target.wants/strongswan.service) +endif + + @$(call install_copy, strongswan, 0, 0, 0644, /etc/ipsec.d/aacerts) + @$(call install_copy, strongswan, 0, 0, 0644, /etc/ipsec.d/acerts) + @$(call install_copy, strongswan, 0, 0, 0644, /etc/ipsec.d/cacerts) + @$(call install_copy, strongswan, 0, 0, 0644, /etc/ipsec.d/certs) + @$(call install_copy, strongswan, 0, 0, 0644, /etc/ipsec.d/crls) + @$(call install_copy, strongswan, 0, 0, 0644, /etc/ipsec.d/ocspcerts) + @$(call install_copy, strongswan, 0, 0, 0600, /etc/ipsec.d/private) + @$(call install_copy, strongswan, 0, 0, 0644, /etc/ipsec.d/reqs) + + @$(call install_finish, strongswan) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/systemd.in b/rules/systemd.in index a5d77e8..d2a43e0 100644 --- a/rules/systemd.in +++ b/rules/systemd.in @@ -13,7 +13,6 @@ menuconfig SYSTEMD select UDEV if RUNTIME select UDEV_LIBUDEV select MACHINE_ID if RUNTIME - select DBUS_PYTHON if SYSTEMD_ANALYZE && RUNTIME select TCPWRAPPER if SYSTEMD_TCPWRAP select XZ if SYSTEMD_XZ select LIBSELINUX if GLOBAL_SELINUX @@ -22,8 +21,7 @@ menuconfig SYSTEMD select LIBKMOD select LIBBLKID select GLIB if UDEV_LIBGUDEV - select PCIUTILS if UDEV_PERSISTENT_PCI && RUNTIME - select USBUTILS if UDEV_PERSISTENT_USB && RUNTIME + select HOST_SYSTEMD if UDEV_HWDB prompt "systemd " help systemd is a system and session manager for Linux, compatible with SysV @@ -61,11 +59,5 @@ config SYSTEMD_DISABLE_RANDOM_SEED the random seed is not possible. Warning: enabling this option may be insecure. -config SYSTEMD_ANALYZE - bool - prompt "systemd-analyze" - help - Install the systemd-analyze tool. This feature requires python. - endif diff --git a/rules/systemd.make b/rules/systemd.make index 84ad633..60f4e90 100644 --- a/rules/systemd.make +++ b/rules/systemd.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_SYSTEMD) += systemd # # Paths and names # -SYSTEMD_VERSION := 195 -SYSTEMD_MD5 := 38e8c8144e7e6e5bc3ce32eb4260e680 +SYSTEMD_VERSION := 204 +SYSTEMD_MD5 := a07619bb19f48164fbf0761d12fd39a8 SYSTEMD := systemd-$(SYSTEMD_VERSION) SYSTEMD_SUFFIX := tar.xz SYSTEMD_URL := http://www.freedesktop.org/software/systemd/$(SYSTEMD).$(SYSTEMD_SUFFIX) @@ -35,11 +35,6 @@ ifneq ($(PTXCONF_ARCH_X86)$(PTXCONF_ARCH_PPC),) SYSTEMD_WRAPPER_BLACKLIST := TARGET_HARDEN_PIE endif -# python is used for the journal python bindings, which are not installed -SYSTEMD_CONF_ENV := \ - $(CROSS_ENV) \ - ac_cv_path_PYTHON=: - # # autoconf # @@ -54,7 +49,10 @@ SYSTEMD_CONF_OPT := \ --disable-gtk-doc-html \ --disable-gtk-doc-pdf \ --disable-introspection \ + --enable-kmod \ + --enable-blkid \ --disable-ima \ + --disable-chkconfig \ $(GLOBAL_SELINUX_OPTION) \ --$(call ptx/endis,PTXCONF_SYSTEMD_XZ)-xz \ --$(call ptx/endis,PTXCONF_SYSTEMD_TCPWRAP)-tcpwrap \ @@ -69,6 +67,7 @@ SYSTEMD_CONF_OPT := \ --enable-binfmt \ --$(call ptx/endis,PTXCONF_SYSTEMD_VCONSOLE)-vconsole \ --enable-readahead \ + --enable-bootchart \ --enable-quotacheck \ --$(call ptx/disen,PTXCONF_SYSTEMD_DISABLE_RANDOM_SEED)-randomseed \ --enable-logind \ @@ -76,15 +75,18 @@ SYSTEMD_CONF_OPT := \ --enable-timedated \ --enable-localed \ --disable-coredump \ + --enable-polkit \ + --disable-efi \ + --enable-myhostname \ --$(call ptx/endis,PTXCONF_UDEV_LIBGUDEV)-gudev \ --$(call ptx/endis,PTXCONF_UDEV_KEYMAPS)-keymap \ --disable-manpages \ --enable-split-usr \ - --with-usb-ids-path=/usr/share/usb.ids \ - --with-pci-ids-path=/usr/share/pci.ids$(call ptx/ifdef, PTXCONF_PCIUTILS_COMPRESS,.gz,) \ - --with-distro=other \ + --disable-tests \ + --with-firmware-path=/lib/firmware \ --with-sysvinit-path="" \ - --with-sysvrcd-path="" \ + --with-sysvrcnd-path="" \ + --without-python \ --with-dbuspolicydir=/etc/dbus-1/system.d \ --with-dbussessionservicedir=/usr/share/dbus-1/services \ --with-dbussystemservicedir=/usr/share/dbus-1/system-services \ @@ -111,6 +113,12 @@ $(STATEDIR)/systemd.install: @$(call targetinfo) @$(call world/install, SYSTEMD) @ln -sf multi-user.target "$(SYSTEMD_PKGDIR)/lib/systemd/system/default.target" +ifdef PTXCONF_UDEV_HWDB + @udevadm hwdb --update --root $(SYSTEMD_PKGDIR) +endif +ifndef PTXCONF_SYSTEMD_VCONSOLE + @rm -v $(SYSTEMD_PKGDIR)/etc/systemd/system/getty.target.wants/getty@tty1.service +endif @$(call touch) # ---------------------------------------------------------------------------- @@ -120,7 +128,9 @@ $(STATEDIR)/systemd.install: SYSTEMD_HELPER := \ systemd \ systemd-ac-power \ + systemd-activate \ systemd-binfmt \ + systemd-bootchart \ systemd-cgroups-agent \ systemd-fsck \ systemd-hostnamed \ @@ -131,6 +141,7 @@ SYSTEMD_HELPER := \ systemd-modules-load \ systemd-multi-seat-x \ systemd-quotacheck \ + $(call ptx/ifdef, PTXCONF_SYSTEMD_DISABLE_RANDOM_SEED,,systemd-random-seed) \ systemd-readahead \ systemd-remount-fs \ systemd-reply-password \ @@ -164,6 +175,8 @@ $(STATEDIR)/systemd.targetinstall: @$(call install_lib, systemd, 0, 0, 0644, libsystemd-journal) @$(call install_lib, systemd, 0, 0, 0644, libsystemd-login) + @$(call install_lib, systemd, 0, 0, 0644, libnss_myhostname) + # # daemon + tools @$(call install_copy, systemd, 0, 0, 0755, -, /bin/systemctl) @$(call install_copy, systemd, 0, 0, 0755, -, /bin/journalctl) @@ -174,6 +187,9 @@ $(STATEDIR)/systemd.targetinstall: @$(call install_copy, systemd, 0, 0, 0755, -, /bin/systemd-tmpfiles) @$(call install_copy, systemd, 0, 0, 0755, -, /bin/systemd-notify) @$(call install_copy, systemd, 0, 0, 0755, -, /bin/systemd-tty-ask-password-agent) + @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/hostnamectl) + @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/localectl) + @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/timedatectl) @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/systemd-cat) @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/systemd-cgls) @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/systemd-cgtop) @@ -181,9 +197,7 @@ $(STATEDIR)/systemd.targetinstall: @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/systemd-detect-virt) @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/systemd-nspawn) @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/systemd-stdio-bridge) -ifdef PTXCONF_SYSTEMD_ANALYZE @$(call install_copy, systemd, 0, 0, 0755, -, /usr/bin/systemd-analyze) -endif @$(call install_tree, systemd, 0, 0, -, /lib/systemd/system-generators/) @$(foreach helper, $(SYSTEMD_HELPER), \ @@ -201,18 +215,22 @@ endif # # configuration @$(call install_alternative, systemd, 0, 0, 0644, \ /etc/systemd/system.conf) + @$(call install_alternative, systemd, 0, 0, 0644, \ + /etc/systemd/bootchart.conf) @$(call install_alternative, systemd, 0, 0, 0644, \ /etc/systemd/journald.conf) @$(call install_alternative, systemd, 0, 0, 0644, \ /etc/systemd/logind.conf) @$(call install_tree, systemd, 0, 0, -, /etc/systemd/system/) @$(call install_tree, systemd, 0, 0, -, /usr/lib/tmpfiles.d/) + @$(call install_copy, systemd, 0, 0, 0644, -, /lib/udev/rules.d/50-firmware.rules) @$(call install_copy, systemd, 0, 0, 0644, -, /lib/udev/rules.d/99-systemd.rules) @$(call install_tree, systemd, 0, 0, -, /etc/dbus-1/system.d/) @$(call install_tree, systemd, 0, 0, -, /usr/share/polkit-1/actions/) @$(call install_tree, systemd, 0, 0, -, /usr/share/dbus-1/services/) @$(call install_tree, systemd, 0, 0, -, /usr/share/dbus-1/system-services/) @$(call install_copy, systemd, 0, 0, 0644, -, /usr/share/systemd/kbd-model-map) + @$(call install_copy, systemd, 0, 0, 0644, -, /usr/lib/sysctl.d/50-default.conf) # # units @$(call install_tree, systemd, 0, 0, -, /lib/systemd/system/) diff --git a/rules/templates/template-barebox-make b/rules/templates/template-barebox-make index 23f00a6..7026d63 100644 --- a/rules/templates/template-barebox-make +++ b/rules/templates/template-barebox-make @@ -30,7 +30,7 @@ BAREBOX_@PACKAGE@_SOURCE := $(SRCDIR)/$(BAREBOX_@PACKAGE@).$(BAREBOX_@PACKAGE@_S # Prepare # ---------------------------------------------------------------------------- -BAREBOX_@PACKAGE@_CONF_ENV := KCONFIG_NOTIMESTAMP=1 HOST_EXTRACFLAGS="$(HOST_CPPFLAGS)" +BAREBOX_@PACKAGE@_CONF_ENV := KCONFIG_NOTIMESTAMP=1 BAREBOX_@PACKAGE@_CONF_OPT := $(call barebox-opts, BAREBOX_@PACKAGE@) BAREBOX_@PACKAGE@_MAKE_ENV := $(BAREBOX_@PACKAGE@_CONF_ENV) diff --git a/rules/templates/template-kernel-make b/rules/templates/template-kernel-make index 008c347..06c0927 100644 --- a/rules/templates/template-kernel-make +++ b/rules/templates/template-kernel-make @@ -31,7 +31,7 @@ KERNEL_@PACKAGE@_SOURCE := $(SRCDIR)/$(KERNEL_@PACKAGE@).$(KERNEL_@PACKAGE@_SUF # ---------------------------------------------------------------------------- KERNEL_@PACKAGE@_PATH := PATH=$(CROSS_PATH) -KERNEL_@PACKAGE@_ENV := KCONFIG_NOTIMESTAMP=1 HOST_EXTRACFLAGS="$(HOST_CPPFLAGS)" +KERNEL_@PACKAGE@_ENV := KCONFIG_NOTIMESTAMP=1 KERNEL_@PACKAGE@_CONF_OPT := $(call kernel-opts, KERNEL_@PACKAGE@) KERNEL_@PACKAGE@_IMAGES := @image@ diff --git a/rules/tomoyo-tools.in b/rules/tomoyo-tools.in new file mode 100644 index 0000000..61aed38 --- /dev/null +++ b/rules/tomoyo-tools.in @@ -0,0 +1,8 @@ +## SECTION=security + +config TOMOYO_TOOLS + tristate + prompt "tomoyo-tools" + select NCURSES + help + TOMOYO Linux userspace tools for Linux kernels >=3.2 diff --git a/rules/tomoyo-tools.make b/rules/tomoyo-tools.make new file mode 100644 index 0000000..b40c450 --- /dev/null +++ b/rules/tomoyo-tools.make @@ -0,0 +1,88 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Bernhard Walle +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_TOMOYO_TOOLS) += tomoyo-tools + +# +# Paths and names +# +TOMOYO_TOOLS_VERSION := 2.5.0-20130406 +TOMOYO_TOOLS_MD5 := 8888f83fcb87823d714ff551e8680d0d +TOMOYO_TOOLS := tomoyo-tools-$(TOMOYO_TOOLS_VERSION) +TOMOYO_TOOLS_SUFFIX := tar.gz +TOMOYO_TOOLS_URL := http://sourceforge.jp/frs/redir.php?m=jaist&f=/tomoyo/53357/$(TOMOYO_TOOLS).$(TOMOYO_TOOLS_SUFFIX) +TOMOYO_TOOLS_SOURCE := $(SRCDIR)/$(TOMOYO_TOOLS).$(TOMOYO_TOOLS_SUFFIX) +TOMOYO_TOOLS_DIR := $(BUILDDIR)/tomoyo-tools +TOMOYO_TOOLS_LICENSE := GPL + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +TOMOYO_TOOLS_CONF_TOOL := NO +TOMOYO_TOOLS_MAKE_ENV := $(CROSS_ENV) INSTALLDIR=$(TOMOYO_TOOLS_PKGDIR) + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +TOMOYO_TOOLS_SBIN_PROGS := \ + tomoyo-auditd \ + tomoyo-checkpolicy \ + tomoyo-diffpolicy \ + tomoyo-domainmatch \ + tomoyo-editpolicy \ + tomoyo-findtemp \ + tomoyo-loadpolicy \ + tomoyo-notifyd \ + tomoyo-patternize \ + tomoyo-pstree \ + tomoyo-queryd \ + tomoyo-savepolicy \ + tomoyo-selectpolicy \ + tomoyo-setlevel \ + tomoyo-setprofile \ + tomoyo-sortpolicy + +TOMOYO_TOOLS_LIBEXEC_PROGS := \ + audit-exec-param \ + convert-audit-log \ + convert-exec-param \ + init_policy \ + tomoyo-editpolicy-agent + + +$(STATEDIR)/tomoyo-tools.targetinstall: + @$(call targetinfo) + + @$(call install_init, tomoyo-tools) + @$(call install_fixup, tomoyo-tools,PRIORITY,optional) + @$(call install_fixup, tomoyo-tools,SECTION,base) + @$(call install_fixup, tomoyo-tools,AUTHOR,"Bernhard Walle ") + @$(call install_fixup, tomoyo-tools,DESCRIPTION,missing) + + @$(call install_copy, tomoyo-tools, 0, 0, 0755, -, /sbin/tomoyo-init) + + @$(foreach prog, $(TOMOYO_TOOLS_SBIN_PROGS), \ + $(call install_copy, tomoyo-tools, 0, 0, 0755, -, /usr/sbin/$(prog));) + + @$(foreach prog, $(TOMOYO_TOOLS_LIBEXEC_PROGS), \ + $(call install_copy, tomoyo-tools, 0, 0, 0755, -, /usr/lib/tomoyo/$(prog));) + + @$(call install_lib, tomoyo-tools, 0, 0, 0644, libtomoyotools) + + @$(call install_finish, tomoyo-tools) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/tree.in b/rules/tree.in new file mode 100644 index 0000000..d513f04 --- /dev/null +++ b/rules/tree.in @@ -0,0 +1,9 @@ +## SECTION=shell_and_console + +config TREE + tristate + prompt "tree" + select GCCLIBS_GCC_S + help + A directory listing program displaying a depth indented list of + files. diff --git a/rules/tree.make b/rules/tree.make new file mode 100644 index 0000000..d862938 --- /dev/null +++ b/rules/tree.make @@ -0,0 +1,59 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Bernhard Walle +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_TREE) += tree + +# +# Paths and names +# +TREE_VERSION := 1.6.0 +TREE_MD5 := 04e967a3f4108d50cde3b4b0e89e970a +TREE := tree-$(TREE_VERSION) +TREE_SUFFIX := tgz +TREE_URL := http://mama.indstate.edu/users/ice/tree/src/$(TREE).$(TREE_SUFFIX) +TREE_SOURCE := $(SRCDIR)/$(TREE).$(TREE_SUFFIX) +TREE_DIR := $(BUILDDIR)/$(TREE) +TREE_LICENSE := GPL + +# ---------------------------------------------------------------------------- +# Compile +# ---------------------------------------------------------------------------- + +TREE_MAKE_OPT := \ + $(CROSS_ENV_CC) \ + $(CROSS_ENV_CPP) \ + $(CROSS_ENV_AS) + +TREE_INSTALL_OPT := \ + prefix=$(TREE_PKGDIR)/usr install + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/tree.targetinstall: + @$(call targetinfo) + + @$(call install_init, tree) + @$(call install_fixup, tree,PRIORITY,optional) + @$(call install_fixup, tree,SECTION,base) + @$(call install_fixup, tree,AUTHOR,"Bernhard Walle ") + @$(call install_fixup, tree,DESCRIPTION,missing) + + @$(call install_copy, tree, 0, 0, 0755, -, /usr/bin/tree) + + @$(call install_finish, tree) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/u-boot-tools.make b/rules/u-boot-tools.make index 937a49d..29a912c 100644 --- a/rules/u-boot-tools.make +++ b/rules/u-boot-tools.make @@ -47,8 +47,10 @@ $(STATEDIR)/u-boot-tools.install: @$(call targetinfo) install -D $(U_BOOT_TOOLS_DIR)/tools/mkimage \ $(U_BOOT_TOOLS_PKGDIR)/usr/bin/mkimage +ifdef PTXCONF_U_BOOT_TOOLS_TOOL_ENV install -D $(U_BOOT_TOOLS_DIR)/tools/env/fw_printenv \ $(U_BOOT_TOOLS_PKGDIR)/usr/sbin/fw_printenv +endif @$(call touch) # ---------------------------------------------------------------------------- diff --git a/rules/udev.in b/rules/udev.in index 5f8a346..0cc686f 100644 --- a/rules/udev.in +++ b/rules/udev.in @@ -32,7 +32,7 @@ menuconfig UDEV if UDEV -if !SYSTEMD +if SYSTEMD = no menu "build options " @@ -90,6 +90,11 @@ config UDEV_KEYMAPS This will install the keymaps shipped with udev. These are mostly to map custom hardware's multimedia keys of various laptops +config UDEV_HWDB + bool + depends on SYSTEMD + prompt "install hardware database" + config UDEV_CUST_RULES bool prompt "install customized udev rules" @@ -137,7 +142,7 @@ config UDEV_PERSISTENT_EDD config UDEV_PERSISTENT_GENERATOR bool - depends on !SYSTEMD + depends on SYSTEMD = n prompt "cd / network generator" help This will generate udev-based persistent naming rules for @@ -146,10 +151,12 @@ config UDEV_PERSISTENT_GENERATOR config UDEV_PERSISTENT_PCI bool + depends on SYSTEMD = n prompt "pci" config UDEV_PERSISTENT_USB bool + depends on SYSTEMD = n prompt "usb" config UDEV_PERSISTENT_SCSI diff --git a/rules/udev.make b/rules/udev.make index 80c703f..dcdf79c 100644 --- a/rules/udev.make +++ b/rules/udev.make @@ -104,10 +104,12 @@ endif ifdef PTXCONF_SYSTEMD UDEV_RULES-y += \ + 64-btrfs.rules \ 70-power-switch.rules \ 70-uaccess.rules \ 71-seat.rules \ - 73-seat-late.rules + 73-seat-late.rules \ + 80-net-name-slot.rules endif @@ -173,6 +175,9 @@ $(STATEDIR)/udev.targetinstall: ifdef PTXCONF_UDEV_ETC_CONF @$(call install_alternative, udev, 0, 0, 0644, /etc/udev/udev.conf) endif +ifdef PTXCONF_UDEV_HWDB + @$(call install_copy, udev, 0, 0, 0644, -, /etc/udev/hwdb.bin) +endif ifdef PTXCONF_UDEV_LEGACY @$(call install_copy, udev, 0, 0, 0755, -, /sbin/udevd) @@ -180,7 +185,7 @@ ifdef PTXCONF_UDEV_LEGACY else ifdef PTXCONF_SYSTEMD @$(call install_copy, udev, 0, 0, 0755, -, /lib/systemd/systemd-udevd) - @$(call install_copy, udev, 0, 0, 0755, -, /usr/bin/udevadm) + @$(call install_copy, udev, 0, 0, 0755, -, /bin/udevadm) else @$(call install_copy, udev, 0, 0, 0755, -, /lib/udev/udevd) @$(call install_copy, udev, 0, 0, 0755, -, /bin/udevadm) diff --git a/rules/udisks.in b/rules/udisks.in index fb77a44..39b8edd 100644 --- a/rules/udisks.in +++ b/rules/udisks.in @@ -1,5 +1,11 @@ ## SECTION=shell_and_console +comment "udisks conflicts with BusyBox' mount!" + depends on BUSYBOX_MOUNT + +comment "udisks conflicts with BusyBox' umount!" + depends on BUSYBOX_MOUNT + menuconfig UDISKS tristate select HOST_GTK_DOC @@ -12,12 +18,14 @@ menuconfig UDISKS select UDEV_LIBUDEV select UDEV_LIBGUDEV # busybox mount can't handle all the options + depends on !BUSYBOX_MOUNT || ALLYES + depends on !BUSYBOX_UMOUNT || ALLYES select UTIL_LINUX_NG select UTIL_LINUX_NG_MOUNT select UTIL_LINUX_NG_UMOUNT select FAKE_OVERLAYFS if UDISKS_FAKE_OVERLAYFS - select FAKE_OVERLAYFS_VAR_TMP if UDISKS_FAKE_OVERLAYFS - select FAKE_OVERLAYFS_VAR_RUN if UDISKS_FAKE_OVERLAYFS + select FAKE_OVERLAYFS_VAR_TMP if UDISKS_FAKE_OVERLAYFS && !FAKE_OVERLAYFS_VAR + select FAKE_OVERLAYFS_VAR_RUN if UDISKS_FAKE_OVERLAYFS && !FAKE_OVERLAYFS_VAR prompt "udisks " help abstraction for enumerating block devices diff --git a/rules/usb-modeswitch.in b/rules/usb-modeswitch.in new file mode 100644 index 0000000..4df7fe1 --- /dev/null +++ b/rules/usb-modeswitch.in @@ -0,0 +1,10 @@ +## SECTION=shell_and_console + +config USB_MODESWITCH + tristate + prompt "usb-modeswitch" + select LIBUSB_COMPAT + help + Activating switchable USB devices on Linux. + +# vim: set sw=8 ts=8 noet ft=kconfig: diff --git a/rules/usb-modeswitch.make b/rules/usb-modeswitch.make new file mode 100644 index 0000000..6f49f1d --- /dev/null +++ b/rules/usb-modeswitch.make @@ -0,0 +1,58 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Bernhard Walle +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_USB_MODESWITCH) += usb-modeswitch + +# +# Paths and names +# +USB_MODESWITCH_VERSION := 1.2.5 +USB_MODESWITCH_MD5 := c393603908eceab95444c5bde790f6f0 +USB_MODESWITCH := usb-modeswitch-$(USB_MODESWITCH_VERSION) +USB_MODESWITCH_SUFFIX := tar.bz2 +USB_MODESWITCH_URL := http://www.draisberghof.de/usb_modeswitch/$(USB_MODESWITCH).$(USB_MODESWITCH_SUFFIX) +USB_MODESWITCH_SOURCE := $(SRCDIR)/$(USB_MODESWITCH).$(USB_MODESWITCH_SUFFIX) +USB_MODESWITCH_DIR := $(BUILDDIR)/$(USB_MODESWITCH) +USB_MODESWITCH_LICENSE := GPLv2 + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +USB_MODESWITCH_CONF_TOOL := NO +USB_MODESWITCH_MAKE_ENV := $(CROSS_ENV) +USB_MODESWITCH_MAKE_OPT := $(CROSS_ENV_PROGS) + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/usb-modeswitch.targetinstall: + @$(call targetinfo) + + @$(call install_init, usb-modeswitch) + @$(call install_fixup, usb-modeswitch,PRIORITY,optional) + @$(call install_fixup, usb-modeswitch,SECTION,base) + @$(call install_fixup, usb-modeswitch,AUTHOR,"Bernhard Walle ") + @$(call install_fixup, usb-modeswitch,DESCRIPTION,missing) + + @$(call install_copy, usb-modeswitch, 0, 0, 0755, -, /usr/sbin/usb_modeswitch) + + @$(call install_finish, usb-modeswitch) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/util-linux-ng.in b/rules/util-linux-ng.in index 4e4b835..249bc37 100644 --- a/rules/util-linux-ng.in +++ b/rules/util-linux-ng.in @@ -26,6 +26,9 @@ config UTIL_LINUX_NG_USES_NCURSES config UTIL_LINUX_NG_PARTX_TOOLS bool +config UTIL_LINUX_NG_SCHEDUTILS + bool + config UTIL_LINUX_NG_AGETTY bool prompt "agetty" @@ -76,12 +79,6 @@ config UTIL_LINUX_NG_MOUNTPOINT comment "BusyBox' mountpoint is selected!" depends on BUSYBOX_MOUNTPOINT -config UTIL_LINUX_NG_DDATE - bool - prompt "ddate" - help - The ddate utility. - config UTIL_LINUX_NG_FDISK bool prompt "fdisk" @@ -135,6 +132,7 @@ comment "BusyBox' swapon is selected!" config UTIL_LINUX_NG_MOUNT bool prompt "mount" + select UTIL_LINUX_NG_LIBMOUNT depends on !BUSYBOX_MOUNT || ALLYES help The mount command serves to attach the file system @@ -146,6 +144,8 @@ comment "BusyBox' mount is selected!" config UTIL_LINUX_NG_UMOUNT bool prompt "umount" + select UTIL_LINUX_NG_MOUNT + depends on !BUSYBOX_MOUNT || ALLYES depends on !BUSYBOX_UMOUNT || ALLYES help The mount(8) command serves to attach the file system @@ -158,6 +158,7 @@ comment "BusyBox' umount is selected!" config UTIL_LINUX_NG_FSCK bool prompt "fsck" + select UTIL_LINUX_NG_LIBMOUNT depends on !BUSYBOX_FSCK || ALLYES help fsck is used to check and optionally repair one or @@ -217,6 +218,7 @@ config UTIL_LINUX_NG_SETTERM config UTIL_LINUX_NG_CHRT bool prompt "chrt" + select UTIL_LINUX_NG_SCHEDUTILS depends on !BUSYBOX_CHRT || ALLYES help chrt manipulates the real-time attributes of a process. @@ -240,12 +242,14 @@ comment "BusyBox' hwclock is selected!" config UTIL_LINUX_NG_IONICE bool prompt "ionice" + select UTIL_LINUX_NG_SCHEDUTILS help ionice gets/sets the program io scheduling class and priority. config UTIL_LINUX_NG_TASKSET bool prompt "taskset" + select UTIL_LINUX_NG_SCHEDUTILS depends on !BUSYBOX_TASKSET || ALLYES help taskset retrieves or sets a process's CPU affinity. @@ -260,6 +264,12 @@ config UTIL_LINUX_NG_MCOOKIE mcookie generates a 128-bit random hexadecimal number for use with the X authority system. +config UTIL_LINUX_NG_LDATTACH + bool + prompt "ldattach" + help + attach a line discipline to a serial line + config UTIL_LINUX_NG_UUIDD bool select UTIL_LINUX_NG_LIBUUID diff --git a/rules/util-linux-ng.make b/rules/util-linux-ng.make index 4df495b..f06f24c 100644 --- a/rules/util-linux-ng.make +++ b/rules/util-linux-ng.make @@ -17,11 +17,11 @@ PACKAGES-$(PTXCONF_UTIL_LINUX_NG) += util-linux-ng # # Paths and names # -UTIL_LINUX_NG_VERSION := 2.21.2 -UTIL_LINUX_NG_MD5 := b75b3cfecb943f74338382fde693c2c3 +UTIL_LINUX_NG_VERSION := 2.23.1 +UTIL_LINUX_NG_MD5 := 33ba55ce82f8e3b8d7a38fac0f62779a UTIL_LINUX_NG := util-linux-$(UTIL_LINUX_NG_VERSION) -UTIL_LINUX_NG_SUFFIX := tar.bz2 -UTIL_LINUX_NG_URL := $(call ptx/mirror, KERNEL, utils/util-linux/v2.21/$(UTIL_LINUX_NG).$(UTIL_LINUX_NG_SUFFIX)) +UTIL_LINUX_NG_SUFFIX := tar.xz +UTIL_LINUX_NG_URL := $(call ptx/mirror, KERNEL, utils/util-linux/v2.23/$(UTIL_LINUX_NG).$(UTIL_LINUX_NG_SUFFIX)) UTIL_LINUX_NG_SOURCE := $(SRCDIR)/$(UTIL_LINUX_NG).$(UTIL_LINUX_NG_SUFFIX) UTIL_LINUX_NG_DIR := $(BUILDDIR)/$(UTIL_LINUX_NG) UTIL_LINUX_NG_LICENSE := GPLv2, GPLv2+, GPLv3+, LGPLv2+, BSD, public_domain @@ -51,53 +51,77 @@ UTIL_LINUX_NG_AUTOCONF := \ $(GLOBAL_LARGE_FILE_OPTION) \ --disable-nls \ --disable-rpath \ + --disable-static-programs \ --enable-tls \ --disable-most-builds \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_LIBUUID)-libuuid \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_LIBBLKID)-libblkid \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_LIBMOUNT)-libmount \ - --enable-mount \ + --disable-deprecated-mount \ + --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_MOUNT)-mount \ --disable-losetup \ - --disable-libmount-mount \ - --disable-new-mount \ + --disable-cytune \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_FSCK)-fsck \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_PARTX_TOOLS)-partx \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_UUIDD)-uuidd \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_MOUNTPOINT)-mountpoint \ --disable-fallocate \ --disable-unshare \ - --disable-arch \ - --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_DDATE)-ddate \ + --disable-nsenter \ + --disable-setpriv \ + --disable-eject \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_AGETTY)-agetty \ --disable-cramfs \ + --disable-bfs \ + --disable-fdformat \ + --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_HWCLOCK)-hwclock \ + --disable-wdctl \ --disable-switch_root \ --disable-pivot_root \ --disable-elvtune \ + --disable-tunelp \ --disable-kill \ --disable-last \ + --disable-utmpdump \ --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_LINE)-line \ --disable-mesg \ --disable-raw \ --disable-rename \ --disable-reset \ - --disable-login-utils \ - --enable-schedutils \ - --disable-wall \ - --disable-write \ + --disable-vipw \ + --disable-newgrp \ + --disable-chfn-chsh-password \ + --disable-chfn-chsh \ --disable-chsh-only-listed \ + --disable-login \ --disable-login-chown-vcs \ --disable-login-stat-mail \ + --disable-sulogin \ + --disable-su \ + --disable-runuser \ + --disable-ul \ + --disable-more \ + --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_SETTERM)-setterm \ + --disable-pg \ + --$(call ptx/endis, PTXCONF_UTIL_LINUX_NG_SCHEDUTILS)-schedutils \ + --disable-wall \ + --disable-write \ + --disable-socket-activation \ + --disable-bash-completion \ --disable-pg-bell \ - --disable-require-password \ --disable-use-tty-group \ + --disable-sulogin-emergency-mount \ --disable-makeinstall-chown \ --disable-makeinstall-setuid \ + --without-libiconv-prefix \ + --without-libintl-prefix \ --without-selinux \ --without-audit \ --without-udev \ --$(call ptx/wwo, PTXCONF_UTIL_LINUX_NG_USES_NCURSES)-ncurses \ --without-slang \ - --without-utempter + --without-utempter \ + --without-user # ---------------------------------------------------------------------------- # Target-Install @@ -118,9 +142,6 @@ endif ifdef PTXCONF_UTIL_LINUX_NG_LINE @$(call install_copy, util-linux-ng, 0, 0, 0755, -, /usr/bin/line) endif -ifdef PTXCONF_UTIL_LINUX_NG_DDATE - @$(call install_copy, util-linux-ng, 0, 0, 0755, -, /usr/bin/ddate) -endif ifdef PTXCONF_UTIL_LINUX_NG_MOUNTPOINT @$(call install_copy, util-linux-ng, 0, 0, 0755, -, /bin/mountpoint) endif @@ -188,6 +209,9 @@ endif ifdef PTXCONF_UTIL_LINUX_NG_MCOOKIE @$(call install_copy, util-linux-ng, 0, 0, 0755, -, /usr/bin/mcookie) endif +ifdef PTXCONF_UTIL_LINUX_NG_LDATTACH + @$(call install_copy, util-linux-ng, 0, 0, 0755, -, /usr/sbin/ldattach) +endif ifdef PTXCONF_UTIL_LINUX_NG_LIBBLKID @$(call install_lib, util-linux-ng, 0, 0, 0644, libblkid) endif diff --git a/rules/v4l-utils.make b/rules/v4l-utils.make index d047885..87e0b69 100644 --- a/rules/v4l-utils.make +++ b/rules/v4l-utils.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_V4L_UTILS) += v4l-utils # # Paths and names # -V4L_UTILS_VERSION := 0.9.1 -V4L_UTILS_MD5 := dce548c1b497a39e59bb52387cf18dc1 +V4L_UTILS_VERSION := 0.9.5 +V4L_UTILS_MD5 := 6947bea808b19207d89ec31afc3a9a89 V4L_UTILS := v4l-utils-$(V4L_UTILS_VERSION) V4L_UTILS_SUFFIX := tar.bz2 V4L_UTILS_URL := http://linuxtv.org/downloads/v4l-utils/$(V4L_UTILS).$(V4L_UTILS_SUFFIX) diff --git a/rules/vo-aacenc.in b/rules/vo-aacenc.in new file mode 100644 index 0000000..51ce06b --- /dev/null +++ b/rules/vo-aacenc.in @@ -0,0 +1,11 @@ +## SECTION=multimedia_libs + +config VO_AACENC + tristate + prompt "vo-aacenc" + help + VisualOn AAC encoder library + This library contains an encoder implementation of the Advanced + Audio Coding (AAC) audio codec. The library is based on a codec + implementation by VisualOn, part of the Stagefright framework + from the Google. diff --git a/rules/vo-aacenc.make b/rules/vo-aacenc.make new file mode 100644 index 0000000..6d23e1a --- /dev/null +++ b/rules/vo-aacenc.make @@ -0,0 +1,62 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_VO_AACENC) += vo-aacenc + +# +# Paths and names +# +VO_AACENC_VERSION := 0.1.2 +VO_AACENC_MD5 := cc862dce14ea5d688506904160c65a02 +VO_AACENC := vo-aacenc-$(VO_AACENC_VERSION) +VO_AACENC_SUFFIX := tar.gz +VO_AACENC_URL := $(call ptx/mirror, SF, opencore-amr/$(VO_AACENC).$(VO_AACENC_SUFFIX)) +VO_AACENC_SOURCE := $(SRCDIR)/$(VO_AACENC).$(VO_AACENC_SUFFIX) +VO_AACENC_DIR := $(BUILDDIR)/$(VO_AACENC) +VO_AACENC_LICENSE := unknown + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +VO_AACENC_CONF_TOOL := autoconf +VO_AACENC_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-armv5e \ + --$(call ptx/endis, PTXCONF_ARCH_ARM_NEON)-armv7neon \ + --disable-example \ + --disable-static + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/vo-aacenc.targetinstall: + @$(call targetinfo) + + @$(call install_init, vo-aacenc) + @$(call install_fixup, vo-aacenc,PRIORITY,optional) + @$(call install_fixup, vo-aacenc,SECTION,base) + @$(call install_fixup, vo-aacenc,AUTHOR,"Michael Olbrich ") + @$(call install_fixup, vo-aacenc,DESCRIPTION,missing) + + @$(call install_lib, vo-aacenc, 0, 0, 0644, libvo-aacenc) + + @$(call install_finish, vo-aacenc) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/wayland.in b/rules/wayland.in new file mode 100644 index 0000000..a8a8932 --- /dev/null +++ b/rules/wayland.in @@ -0,0 +1,11 @@ +## SECTION=multimedia_wayland + +config WAYLAND + tristate + select HOST_WAYLAND + select LIBC_M + select LIBC_RT + select LIBFFI + prompt "wayland" + help + Wayland compositor infrastructure client and server libraries. diff --git a/rules/wayland.make b/rules/wayland.make new file mode 100644 index 0000000..c84de5c --- /dev/null +++ b/rules/wayland.make @@ -0,0 +1,63 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Philipp Zabel +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_WAYLAND) += wayland + +# +# Paths and names +# +WAYLAND_VERSION := 1.1.0 +WAYLAND_MD5 := d2dc9398a83692cafc16eba6e45f85d8 +WAYLAND := wayland-$(WAYLAND_VERSION) +WAYLAND_SUFFIX := tar.xz +WAYLAND_URL := http://wayland.freedesktop.org/releases/$(WAYLAND).$(WAYLAND_SUFFIX) +WAYLAND_SOURCE := $(SRCDIR)/$(WAYLAND).$(WAYLAND_SUFFIX) +WAYLAND_DIR := $(BUILDDIR)/$(WAYLAND) +WAYLAND_LICENSE := MIT + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +WAYLAND_CONF_TOOL := autoconf +WAYLAND_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static \ + --disable-scanner \ + --disable-documentation + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/wayland.targetinstall: + @$(call targetinfo) + + @$(call install_init, wayland) + @$(call install_fixup, wayland,PRIORITY,optional) + @$(call install_fixup, wayland,SECTION,base) + @$(call install_fixup, wayland,AUTHOR,"Philipp Zabel ") + @$(call install_fixup, wayland,DESCRIPTION,wayland client and server libraries) + + @$(call install_lib, wayland, 0, 0, 0644, libwayland-client) + @$(call install_lib, wayland, 0, 0, 0644, libwayland-server) + @$(call install_lib, wayland, 0, 0, 0644, libwayland-cursor) + + @$(call install_finish, wayland) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/wpa_supplicant.in b/rules/wpa_supplicant.in index 733a2b5..62b9b08 100644 --- a/rules/wpa_supplicant.in +++ b/rules/wpa_supplicant.in @@ -127,4 +127,10 @@ config WPA_SUPPLICANT_INSTALL_CLI it's not necessary to have wpa_cli in the final (non-development) version of an Embedded System. +config WPA_SUPPLICANT_DEBUG_FILE + bool + prompt "log file support" + help + Add support for writing debug log to a file + endif diff --git a/rules/wpa_supplicant.make b/rules/wpa_supplicant.make index 0607696..d007279 100644 --- a/rules/wpa_supplicant.make +++ b/rules/wpa_supplicant.make @@ -17,8 +17,8 @@ PACKAGES-$(PTXCONF_WPA_SUPPLICANT) += wpa_supplicant # Paths and names # WPA_SUPPLICANT_NAME := wpa_supplicant -WPA_SUPPLICANT_VERSION := 1.0 -WPA_SUPPLICANT_MD5 := 8650f6aa23646ef634402552d0669640 +WPA_SUPPLICANT_VERSION := 2.0 +WPA_SUPPLICANT_MD5 := 3be2ebfdcced52e00eda0afe2889839d WPA_SUPPLICANT := $(WPA_SUPPLICANT_NAME)-$(WPA_SUPPLICANT_VERSION) WPA_SUPPLICANT_SUFFIX := tar.gz WPA_SUPPLICANT_URL := http://hostap.epitest.fi/releases/$(WPA_SUPPLICANT).$(WPA_SUPPLICANT_SUFFIX) diff --git a/rules/xorg-app-xkbcomp.in b/rules/xorg-app-xkbcomp.in index d86e5bf..2d3fba4 100644 --- a/rules/xorg-app-xkbcomp.in +++ b/rules/xorg-app-xkbcomp.in @@ -4,6 +4,7 @@ config XORG_APP_XKBCOMP tristate depends on XORG_KEYBOARD_MAPPING_SUPPORT prompt "xorg xkbcomp" + select XORG_LIB_X11 select XORG_LIB_X11_XKB select XORG_LIB_XKBFILE help diff --git a/rules/xorg-driver-video-fbdev.make b/rules/xorg-driver-video-fbdev.make index bd6331b..237b185 100644 --- a/rules/xorg-driver-video-fbdev.make +++ b/rules/xorg-driver-video-fbdev.make @@ -29,6 +29,13 @@ XORG_DRIVER_VIDEO_FBDEV_DIR := $(BUILDDIR)/$(XORG_DRIVER_VIDEO_FBDEV) # Prepare # ---------------------------------------------------------------------------- +# Do not resolve symbols in fbdev_drv.so at load time, so it has a chance +# to load the libfbdevhw.so submodule before using its symbols. +# This fixes the following error when starting Xorg: +# (EE) Failed to load /usr/lib/xorg/modules/drivers/fbdev_drv.so: /usr/lib/xorg/modules/drivers/fbdev_drv.so: undefined symbol: fbdevHWSave +XORG_DRIVER_VIDEO_FBDEV_WRAPPER_BLACKLIST := \ + TARGET_HARDEN_BINDNOW + XORG_DRIVER_VIDEO_FBDEV_PATH := PATH=$(CROSS_PATH) XORG_DRIVER_VIDEO_FBDEV_ENV := $(CROSS_ENV) diff --git a/rules/xorg-font-micro-misc.make b/rules/xorg-font-micro-misc.make index c5ba72c..6d760b4 100644 --- a/rules/xorg-font-micro-misc.make +++ b/rules/xorg-font-micro-misc.make @@ -58,6 +58,8 @@ $(STATEDIR)/xorg-font-micro-misc.install: $(STATEDIR)/xorg-font-micro-misc.targetinstall: @$(call targetinfo) + @mkdir -p $(XORG_FONTS_DIR_INSTALL)/misc + @find $(XORG_FONT_MICRO_MISC_DIR) \ -name "*.pcf.gz" \ | \ diff --git a/rules/xorg-lib-X11.in b/rules/xorg-lib-X11.in index 89fd643..01ef02f 100644 --- a/rules/xorg-lib-X11.in +++ b/rules/xorg-lib-X11.in @@ -10,7 +10,7 @@ menuconfig XORG_LIB_X11 select XORG_LIB_XAU if !XORG_LIB_X11_XCB_LOW_LEVEL select XORG_PROTO_XCMISC if !XORG_LIB_X11_XCB_LOW_LEVEL select XORG_PROTO_BIGREQS if !XORG_LIB_X11_XCB_LOW_LEVEL - select LIBXCB if XORG_LIB_X11_XCB_LOW_LEVEL + select LIBXCB select XORG_LIB_XTRANS select XORG_PROTO_XF86BIGFONT if XORG_LIB_X11_XF86BIGFONT select XORG_PROTO_INPUT if XORG_LIB_X11_XKB diff --git a/rules/xorg-lib-Xfont.in b/rules/xorg-lib-Xfont.in index c4eba65..cdc66e7 100644 --- a/rules/xorg-lib-Xfont.in +++ b/rules/xorg-lib-Xfont.in @@ -14,6 +14,8 @@ menuconfig XORG_LIB_XFONT select XORG_LIB_XTRANS select ZLIB if XORG_LIB_XFONT_BUILTIN_FONTS select FREETYPE if XORG_LIB_XFONT_FREETYPE + # disabling builtins is currently broken + select XORG_LIB_XFONT_BUILTIN_FONTS default y if XORG_LIB_X11 prompt "libXfont " help diff --git a/rules/xorg-options.in b/rules/xorg-options.in index 5ab689a..cee2c72 100644 --- a/rules/xorg-options.in +++ b/rules/xorg-options.in @@ -37,13 +37,14 @@ menu "options " config XORG_KEYBOARD_MAPPING_SUPPORT bool prompt "support keyboard mappings" + select XORG_DRIVER_INPUT select XORG_DRIVER_INPUT_KEYBOARD select XORG_APP_XKBCOMP help If you like to use a keyboard with your X server (mostly wanted) enable this entry. Its required when you want to configure specific keyboard layouts and key settings. Mostly needed on non-US keyboards. - Note: A german keyboard does not support the '@¤\[]{}|' keys when + Note: A german keyboard does not support the '@�\[]{}|' keys when disabled! config XORG_DEFAULT_DATA_DIR diff --git a/rules/xorg-server.in b/rules/xorg-server.in index 5108e2d..cdee20e 100644 --- a/rules/xorg-server.in +++ b/rules/xorg-server.in @@ -32,6 +32,7 @@ menuconfig XORG_SERVER select XORG_PROTO_FONTS select XORG_PROTO_INPUT select XORG_PROTO_KB + select XORG_PROTO_VIDEO # libs select XORG_LIB_XFONT @@ -77,7 +78,6 @@ menuconfig XORG_SERVER select XORG_PROTO_XF86VIDMODE if XORG_SERVER_XORG && XORG_SERVER_EXT_XF86VIDMODE # xv triggered - select XORG_PROTO_VIDEO if XORG_SERVER_EXT_XV select XORG_LIB_XV if XORG_SERVER_EXT_XV # composite triggered @@ -445,6 +445,7 @@ config XORG_SERVER_EXT_XSELINUX config XORG_SERVER_EXT_XCSECURITY bool + select XORG_SERVER_EXT_XACE prompt "xcsecurity" help FIXME diff --git a/rules/zlib.make b/rules/zlib.make index e2dd64b..680cf14 100644 --- a/rules/zlib.make +++ b/rules/zlib.make @@ -17,10 +17,10 @@ PACKAGES-$(PTXCONF_ZLIB) += zlib # # Paths and names # -ZLIB_VERSION := 1.2.7 -ZLIB_MD5 := 2ab442d169156f34c379c968f3f482dd +ZLIB_VERSION := 1.2.8 +ZLIB_MD5 := 28f1205d8dd2001f26fec1e8c2cebe37 ZLIB := zlib-$(ZLIB_VERSION) -ZLIB_SUFFIX := tar.bz2 +ZLIB_SUFFIX := tar.xz ZLIB_URL := \ http://zlib.net/$(ZLIB).$(ZLIB_SUFFIX) \ $(call ptx/mirror, SF, libpng/$(ZLIB).$(ZLIB_SUFFIX)) @@ -34,22 +34,18 @@ ZLIB_LICENSE := zlib ZLIB_CONF_ENV := \ $(CROSS_ENV) \ - CROSS_PREFIX=$(PTXCONF_COMPILER_PREFIX) \ - CFLAGS="$(CROSS_CPPFLAGS) -O2 -g" + CROSS_PREFIX=$(PTXCONF_COMPILER_PREFIX) # # autoconf # -ZLIB_AUTOCONF := \ +ZLIB_CONF_TOOL := autoconf +ZLIB_CONF_OPT := \ --prefix=/usr \ --uname=Linux \ + $(call ptx/ifdef, PTXCONF_ZLIB_STATIC,--static) \ --libdir=/usr/$(CROSS_LIB_DIR) -ifdef PTXCONF_ZLIB_STATIC -ZLIB_AUTOCONF += --static -endif - - # ---------------------------------------------------------------------------- # Target-Install # ---------------------------------------------------------------------------- diff --git a/scripts/git-ptx-patches b/scripts/git-ptx-patches index 37f5d91..619e0c9 100755 --- a/scripts/git-ptx-patches +++ b/scripts/git-ptx-patches @@ -110,10 +110,17 @@ case "$remove_old" in ;; esac +# git-format-patch --no-signature is supported since git 1.7.2 if git format-patch -h 2>&1 | grep -q signature; then GIT_EXTRA_ARGS="--no-signature" fi +# git-format-patch --notes is supported since git 1.7.6, but actually you want +# git 1.8.1-rc0 to get the notes below the --- marker +if man git-format-patch | grep -q -e --notes; then + GIT_EXTRA_ARGS="$GIT_EXTRA_ARGS --notes" +fi + cat .ptxdist/series.0 > .ptxdist/series git format-patch -N $GIT_EXTRA_ARGS ${tagopt} -o .ptxdist/patches/ ${range} | sed -e 's,^.ptxdist/patches/,,' > .ptxdist/series.auto cat .ptxdist/series.auto >> .ptxdist/series diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index fbac5e8..7ecdc14 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "lkc.h" @@ -37,6 +38,7 @@ enum input_mode { } input_mode = oldaskconfig; static int indent = 1; +static int tty_stdio; static int valid_stdin = 1; static int sync_kconfig; static int conf_cnt; @@ -109,6 +111,8 @@ static int conf_askvalue(struct symbol *sym, const char *def) case oldaskconfig: fflush(stdout); xfgets(line, 128, stdin); + if (!tty_stdio) + printf("\n"); return 1; default: break; @@ -528,6 +532,8 @@ int main(int ac, char **av) bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + tty_stdio = isatty(0) && isatty(1) && isatty(2); + while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) { input_mode = (enum input_mode)opt; switch (opt) { @@ -546,14 +552,23 @@ int main(int ac, char **av) { struct timeval now; unsigned int seed; + char *seed_env; /* * Use microseconds derived seed, * compensate for systems where it may be zero */ gettimeofday(&now, NULL); - seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1)); + + seed_env = getenv("KCONFIG_SEED"); + if( seed_env && *seed_env ) { + char *endp; + int tmp = (int)strtol(seed_env, &endp, 10); + if (*endp == '\0') { + seed = tmp; + } + } srand(seed); break; } @@ -658,7 +673,7 @@ int main(int ac, char **av) return 1; } } - valid_stdin = isatty(0) && isatty(1) && isatty(2); + valid_stdin = tty_stdio; } switch (input_mode) { diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index e0dd10b..928cb7b 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -1108,10 +1108,54 @@ static void set_all_choice_values(struct symbol *csym) void conf_set_all_new_symbols(enum conf_def_mode mode) { struct symbol *sym, *csym; - int i, cnt; + int i, cnt, pby, pty, ptm; /* pby: probability of boolean = y + * pty: probability of tristate = y + * ptm: probability of tristate = m + */ + + pby = 50; pty = ptm = 33; /* can't go as the default in switch-case + * below, otherwise gcc whines about + * -Wmaybe-uninitialized */ + if (mode == def_random) { + int n, p[3]; + char *env = getenv("KCONFIG_PROBABILITY"); + n = 0; + while( env && *env ) { + char *endp; + int tmp = strtol( env, &endp, 10 ); + if( tmp >= 0 && tmp <= 100 ) { + p[n++] = tmp; + } else { + errno = ERANGE; + perror( "KCONFIG_PROBABILITY" ); + exit( 1 ); + } + env = (*endp == ':') ? endp+1 : endp; + if( n >=3 ) { + break; + } + } + switch( n ) { + case 1: + pby = p[0]; ptm = pby/2; pty = pby-ptm; + break; + case 2: + pty = p[0]; ptm = p[1]; pby = pty + ptm; + break; + case 3: + pby = p[0]; pty = p[1]; ptm = p[2]; + break; + } + + if( pty+ptm > 100 ) { + errno = ERANGE; + perror( "KCONFIG_PROBABILITY" ); + exit( 1 ); + } + } for_all_symbols(i, sym) { - if (sym_has_value(sym)) + if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID)) continue; switch (sym_get_type(sym)) { case S_BOOLEAN: @@ -1127,8 +1171,15 @@ void conf_set_all_new_symbols(enum conf_def_mode mode) sym->def[S_DEF_USER].tri = no; break; case def_random: - cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2; - sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt); + sym->def[S_DEF_USER].tri = no; + cnt = rand() % 100; + if (sym->type == S_TRISTATE) { + if (cnt < pty) + sym->def[S_DEF_USER].tri = yes; + else if (cnt < (pty+ptm)) + sym->def[S_DEF_USER].tri = mod; + } else if (cnt < pby) + sym->def[S_DEF_USER].tri = yes; break; default: continue; diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index 290ce41..d662652 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c @@ -13,7 +13,7 @@ struct expr *expr_alloc_symbol(struct symbol *sym) { - struct expr *e = calloc(1, sizeof(*e)); + struct expr *e = xcalloc(1, sizeof(*e)); e->type = E_SYMBOL; e->left.sym = sym; return e; @@ -21,7 +21,7 @@ struct expr *expr_alloc_symbol(struct symbol *sym) struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) { - struct expr *e = calloc(1, sizeof(*e)); + struct expr *e = xcalloc(1, sizeof(*e)); e->type = type; e->left.expr = ce; return e; @@ -29,7 +29,7 @@ struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) { - struct expr *e = calloc(1, sizeof(*e)); + struct expr *e = xcalloc(1, sizeof(*e)); e->type = type; e->left.expr = e1; e->right.expr = e2; @@ -38,7 +38,7 @@ struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) { - struct expr *e = calloc(1, sizeof(*e)); + struct expr *e = xcalloc(1, sizeof(*e)); e->type = type; e->left.sym = s1; e->right.sym = s2; @@ -66,7 +66,7 @@ struct expr *expr_copy(const struct expr *org) if (!org) return NULL; - e = malloc(sizeof(*org)); + e = xmalloc(sizeof(*org)); memcpy(e, org, sizeof(*org)); switch (org->type) { case E_SYMBOL: diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index 59402a3..cdd4860 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h @@ -12,11 +12,10 @@ extern "C" { #include #include -#include +#include "list.h" #ifndef __cplusplus #include #endif -#include "missing.h" struct file { struct file *next; @@ -176,12 +175,11 @@ struct menu { #define MENU_ROOT 0x0002 struct jump_key { - CIRCLEQ_ENTRY(jump_key) entries; + struct list_head entries; size_t offset; struct menu *target; int index; }; -CIRCLEQ_HEAD(jk_head, jump_key); #define JUMP_NB 9 diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c index adc2306..f2bee70 100644 --- a/scripts/kconfig/gconf.c +++ b/scripts/kconfig/gconf.c @@ -10,6 +10,7 @@ # include #endif +#include #include "lkc.h" #include "images.c" @@ -22,7 +23,6 @@ #include #include #include -#include //#define DEBUG diff --git a/scripts/kconfig/list.h b/scripts/kconfig/list.h new file mode 100644 index 0000000..685d80e --- /dev/null +++ b/scripts/kconfig/list.h @@ -0,0 +1,131 @@ +#ifndef LIST_H +#define LIST_H + +/* + * Copied from include/linux/... + */ + +#undef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + + +struct list_head { + struct list_head *next, *prev; +}; + + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +/** + * list_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_add(struct list_head *_new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = _new; + _new->next = next; + _new->prev = prev; + prev->next = _new; +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *_new, struct list_head *head) +{ + __list_add(_new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head *prev, struct list_head *next) +{ + next->prev = prev; + prev->next = next; +} + +#define LIST_POISON1 ((void *) 0x00100100) +#define LIST_POISON2 ((void *) 0x00200200) +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty() on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = (struct list_head*)LIST_POISON1; + entry->prev = (struct list_head*)LIST_POISON2; +} +#endif diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index c18f2bd..f8aee5f 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -39,6 +39,12 @@ extern "C" { #ifndef CONFIG_ #define CONFIG_ "CONFIG_" #endif +static inline const char *CONFIG_prefix(void) +{ + return getenv( "CONFIG_" ) ?: CONFIG_; +} +#undef CONFIG_ +#define CONFIG_ CONFIG_prefix() #define TF_COMMAND 0x0001 #define TF_PARAM 0x0002 @@ -116,6 +122,8 @@ void menu_set_type(int type); /* util.c */ struct file *file_lookup(const char *name); int file_write_dep(const char *name); +void *xmalloc(size_t size); +void *xcalloc(size_t nmemb, size_t size); struct gstr { size_t len; diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index 1d1c085..ef1a738 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -21,9 +21,9 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu)); P(menu_get_parent_menu,struct menu *,(struct menu *menu)); P(menu_has_help,bool,(struct menu *menu)); P(menu_get_help,const char *,(struct menu *menu)); -P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct jk_head +P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct list_head *head)); -P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct jk_head +P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct list_head *head)); P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help)); diff --git a/scripts/kconfig/lxdialog/check-lxdialog.sh b/scripts/kconfig/lxdialog/check-lxdialog.sh index c8e8a71..9d2a4c5 100644 --- a/scripts/kconfig/lxdialog/check-lxdialog.sh +++ b/scripts/kconfig/lxdialog/check-lxdialog.sh @@ -4,6 +4,8 @@ # What library to link ldflags() { + pkg-config --libs ncursesw 2>/dev/null && exit + pkg-config --libs ncurses 2>/dev/null && exit for ext in so a dll.a dylib ; do for lib in ncursesw ncurses curses ; do $cc -print-file-name=lib${lib}.${ext} | grep -q / @@ -20,11 +22,12 @@ ldflags() ccflags() { if [ -f /usr/include/ncursesw/curses.h ]; then - echo '-I/usr/include/ncursesw -DCURSES_LOC=""' + echo '-I/usr/include/ncursesw -DCURSES_LOC=""' + echo ' -DNCURSES_WIDECHAR=1' elif [ -f /usr/include/ncurses/ncurses.h ]; then echo '-I/usr/include/ncurses -DCURSES_LOC=""' elif [ -f /usr/include/ncurses/curses.h ]; then - echo '-I/usr/include/ncurses -DCURSES_LOC=""' + echo '-I/usr/include/ncurses -DCURSES_LOC=""' elif [ -f /usr/include/ncurses.h ]; then echo '-DCURSES_LOC=""' else diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h index ee17a52..1099337 100644 --- a/scripts/kconfig/lxdialog/dialog.h +++ b/scripts/kconfig/lxdialog/dialog.h @@ -106,8 +106,14 @@ struct dialog_color { int hl; /* highlight this item */ }; +struct subtitle_list { + struct subtitle_list *next; + const char *text; +}; + struct dialog_info { const char *backtitle; + struct subtitle_list *subtitles; struct dialog_color screen; struct dialog_color shadow; struct dialog_color dialog; @@ -196,6 +202,7 @@ int on_key_resize(void); int init_dialog(const char *backtitle); void set_dialog_backtitle(const char *backtitle); +void set_dialog_subtitles(struct subtitle_list *subtitles); void end_dialog(int x, int y); void attr_clear(WINDOW * win, int height, int width, chtype attr); void dialog_clear(void); @@ -221,7 +228,6 @@ int dialog_menu(const char *title, const char *prompt, const void *selected, int *s_scroll); int dialog_checklist(const char *title, const char *prompt, int height, int width, int list_height); -extern char dialog_input_result[]; int dialog_inputbox(const char *title, const char *prompt, int height, int width, const char *init); diff --git a/scripts/kconfig/lxdialog/inputbox.c b/scripts/kconfig/lxdialog/inputbox.c index dd8e587..21404a0 100644 --- a/scripts/kconfig/lxdialog/inputbox.c +++ b/scripts/kconfig/lxdialog/inputbox.c @@ -45,7 +45,8 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width const char *init) { int i, x, y, box_y, box_x, box_width; - int input_x = 0, scroll = 0, key = 0, button = -1; + int input_x = 0, key = 0, button = -1; + int show_x, len, pos; char *instr = dialog_input_result; WINDOW *dialog; @@ -97,14 +98,17 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width wmove(dialog, box_y, box_x); wattrset(dialog, dlg.inputbox.atr); - input_x = strlen(instr); + len = strlen(instr); + pos = len; - if (input_x >= box_width) { - scroll = input_x - box_width + 1; + if (len >= box_width) { + show_x = len - box_width + 1; input_x = box_width - 1; for (i = 0; i < box_width - 1; i++) - waddch(dialog, instr[scroll + i]); + waddch(dialog, instr[show_x + i]); } else { + show_x = 0; + input_x = len; waddstr(dialog, instr); } @@ -121,45 +125,104 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width case KEY_UP: case KEY_DOWN: break; - case KEY_LEFT: - continue; - case KEY_RIGHT: - continue; case KEY_BACKSPACE: case 127: - if (input_x || scroll) { + if (pos) { wattrset(dialog, dlg.inputbox.atr); - if (!input_x) { - scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1); - wmove(dialog, box_y, box_x); - for (i = 0; i < box_width; i++) - waddch(dialog, - instr[scroll + input_x + i] ? - instr[scroll + input_x + i] : ' '); - input_x = strlen(instr) - scroll; + if (input_x == 0) { + show_x--; } else input_x--; - instr[scroll + input_x] = '\0'; - mvwaddch(dialog, box_y, input_x + box_x, ' '); + + if (pos < len) { + for (i = pos - 1; i < len; i++) { + instr[i] = instr[i+1]; + } + } + + pos--; + len--; + instr[len] = '\0'; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) { + if (!instr[show_x + i]) { + waddch(dialog, ' '); + break; + } + waddch(dialog, instr[show_x + i]); + } wmove(dialog, box_y, input_x + box_x); wrefresh(dialog); } continue; + case KEY_LEFT: + if (pos > 0) { + if (input_x > 0) { + wmove(dialog, box_y, --input_x + box_x); + } else if (input_x == 0) { + show_x--; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) { + if (!instr[show_x + i]) { + waddch(dialog, ' '); + break; + } + waddch(dialog, instr[show_x + i]); + } + wmove(dialog, box_y, box_x); + } + pos--; + } + continue; + case KEY_RIGHT: + if (pos < len) { + if (input_x < box_width - 1) { + wmove(dialog, box_y, ++input_x + box_x); + } else if (input_x == box_width - 1) { + show_x++; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) { + if (!instr[show_x + i]) { + waddch(dialog, ' '); + break; + } + waddch(dialog, instr[show_x + i]); + } + wmove(dialog, box_y, input_x + box_x); + } + pos++; + } + continue; default: if (key < 0x100 && isprint(key)) { - if (scroll + input_x < MAX_LEN) { + if (len < MAX_LEN) { wattrset(dialog, dlg.inputbox.atr); - instr[scroll + input_x] = key; - instr[scroll + input_x + 1] = '\0'; + if (pos < len) { + for (i = len; i > pos; i--) + instr[i] = instr[i-1]; + instr[pos] = key; + } else { + instr[len] = key; + } + pos++; + len++; + instr[len] = '\0'; + if (input_x == box_width - 1) { - scroll++; - wmove(dialog, box_y, box_x); - for (i = 0; i < box_width - 1; i++) - waddch(dialog, instr [scroll + i]); + show_x++; } else { - wmove(dialog, box_y, input_x++ + box_x); - waddch(dialog, key); + input_x++; + } + + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) { + if (!instr[show_x + i]) { + waddch(dialog, ' '); + break; + } + waddch(dialog, instr[show_x + i]); } + wmove(dialog, box_y, input_x + box_x); wrefresh(dialog); } else flash(); /* Alarm user about overflow */ diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c index 1d60473..38cd69c 100644 --- a/scripts/kconfig/lxdialog/menubox.c +++ b/scripts/kconfig/lxdialog/menubox.c @@ -26,7 +26,7 @@ * * *) A bugfix for the Page-Down problem * - * *) Formerly when I used Page Down and Page Up, the cursor would be set + * *) Formerly when I used Page Down and Page Up, the cursor would be set * to the first position in the menu box. Now lxdialog is a bit * smarter and works more like other menu systems (just have a look at * it). @@ -154,12 +154,14 @@ static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x, */ static void print_buttons(WINDOW * win, int height, int width, int selected) { - int x = width / 2 - 16; + int x = width / 2 - 28; int y = height - 2; print_button(win, gettext("Select"), y, x, selected == 0); print_button(win, gettext(" Exit "), y, x + 12, selected == 1); print_button(win, gettext(" Help "), y, x + 24, selected == 2); + print_button(win, gettext(" Save "), y, x + 36, selected == 3); + print_button(win, gettext(" Load "), y, x + 48, selected == 4); wmove(win, y, x + 1 + 12 * selected); wrefresh(win); @@ -301,10 +303,11 @@ int dialog_menu(const char *title, const char *prompt, } } - if (i < max_choice || - key == KEY_UP || key == KEY_DOWN || - key == '-' || key == '+' || - key == KEY_PPAGE || key == KEY_NPAGE) { + if (item_count() != 0 && + (i < max_choice || + key == KEY_UP || key == KEY_DOWN || + key == '-' || key == '+' || + key == KEY_PPAGE || key == KEY_NPAGE)) { /* Remove highligt of current item */ print_item(scroll + choice, choice, FALSE); @@ -372,7 +375,7 @@ int dialog_menu(const char *title, const char *prompt, case TAB: case KEY_RIGHT: button = ((key == KEY_LEFT ? --button : ++button) < 0) - ? 2 : (button > 2 ? 0 : button); + ? 4 : (button > 4 ? 0 : button); print_buttons(dialog, height, width, button); wrefresh(menu); @@ -399,17 +402,17 @@ int dialog_menu(const char *title, const char *prompt, return 2; case 's': case 'y': - return 3; + return 5; case 'n': - return 4; + return 6; case 'm': - return 5; + return 7; case ' ': - return 6; + return 8; case '/': - return 7; + return 9; case 'z': - return 8; + return 10; case '\n': return button; } diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c index 109d531..a0e97c2 100644 --- a/scripts/kconfig/lxdialog/util.c +++ b/scripts/kconfig/lxdialog/util.c @@ -257,12 +257,48 @@ void dialog_clear(void) attr_clear(stdscr, LINES, COLS, dlg.screen.atr); /* Display background title if it exists ... - SLH */ if (dlg.backtitle != NULL) { - int i; + int i, len = 0, skip = 0; + struct subtitle_list *pos; wattrset(stdscr, dlg.screen.atr); mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle); + + for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { + /* 3 is for the arrow and spaces */ + len += strlen(pos->text) + 3; + } + wmove(stdscr, 1, 1); - for (i = 1; i < COLS - 1; i++) + if (len > COLS - 2) { + const char *ellipsis = "[...] "; + waddstr(stdscr, ellipsis); + skip = len - (COLS - 2 - strlen(ellipsis)); + } + + for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { + if (skip == 0) + waddch(stdscr, ACS_RARROW); + else + skip--; + + if (skip == 0) + waddch(stdscr, ' '); + else + skip--; + + if (skip < strlen(pos->text)) { + waddstr(stdscr, pos->text + skip); + skip = 0; + } else + skip -= strlen(pos->text); + + if (skip == 0) + waddch(stdscr, ' '); + else + skip--; + } + + for (i = len + 1; i < COLS - 1; i++) waddch(stdscr, ACS_HLINE); } wnoutrefresh(stdscr); @@ -302,6 +338,11 @@ void set_dialog_backtitle(const char *backtitle) dlg.backtitle = backtitle; } +void set_dialog_subtitles(struct subtitle_list *subtitles) +{ + dlg.subtitles = subtitles; +} + /* * End using dialog functions. */ diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 0fe09e3..5ce66af 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -280,6 +280,7 @@ static struct menu *current_menu; static int child_count; static int single_menu_mode; static int show_all_options; +static int save_and_exit; static void conf(struct menu *menu, struct menu *active_menu); static void conf_choice(struct menu *menu); @@ -310,9 +311,53 @@ static void set_config_filename(const char *config_filename) filename[sizeof(filename)-1] = '\0'; } +struct subtitle_part { + struct list_head entries; + const char *text; +}; +static LIST_HEAD(trail); + +static struct subtitle_list *subtitles; +static void set_subtitle(void) +{ + struct subtitle_part *sp; + struct subtitle_list *pos, *tmp; + + for (pos = subtitles; pos != NULL; pos = tmp) { + tmp = pos->next; + free(pos); + } + + subtitles = NULL; + list_for_each_entry(sp, &trail, entries) { + if (sp->text) { + if (pos) { + pos->next = xcalloc(sizeof(*pos), 1); + pos = pos->next; + } else { + subtitles = pos = xcalloc(sizeof(*pos), 1); + } + pos->text = sp->text; + } + } + + set_dialog_subtitles(subtitles); +} + +static void reset_subtitle(void) +{ + struct subtitle_list *pos, *tmp; + + for (pos = subtitles; pos != NULL; pos = tmp) { + tmp = pos->next; + free(pos); + } + subtitles = NULL; + set_dialog_subtitles(subtitles); +} struct search_data { - struct jk_head *head; + struct list_head *head; struct menu **targets; int *keys; }; @@ -323,7 +368,7 @@ static void update_text(char *buf, size_t start, size_t end, void *_data) struct jump_key *pos; int k = 0; - CIRCLEQ_FOREACH(pos, data->head, entries) { + list_for_each_entry(pos, data->head, entries) { if (pos->offset >= start && pos->offset < end) { char header[4]; @@ -348,15 +393,21 @@ static void search_conf(void) { struct symbol **sym_arr; struct gstr res; + struct gstr title; char *dialog_input; int dres, vscroll = 0, hscroll = 0; bool again; + struct gstr sttext; + struct subtitle_part stpart; + + title = str_new(); + str_printf( &title, _("Enter %s (sub)string to search for " + "(with or without \"%s\")"), CONFIG_, CONFIG_); again: dialog_clear(); dres = dialog_inputbox(_("Search Configuration Parameter"), - _("Enter " CONFIG_ " (sub)string to search for " - "(with or without \"" CONFIG_ "\")"), + str_get(&title), 10, 75, ""); switch (dres) { case 0: @@ -365,6 +416,7 @@ static void search_conf(void) show_helptext(_("Search Configuration"), search_help); goto again; default: + str_free(&title); return; } @@ -373,9 +425,14 @@ static void search_conf(void) if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0) dialog_input += strlen(CONFIG_); + sttext = str_new(); + str_printf(&sttext, "Search (%s)", dialog_input_result); + stpart.text = str_get(&sttext); + list_add_tail(&stpart.entries, &trail); + sym_arr = sym_re_search(dialog_input); do { - struct jk_head head = CIRCLEQ_HEAD_INITIALIZER(head); + LIST_HEAD(head); struct menu *targets[JUMP_NB]; int keys[JUMP_NB + 1], i; struct search_data data = { @@ -383,8 +440,10 @@ static void search_conf(void) .targets = targets, .keys = keys, }; + struct jump_key *pos, *tmp; res = get_relations_str(sym_arr, &head); + set_subtitle(); dres = show_textbox_ext(_("Search Results"), (char *) str_get(&res), 0, 0, keys, &vscroll, &hscroll, &update_text, (void *) @@ -396,8 +455,13 @@ static void search_conf(void) again = true; } str_free(&res); + list_for_each_entry_safe(pos, tmp, &head, entries) + free(pos); } while (again); free(sym_arr); + str_free(&title); + list_del(trail.prev); + str_free(&sttext); } static void build_conf(struct menu *menu) @@ -574,35 +638,36 @@ static void conf(struct menu *menu, struct menu *active_menu) { struct menu *submenu; const char *prompt = menu_get_prompt(menu); + struct subtitle_part stpart; struct symbol *sym; int res; int s_scroll = 0; + if (menu != &rootmenu) + stpart.text = menu_get_prompt(menu); + else + stpart.text = NULL; + list_add_tail(&stpart.entries, &trail); + while (1) { item_reset(); current_menu = menu; build_conf(menu); if (!child_count) break; - if (menu == &rootmenu) { - item_make("--- "); - item_set_tag(':'); - item_make(_(" Load an Alternate Configuration File")); - item_set_tag('L'); - item_make(_(" Save an Alternate Configuration File")); - item_set_tag('S'); - } + set_subtitle(); dialog_clear(); res = dialog_menu(prompt ? _(prompt) : _("Main Menu"), _(menu_instructions), active_menu, &s_scroll); if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL) break; - if (!item_activate_selected()) - continue; - if (!item_tag()) - continue; - + if (item_count() != 0) { + if (!item_activate_selected()) + continue; + if (!item_tag()) + continue; + } submenu = item_data(); active_menu = item_data(); if (submenu) @@ -628,21 +693,25 @@ static void conf(struct menu *menu, struct menu *active_menu) case 's': conf_string(submenu); break; - case 'L': - conf_load(); - break; - case 'S': - conf_save(); - break; } break; case 2: if (sym) show_help(submenu); - else + else { + reset_subtitle(); show_helptext(_("README"), _(mconf_readme)); + } break; case 3: + reset_subtitle(); + conf_save(); + break; + case 4: + reset_subtitle(); + conf_load(); + break; + case 5: if (item_is_tag('t')) { if (sym_set_tristate_value(sym, yes)) break; @@ -650,28 +719,30 @@ static void conf(struct menu *menu, struct menu *active_menu) show_textbox(NULL, setmod_text, 6, 74); } break; - case 4: + case 6: if (item_is_tag('t')) sym_set_tristate_value(sym, no); break; - case 5: + case 7: if (item_is_tag('t')) sym_set_tristate_value(sym, mod); break; - case 6: + case 8: if (item_is_tag('t')) sym_toggle_tristate_value(sym); else if (item_is_tag('m')) conf(submenu, NULL); break; - case 7: + case 9: search_conf(); break; - case 8: + case 10: show_all_options = !show_all_options; break; } } + + list_del(trail.prev); } static int show_textbox_ext(const char *title, char *text, int r, int c, int @@ -694,6 +765,17 @@ static void show_helptext(const char *title, const char *text) show_textbox(title, text, 0, 0); } +static void conf_message_callback(const char *fmt, va_list ap) +{ + char buf[PATH_MAX+1]; + + vsnprintf(buf, sizeof(buf), fmt, ap); + if (save_and_exit) + printf("%s", buf); + else + show_textbox(NULL, buf, 6, 60); +} + static void show_help(struct menu *menu) { struct gstr help = str_new(); @@ -862,6 +944,8 @@ static int handle_exit(void) { int res; + save_and_exit = 1; + reset_subtitle(); dialog_clear(); if (conf_get_changed()) res = dialog_yesno(NULL, @@ -933,6 +1017,7 @@ int main(int ac, char **av) } set_config_filename(conf_get_configname()); + conf_set_message_callback(conf_message_callback); do { conf(&rootmenu, NULL); res = handle_exit(); diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 5d5ff16..395521c 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -48,7 +48,7 @@ void menu_add_entry(struct symbol *sym) { struct menu *menu; - menu = malloc(sizeof(*menu)); + menu = xmalloc(sizeof(*menu)); memset(menu, 0, sizeof(*menu)); menu->sym = sym; menu->parent = current_menu; @@ -146,11 +146,24 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e struct menu *menu = current_entry; while ((menu = menu->parent) != NULL) { + struct expr *dup_expr; + if (!menu->visibility) continue; + /* + * Do not add a reference to the + * menu's visibility expression but + * use a copy of it. Otherwise the + * expression reduction functions + * will modify expressions that have + * multiple references which can + * cause unwanted side effects. + */ + dup_expr = expr_copy(menu->visibility); + prop->visible.expr = expr_alloc_and(prop->visible.expr, - menu->visibility); + dup_expr); } } @@ -511,20 +524,13 @@ const char *menu_get_help(struct menu *menu) } static void get_prompt_str(struct gstr *r, struct property *prop, - struct jk_head *head) + struct list_head *head) { int i, j; struct menu *submenu[8], *menu, *location = NULL; struct jump_key *jump; str_printf(r, _("Prompt: %s\n"), _(prop->text)); - str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name, - prop->menu->lineno); - if (!expr_is_yes(prop->visible.expr)) { - str_append(r, _(" Depends on: ")); - expr_gstr_print(prop->visible.expr, r); - str_append(r, "\n"); - } menu = prop->menu->parent; for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) { bool accessible = menu_is_visible(menu); @@ -534,7 +540,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop, location = menu; } if (head && location) { - jump = malloc(sizeof(struct jump_key)); + jump = xmalloc(sizeof(struct jump_key)); if (menu_is_visible(prop->menu)) { /* @@ -547,12 +553,13 @@ static void get_prompt_str(struct gstr *r, struct property *prop, } else jump->target = location; - if (CIRCLEQ_EMPTY(head)) + if (list_empty(head)) jump->index = 0; else - jump->index = CIRCLEQ_LAST(head)->index + 1; + jump->index = list_entry(head->prev, struct jump_key, + entries)->index + 1; - CIRCLEQ_INSERT_TAIL(head, jump, entries); + list_add_tail(&jump->entries, head); } if (i > 0) { @@ -573,10 +580,23 @@ static void get_prompt_str(struct gstr *r, struct property *prop, } } +/* + * get peoperty of type P_SYMBOL + */ +static struct property *get_symbol_prop(struct symbol *sym) +{ + struct property *prop = NULL; + + for_all_properties(sym, prop, P_SYMBOL) + break; + return prop; +} + /* * head is optional and may be NULL */ -void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head) +void get_symbol_str(struct gstr *r, struct symbol *sym, + struct list_head *head) { bool hit; struct property *prop; @@ -596,6 +616,18 @@ void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head) } for_all_prompts(sym, prop) get_prompt_str(r, prop, head); + + prop = get_symbol_prop(sym); + if (prop) { + str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name, + prop->menu->lineno); + if (!expr_is_yes(prop->visible.expr)) { + str_append(r, _(" Depends on: ")); + expr_gstr_print(prop->visible.expr, r); + str_append(r, "\n"); + } + } + hit = false; for_all_properties(sym, prop, P_SELECT) { if (!hit) { @@ -615,7 +647,7 @@ void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head) str_append(r, "\n\n"); } -struct gstr get_relations_str(struct symbol **sym_arr, struct jk_head *head) +struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head) { struct symbol *sym; struct gstr res = str_new(); diff --git a/scripts/kconfig/merge_config.sh b/scripts/kconfig/merge_config.sh index 974d5cb..81b0c61 100755 --- a/scripts/kconfig/merge_config.sh +++ b/scripts/kconfig/merge_config.sh @@ -32,11 +32,13 @@ usage() { echo " -m only merge the fragments, do not execute the make command" echo " -n use allnoconfig instead of alldefconfig" echo " -r list redundant entries when merging fragments" + echo " -O dir to put generated output files" } MAKE=true ALLTARGET=alldefconfig WARNREDUN=false +OUTPUT=. while true; do case $1 in @@ -59,6 +61,16 @@ while true; do shift continue ;; + "-O") + if [ -d $2 ];then + OUTPUT=$(echo $2 | sed 's/\/*$//') + else + echo "output directory $2 does not exist" 1>&2 + exit 1 + fi + shift 2 + continue + ;; *) break ;; @@ -100,25 +112,33 @@ for MERGE_FILE in $MERGE_LIST ; do done if [ "$MAKE" = "false" ]; then - cp $TMP_FILE .config + cp $TMP_FILE $OUTPUT/.config echo "#" - echo "# merged configuration written to .config (needs make)" + echo "# merged configuration written to $OUTPUT/.config (needs make)" echo "#" clean_up exit fi +# If we have an output dir, setup the O= argument, otherwise leave +# it blank, since O=. will create an unnecessary ./source softlink +OUTPUT_ARG="" +if [ "$OUTPUT" != "." ] ; then + OUTPUT_ARG="O=$OUTPUT" +fi + + # Use the merged file as the starting point for: # alldefconfig: Fills in any missing symbols with Kconfig default # allnoconfig: Fills in any missing symbols with # CONFIG_* is not set -make KCONFIG_ALLCONFIG=$TMP_FILE $ALLTARGET +make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET # Check all specified config values took (might have missed-dependency issues) for CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE) - ACTUAL_VAL=$(grep -w -e "$CFG" .config) + ACTUAL_VAL=$(grep -w -e "$CFG" $OUTPUT/.config) if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then echo "Value requested for $CFG not in final .config" echo "Requested value: $REQUESTED_VAL" diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c index 1dac689..7ceeafb 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c @@ -7,215 +7,208 @@ */ #define _GNU_SOURCE #include +#include #include "lkc.h" #include "nconf.h" #include -static const char nconf_readme[] = N_( -"Overview\n" -"--------\n" -"This interface let you select features and parameters for the build.\n" -"Features can either be built-in, modularized, or ignored. Parameters\n" -"must be entered in as decimal or hexadecimal numbers or text.\n" +static const char nconf_global_help[] = N_( +"Help windows\n" +"------------\n" +"o Global help: Unless in a data entry window, pressing will give \n" +" you the global help window, which you are just reading.\n" "\n" -"Menu items beginning with following braces represent features that\n" -" [ ] can be built in or removed\n" -" < > can be built in, modularized or removed\n" -" { } can be built in or modularized (selected by other feature)\n" -" - - are selected by other feature,\n" -" XXX cannot be selected. Use Symbol Info to find out why,\n" -"while *, M or whitespace inside braces means to build in, build as\n" -"a module or to exclude the feature respectively.\n" +"o A short version of the global help is available by pressing .\n" "\n" -"To change any of these features, highlight it with the cursor\n" -"keys and press to build it in, to make it a module or\n" -" to removed it. You may also press the to cycle\n" -"through the available options (ie. Y->N->M->Y).\n" +"o Local help: To get help related to the current menu entry, use any\n" +" of , or if in a data entry window then press .\n" "\n" -"Some additional keyboard hints:\n" "\n" -"Menus\n" -"----------\n" -"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n" -" you wish to change use or . Goto submenu by \n" -" pressing of . Use or to go back.\n" -" Submenus are designated by \"--->\".\n" -"\n" -" Searching: pressing '/' triggers interactive search mode.\n" -" nconfig performs a case insensitive search for the string\n" -" in the menu prompts (no regex support).\n" -" Pressing the up/down keys highlights the previous/next\n" -" matching item. Backspace removes one character from the\n" -" match string. Pressing either '/' again or ESC exits\n" -" search mode. All other keys behave normally.\n" +"Menu entries\n" +"------------\n" +"This interface lets you select features and parameters for the kernel\n" +"build. Kernel features can either be built-in, modularized, or removed.\n" +"Parameters must be entered as text or decimal or hexadecimal numbers.\n" "\n" -" You may also use the and keys to scroll\n" -" unseen options into view.\n" +"Menu entries beginning with following braces represent features that\n" +" [ ] can be built in or removed\n" +" < > can be built in, modularized or removed\n" +" { } can be built in or modularized, are selected by another feature\n" +" - - are selected by another feature\n" +" XXX cannot be selected. Symbol Info tells you why.\n" +"*, M or whitespace inside braces means to build in, build as a module\n" +"or to exclude the feature respectively.\n" "\n" -"o To exit a menu use the just press or .\n" +"To change any of these features, highlight it with the movement keys\n" +"listed below and press to build it in, to make it a module or\n" +" to remove it. You may press the key to cycle through the\n" +"available options.\n" "\n" -"o To get help with an item, press \n" -" Shortcut: Press or .\n" +"A trailing \"--->\" designates a submenu.\n" "\n" "\n" -"Radiolists (Choice lists)\n" -"-----------\n" -"o Use the cursor keys to select the option you wish to set and press\n" -" or the .\n" +"Menu navigation keys\n" +"----------------------------------------------------------------------\n" +"Linewise up \n" +"Linewise down \n" +"Pagewise up \n" +"Pagewise down \n" +"First entry \n" +"Last entry \n" +"Enter a submenu \n" +"Go back to parent menu \n" +"Close a help window \n" +"Close entry window, apply \n" +"Close entry window, forget \n" +"Start incremental, case-insensitive search for STRING in menu entries,\n" +" no regex support, STRING is displayed in upper left corner\n" +" STRING\n" +" Remove last character \n" +" Jump to next hit \n" +" Jump to previous hit \n" +"Exit menu search mode \n" +"Search for configuration variables with or without leading CONFIG_\n" +" RegExpr\n" +"Verbose search help \n" +"----------------------------------------------------------------------\n" "\n" -" Shortcut: Press the first letter of the option you wish to set then\n" -" press or .\n" +"Unless in a data entry window, key <1> may be used instead of ,\n" +"<2> instead of , etc.\n" "\n" -"o To see available help for the item, press \n" -" Shortcut: Press or .\n" "\n" +"Radiolist (Choice list)\n" +"-----------------------\n" +"Use the movement keys listed above to select the option you wish to set\n" +"and press .\n" "\n" -"Data Entry\n" -"-----------\n" -"o Enter the requested information and press \n" -" If you are entering hexadecimal values, it is not necessary to\n" -" add the '0x' prefix to the entry.\n" "\n" -"o For help, press .\n" +"Data entry\n" +"----------\n" +"Enter the requested information and press . Hexadecimal values\n" +"may be entered without the \"0x\" prefix.\n" "\n" "\n" -"Text Box (Help Window)\n" -"--------\n" -"o Use the cursor keys to scroll up/down/left/right. The VI editor\n" -" keys h,j,k,l function here as do , and for\n" -" those who are familiar with less and lynx.\n" +"Text Box (Help Window)\n" +"----------------------\n" +"Use movement keys as listed in table above.\n" "\n" -"o Press , , , , or to exit.\n" +"Press any of to exit.\n" "\n" "\n" -"Alternate Configuration Files\n" +"Alternate configuration files\n" "-----------------------------\n" -"nconfig supports the use of alternate configuration files for\n" -"those who, for various reasons, find it necessary to switch\n" -"between different configurations.\n" +"nconfig supports switching between different configurations.\n" +"Press to save your current configuration. Press and enter\n" +"a file name to load a previously saved configuration.\n" "\n" -"At the end of the main menu you will find two options. One is\n" -"for saving the current configuration to a file of your choosing.\n" -"The other option is for loading a previously saved alternate\n" -"configuration.\n" "\n" -"Even if you don't use alternate configuration files, but you\n" -"find during a nconfig session that you have completely messed\n" -"up your settings, you may use the \"Load Alternate...\" option to\n" -"restore your previously saved settings from \".config\" without\n" -"restarting nconfig.\n" +"Terminal configuration\n" +"----------------------\n" +"If you use nconfig in a xterm window, make sure your TERM environment\n" +"variable specifies a terminal configuration which supports at least\n" +"16 colors. Otherwise nconfig will look rather bad.\n" "\n" -"Other information\n" -"-----------------\n" -"If you use nconfig in an XTERM window make sure you have your\n" -"$TERM variable set to point to a xterm definition which supports color.\n" -"Otherwise, nconfig will look rather bad. nconfig will not\n" -"display correctly in a RXVT window because rxvt displays only one\n" -"intensity of color, bright.\n" +"If the \"stty size\" command reports the current terminalsize correctly,\n" +"nconfig will adapt to sizes larger than the traditional 80x25 \"standard\"\n" +"and display longer menus properly.\n" "\n" -"nconfig will display larger menus on screens or xterms which are\n" -"set to display more than the standard 25 row by 80 column geometry.\n" -"In order for this to work, the \"stty size\" command must be able to\n" -"display the screen's current row and column geometry. I STRONGLY\n" -"RECOMMEND that you make sure you do NOT have the shell variables\n" -"LINES and COLUMNS exported into your environment. Some distributions\n" -"export those variables via /etc/profile. Some ncurses programs can\n" -"become confused when those variables (LINES & COLUMNS) don't reflect\n" -"the true screen size.\n" "\n" -"Optional personality available\n" -"------------------------------\n" -"If you prefer to have all of the options listed in a single menu, rather\n" -"than the default multimenu hierarchy, run the nconfig with NCONFIG_MODE\n" -"environment variable set to single_menu. Example:\n" +"Single menu mode\n" +"----------------\n" +"If you prefer to have all of the menu entries listed in a single menu,\n" +"rather than the default multimenu hierarchy, run nconfig with\n" +"NCONFIG_MODE environment variable set to single_menu. Example:\n" "\n" "make NCONFIG_MODE=single_menu nconfig\n" "\n" -" will then unroll the appropriate category, or enfold it if it\n" -"is already unrolled.\n" +" will then unfold the appropriate category, or fold it if it\n" +"is already unfolded. Folded menu entries will be designated by a\n" +"leading \"++>\" and unfolded entries by a leading \"-->\".\n" "\n" -"Note that this mode can eventually be a little more CPU expensive\n" -"(especially with a larger number of unrolled categories) than the\n" -"default mode.\n" +"Note that this mode can eventually be a little more CPU expensive than\n" +"the default mode, especially with a larger number of unfolded submenus.\n" "\n"), menu_no_f_instructions[] = N_( -" You do not have function keys support. Please follow the\n" -" following instructions:\n" -" Arrow keys navigate the menu.\n" -" or selects submenus --->.\n" -" Capital Letters are hotkeys.\n" -" Pressing includes, excludes, modularizes features.\n" -" Pressing SpaceBar toggles between the above options.\n" -" Press or to go back one menu,\n" -" or for Help, for Search.\n" -" <1> is interchangeable with , <2> with , etc.\n" -" Legend: [*] built-in [ ] excluded module < > module capable.\n" -" always leaves the current window.\n"), +"Legend: [*] built-in [ ] excluded module < > module capable.\n" +"Submenus are designated by a trailing \"--->\".\n" +"\n" +"Use the following keys to navigate the menus:\n" +"Move up or down with and .\n" +"Enter a submenu with or .\n" +"Exit a submenu to its parent menu with or .\n" +"Pressing includes, excludes, modularizes features.\n" +"Pressing cycles through the available options.\n" +"To search for menu entries press .\n" +" always leaves the current window.\n" +"\n" +"You do not have function keys support.\n" +"Press <1> instead of , <2> instead of , etc.\n" +"For verbose global help use key <1>.\n" +"For help related to the current menu entry press or .\n"), menu_instructions[] = N_( -" Arrow keys navigate the menu.\n" -" or selects submenus --->.\n" -" Capital Letters are hotkeys.\n" -" Pressing includes, excludes, modularizes features.\n" -" Pressing SpaceBar toggles between the above options\n" -" Press , or to go back one menu,\n" -" , or for Help, for Search.\n" -" <1> is interchangeable with , <2> with , etc.\n" -" Legend: [*] built-in [ ] excluded module < > module capable.\n" -" always leaves the current window\n"), +"Legend: [*] built-in [ ] excluded module < > module capable.\n" +"Submenus are designated by a trailing \"--->\".\n" +"\n" +"Use the following keys to navigate the menus:\n" +"Move up or down with or .\n" +"Enter a submenu with or .\n" +"Exit a submenu to its parent menu with or .\n" +"Pressing includes, excludes, modularizes features.\n" +"Pressing cycles through the available options.\n" +"To search for menu entries press .\n" +" always leaves the current window.\n" +"\n" +"Pressing <1> may be used instead of , <2> instead of , etc.\n" +"For verbose global help press .\n" +"For help related to the current menu entry press or .\n"), radiolist_instructions[] = N_( -" Use the arrow keys to navigate this window or\n" -" press the hotkey of the item you wish to select\n" -" followed by the .\n" -" Press , or for additional information about this option.\n"), +"Press , , or to navigate a radiolist, select\n" +"with .\n" +"For help related to the current entry press or .\n" +"For global help press .\n"), inputbox_instructions_int[] = N_( "Please enter a decimal value.\n" "Fractions will not be accepted.\n" -"Press to accept, to cancel."), +"Press to apply, to cancel."), inputbox_instructions_hex[] = N_( "Please enter a hexadecimal value.\n" -"Press to accept, to cancel."), +"Press to apply, to cancel."), inputbox_instructions_string[] = N_( "Please enter a string value.\n" -"Press to accept, to cancel."), +"Press to apply, to cancel."), setmod_text[] = N_( -"This feature depends on another which\n" -"has been configured as a module.\n" -"As a result, this feature will be built as a module."), +"This feature depends on another feature which has been configured as a\n" +"module. As a result, the current feature will be built as a module too."), load_config_text[] = N_( "Enter the name of the configuration file you wish to load.\n" -"Accept the name shown to restore the configuration you\n" -"last retrieved. Leave blank to abort."), +"Accept the name shown to restore the configuration you last\n" +"retrieved. Leave empty to abort."), load_config_help[] = N_( -"\n" "For various reasons, one may wish to keep several different\n" "configurations available on a single machine.\n" "\n" "If you have saved a previous configuration in a file other than the\n" -"default one, entering its name here will allow you to modify that\n" -"configuration.\n" +"default one, entering its name here will allow you to load and modify\n" +"that configuration.\n" "\n" -"If you are uncertain, then you have probably never used alternate\n" -"configuration files. You should therefor leave this blank to abort.\n"), +"Leave empty to abort.\n"), save_config_text[] = N_( "Enter a filename to which this configuration should be saved\n" -"as an alternate. Leave blank to abort."), +"as an alternate. Leave empty to abort."), save_config_help[] = N_( -"\n" -"For various reasons, one may wish to keep different configurations\n" -"available on a single machine.\n" +"For various reasons, one may wish to keep several different\n" +"configurations available on a single machine.\n" "\n" "Entering a file name here will allow you to later retrieve, modify\n" "and use the current configuration as an alternate to whatever\n" "configuration options you have selected at that time.\n" "\n" -"If you are uncertain what all this means then you should probably\n" -"leave this blank.\n"), +"Leave empty to abort.\n"), search_help[] = N_( -"\n" -"Search for symbols and display their relations. Regular expressions\n" -"are allowed.\n" -"Example: search for \"^FOO\"\n" +"Search for symbols (configuration variable names CONFIG_*) and display\n" +"their relations. Regular expressions are supported.\n" +"Example: Search for \"^FOO\".\n" "Result:\n" "-----------------------------------------------------------------\n" "Symbol: FOO [ = m]\n" @@ -229,26 +222,26 @@ search_help[] = N_( "Selects: LIBCRC32\n" "Selected by: BAR\n" "-----------------------------------------------------------------\n" -"o The line 'Prompt:' shows the text used in the menu structure for\n" -" this symbol\n" -"o The 'Defined at' line tell at what file / line number the symbol\n" -" is defined\n" -"o The 'Depends on:' line tell what symbols needs to be defined for\n" -" this symbol to be visible in the menu (selectable)\n" -"o The 'Location:' lines tell where in the menu structure this symbol\n" -" is located\n" -" A location followed by a [ = y] indicate that this is a selectable\n" -" menu item - and current value is displayed inside brackets.\n" -"o The 'Selects:' line tell what symbol will be automatically\n" -" selected if this symbol is selected (y or m)\n" -"o The 'Selected by' line tell what symbol has selected this symbol\n" +"o The line 'Prompt:' shows the text displayed for this symbol in\n" +" the menu hierarchy.\n" +"o The 'Defined at' line tells at what file / line number the symbol is\n" +" defined.\n" +"o The 'Depends on:' line lists symbols that need to be defined for\n" +" this symbol to be visible and selectable in the menu.\n" +"o The 'Location:' lines tell, where in the menu structure this symbol\n" +" is located. A location followed by a [ = y] indicates that this is\n" +" a selectable menu item, and the current value is displayed inside\n" +" brackets.\n" +"o The 'Selects:' line tells, what symbol will be automatically selected\n" +" if this symbol is selected (y or m).\n" +"o The 'Selected by' line tells what symbol has selected this symbol.\n" "\n" "Only relevant lines are shown.\n" "\n\n" "Search examples:\n" -"Examples: USB => find all symbols containing USB\n" -" ^USB => find all symbols starting with USB\n" -" USB$ => find all symbols ending with USB\n" +"USB => find all symbols containing USB\n" +"^USB => find all symbols starting with USB\n" +"USB$ => find all symbols ending with USB\n" "\n"); struct mitem { @@ -319,19 +312,19 @@ struct function_keys function_keys[] = { }, { .key_str = "F2", - .func = "Sym Info", + .func = "SymInfo", .key = F_SYMBOL, .handler = handle_f2, }, { .key_str = "F3", - .func = "Insts", + .func = "Help 2", .key = F_INSTS, .handler = handle_f3, }, { .key_str = "F4", - .func = "Config", + .func = "ShowAll", .key = F_CONF, .handler = handle_f4, }, @@ -355,7 +348,7 @@ struct function_keys function_keys[] = { }, { .key_str = "F8", - .func = "Sym Search", + .func = "SymSearch", .key = F_SEARCH, .handler = handle_f8, }, @@ -392,7 +385,7 @@ static void print_function_line(void) static void handle_f1(int *key, struct menu *current_item) { show_scroll_win(main_window, - _("README"), _(nconf_readme)); + _("Global help"), _(nconf_global_help)); return; } @@ -407,7 +400,7 @@ static void handle_f2(int *key, struct menu *current_item) static void handle_f3(int *key, struct menu *current_item) { show_scroll_win(main_window, - _("Instructions"), + _("Short help"), _(current_instructions)); return; } @@ -696,13 +689,18 @@ static void search_conf(void) { struct symbol **sym_arr; struct gstr res; + struct gstr title; char *dialog_input; int dres; + + title = str_new(); + str_printf( &title, _("Enter %s (sub)string to search for " + "(with or without \"%s\")"), CONFIG_, CONFIG_); + again: dres = dialog_inputbox(main_window, _("Search Configuration Parameter"), - _("Enter " CONFIG_ " (sub)string to search for " - "(with or without \"" CONFIG_ "\")"), + str_get(&title), "", &dialog_input_result, &dialog_input_result_len); switch (dres) { case 0: @@ -712,6 +710,7 @@ static void search_conf(void) _("Search Configuration"), search_help); goto again; default: + str_free(&title); return; } @@ -726,6 +725,7 @@ static void search_conf(void) show_scroll_win(main_window, _("Search Results"), str_get(&res)); str_free(&res); + str_free(&title); } diff --git a/scripts/kconfig/nconf.gui.c b/scripts/kconfig/nconf.gui.c index 379003c..9f8c44e 100644 --- a/scripts/kconfig/nconf.gui.c +++ b/scripts/kconfig/nconf.gui.c @@ -48,7 +48,7 @@ static void set_normal_colors(void) init_pair(INPUT_FIELD, -1, -1); init_pair(FUNCTION_HIGHLIGHT, -1, -1); - init_pair(FUNCTION_TEXT, COLOR_BLUE, -1); + init_pair(FUNCTION_TEXT, COLOR_YELLOW, -1); } /* available attributes: diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index df274fe..1500c38 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc @@ -6,6 +6,7 @@ #include #if QT_VERSION < 0x040000 +#include #include #include #include diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index 22a3c40..ecc5aa5 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -656,11 +656,11 @@ bool sym_set_string_value(struct symbol *sym, const char *newval) size = strlen(newval) + 1; if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { size += 2; - sym->def[S_DEF_USER].val = val = malloc(size); + sym->def[S_DEF_USER].val = val = xmalloc(size); *val++ = '0'; *val++ = 'x'; } else if (!oldval || strcmp(oldval, newval)) - sym->def[S_DEF_USER].val = val = malloc(size); + sym->def[S_DEF_USER].val = val = xmalloc(size); else return true; @@ -812,7 +812,7 @@ struct symbol *sym_lookup(const char *name, int flags) hash = 0; } - symbol = malloc(sizeof(*symbol)); + symbol = xmalloc(sizeof(*symbol)); memset(symbol, 0, sizeof(*symbol)); symbol->name = new_name; symbol->type = S_UNKNOWN; @@ -863,7 +863,7 @@ const char *sym_expand_string_value(const char *in) size_t reslen; reslen = strlen(in) + 1; - res = malloc(reslen); + res = xmalloc(reslen); res[0] = '\0'; while ((src = strchr(in, '$'))) { @@ -921,7 +921,7 @@ const char *sym_escape_string_value(const char *in) p++; } - res = malloc(reslen); + res = xmalloc(reslen); res[0] = '\0'; strcat(res, "\""); @@ -1228,7 +1228,7 @@ struct property *prop_alloc(enum prop_type type, struct symbol *sym) struct property *prop; struct property **propp; - prop = malloc(sizeof(*prop)); + prop = xmalloc(sizeof(*prop)); memset(prop, 0, sizeof(*prop)); prop->type = type; prop->sym = sym; diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c index d0b8b23..6e7fbf1 100644 --- a/scripts/kconfig/util.c +++ b/scripts/kconfig/util.c @@ -23,7 +23,7 @@ struct file *file_lookup(const char *name) } } - file = malloc(sizeof(*file)); + file = xmalloc(sizeof(*file)); memset(file, 0, sizeof(*file)); file->name = file_name; file->next = file_list; @@ -81,7 +81,7 @@ int file_write_dep(const char *name) struct gstr str_new(void) { struct gstr gs; - gs.s = malloc(sizeof(char) * 64); + gs.s = xmalloc(sizeof(char) * 64); gs.len = 64; gs.max_width = 0; strcpy(gs.s, "\0"); @@ -138,3 +138,22 @@ const char *str_get(struct gstr *gs) return gs->s; } +void *xmalloc(size_t size) +{ + void *p = malloc(size); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + +void *xcalloc(size_t nmemb, size_t size) +{ + void *p = calloc(nmemb, size); + if (p) + return p; + fprintf(stderr, "Out of memory.\n"); + exit(1); +} + + diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l index 00f9d3a..6555a47 100644 --- a/scripts/kconfig/zconf.l +++ b/scripts/kconfig/zconf.l @@ -40,7 +40,7 @@ static void zconf_endfile(void); static void new_string(void) { - text = malloc(START_STRSIZE); + text = xmalloc(START_STRSIZE); text_asize = START_STRSIZE; text_size = 0; *text = 0; @@ -62,7 +62,7 @@ static void append_string(const char *str, int size) static void alloc_string(const char *str, int size) { - text = malloc(size + 1); + text = xmalloc(size + 1); memcpy(text, str, size); text[size] = 0; } @@ -288,7 +288,7 @@ void zconf_initscan(const char *name) exit(1); } - current_buf = malloc(sizeof(*current_buf)); + current_buf = xmalloc(sizeof(*current_buf)); memset(current_buf, 0, sizeof(*current_buf)); current_file = file_lookup(name); @@ -299,7 +299,7 @@ void zconf_nextfile(const char *name) { struct file *iter; struct file *file = file_lookup(name); - struct buffer *buf = malloc(sizeof(*buf)); + struct buffer *buf = xmalloc(sizeof(*buf)); memset(buf, 0, sizeof(*buf)); current_buf->state = YY_CURRENT_BUFFER; diff --git a/scripts/kconfig/zconf.lex.c_shipped b/scripts/kconfig/zconf.lex.c_shipped index c32b1a4..a0521aa 100644 --- a/scripts/kconfig/zconf.lex.c_shipped +++ b/scripts/kconfig/zconf.lex.c_shipped @@ -802,7 +802,7 @@ static void zconf_endfile(void); static void new_string(void) { - text = malloc(START_STRSIZE); + text = xmalloc(START_STRSIZE); text_asize = START_STRSIZE; text_size = 0; *text = 0; @@ -824,7 +824,7 @@ static void append_string(const char *str, int size) static void alloc_string(const char *str, int size) { - text = malloc(size + 1); + text = xmalloc(size + 1); memcpy(text, str, size); text[size] = 0; } @@ -2343,7 +2343,7 @@ void zconf_initscan(const char *name) exit(1); } - current_buf = malloc(sizeof(*current_buf)); + current_buf = xmalloc(sizeof(*current_buf)); memset(current_buf, 0, sizeof(*current_buf)); current_file = file_lookup(name); @@ -2354,7 +2354,7 @@ void zconf_nextfile(const char *name) { struct file *iter; struct file *file = file_lookup(name); - struct buffer *buf = malloc(sizeof(*buf)); + struct buffer *buf = xmalloc(sizeof(*buf)); memset(buf, 0, sizeof(*buf)); current_buf->state = YY_CURRENT_BUFFER; diff --git a/scripts/lib/ptxd_lib_dgen.awk b/scripts/lib/ptxd_lib_dgen.awk index 782f134..7f790c9 100644 --- a/scripts/lib/ptxd_lib_dgen.awk +++ b/scripts/lib/ptxd_lib_dgen.awk @@ -199,15 +199,7 @@ function write_include(this_PKG) { # # include this rules file # - - #If there is more than on PACKAGE- line in a .make file we do not want to include this file - # several times as we get a lot of warnings. - #This checks if file has been already included and if so doesn't include it another time. - pkgfilename = PKG_to_filename[this_PKG]; - if (!(pkgfilename in pkgfilename_included)) { - print "include " pkgfilename > DGEN_RULESFILES_MAKE; - pkgfilename_included[pkgfilename] = 1; - } + print "include " PKG_to_filename[this_PKG] > DGEN_RULESFILES_MAKE; } function write_vars_pkg_all(this_PKG, this_pkg, prefix) { diff --git a/scripts/lib/ptxd_lib_kgen.sh b/scripts/lib/ptxd_lib_kgen.sh index d9ae0ae..c50df13 100644 --- a/scripts/lib/ptxd_lib_kgen.sh +++ b/scripts/lib/ptxd_lib_kgen.sh @@ -90,8 +90,7 @@ EOF # transmogrify part into subdir local oldIFS="$IFS" case "${kgen_part}" in - ptx) IFS=: kgen_dirs=( ${PTXDIST_PATH_RULES} ) ;; - platform) IFS=: kgen_dirs=( ${PTXDIST_PATH_PLATFORMS} ) ;; + ptx|platform) IFS=: kgen_dirs=( ${PTXDIST_PATH_RULES} ${PTXDIST_PATH_PLATFORMS} ) ;; board|user|collection) return 0 ;; *) cat < /dev/null; then + ptxd_bailout "git: tag '${tag}' not found in '${url}'" + fi && + + git --git-dir="${mirror}" archive --prefix="${prefix}" -o "${path}" "${tag}" +} +export -f ptxd_make_get_git + + +# +# in env: +# +# ${path} : local file name +# ${url} : the url to download +# ${opts[]} : an array of options +# +ptxd_make_get_svn() { + set -- "${opts[@]}" + unset opts + local rev + local tarcomp + local mirror="${url#[a-z]*//}" + mirror="$(dirname "${path}")/${mirror//\//.}" + local prefix="$(basename "${path}")" + prefix="${prefix%.tar.*}" + + case "${path}" in + *.tar.gz) + tarcomp="--gzip" + ;; + *.tar.bz2) + tarcomp="--bzip2" + ;; + *.tar.xz) + tarcomp="--xz" + ;; + *) + ptxd_bailout "Only .tar.gz, .tar.bz2, .tar.xz and archives are supported for svn downloads." + ;; + esac + + # + # scan for valid options + # + while [ ${#} -ne 0 ]; do + local opt="${1}" + shift + + case "${opt}" in + rev=*) + rev="${opt#rev=}" + ;; + *) + ptxd_bailout "invalid option '${opt}' to ${FUNCNAME}" + ;; + esac + done + unset opt + + if [ -z "${rev}" ]; then + ptxd_bailout "svn url '${url}' has no 'rev' option" + fi + + echo "${PROMPT}svn: fetching '${url} into '${mirror}'..." + if [ ! -d "${mirror}" ]; then + svn checkout -r ${rev} "${url}" "${mirror}" + else + svn update -r ${rev} "${mirror}" + fi && + lmtime=$(svn info -r ${rev} "${mirror}" | \ + awk '/^Last Changed Date:/ {print $4 " " $5 " " $6}') && + echo "${PROMPT}svn: last modification time '${lmtime}'" && + tar --exclude-vcs --show-stored-names ${tarcomp} \ + --mtime="${lmtime}" --transform "s|^\.|${prefix}|g" \ + --create --file "${path}" -C "${mirror}" . +} +export -f ptxd_make_get_svn + + # # check if download is disabled # @@ -154,6 +292,30 @@ ptxd_make_get() { mrd=true fi ;; + git://*|http://*".git;"*|https://*".git;"*) + # restrict donwload only to the PTXMIRROR + if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then + # keep original URL + argv[${#argv[@]}]="${url}" + fi + # add mirror to URLs, but only once + if ! ${mrd}; then + ptxmirror_url="${path/#\/*\//${PTXCONF_SETUP_PTXMIRROR}/}" + mrd=true + fi + ;; + svn://*) + # restrict donwload only to the PTXMIRROR + if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then + # keep original URL + argv[${#argv[@]}]="${url}" + fi + # add mirror to URLs, but only once + if ! ${mrd}; then + ptxmirror_url="${path/#\/*\//${PTXCONF_SETUP_PTXMIRROR}/}" + mrd=true + fi + ;; http://*|https://*|ftp://*) # restrict donwload only to the PTXMIRROR if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then @@ -196,6 +358,14 @@ ptxd_make_get() { shift case "${url}" in + git://*|http://*.git|https://*.git) + ptxd_make_get_download_permitted && + ptxd_make_get_git && return + ;; + svn://*) + ptxd_make_get_download_permitted && + ptxd_make_get_svn && return + ;; http://*|https://*|ftp://*) ptxd_make_get_download_permitted && ptxd_make_get_http && return diff --git a/scripts/lib/ptxd_make_world_patchin.sh b/scripts/lib/ptxd_make_world_patchin.sh index 5d008e3..d3787b5 100644 --- a/scripts/lib/ptxd_make_world_patchin.sh +++ b/scripts/lib/ptxd_make_world_patchin.sh @@ -89,7 +89,7 @@ export -f ptxd_make_world_patchin_apply_git_init # create a directory containing the patches and the selected series # file. name that file "series". # -# decompress "bz2" and "gz" patches on the fly +# decompress "bz2", "gz" and "xz" patches on the fly # ptxd_make_world_patchin_apply_git_compat() { @@ -119,6 +119,7 @@ ptxd_make_world_patchin_apply_git_compat() ""|"#"*) continue ;; # skip empty lines and comments *.gz) cat="zcat" ;; *.bz2) cat="bzcat" ;; + *.xz) cat="xzcat" ;; *) ln -s "../patches/${patch}" "${pkg_patchin_dir}/.ptxdist/git-patches/${patch_file}" && echo "${patch_file}" "${para}" >> "${pkg_patchin_dir}/.ptxdist/git-patches/series" || return @@ -201,6 +202,7 @@ ptxd_make_world_patchin_apply_patch() ""|"#"*) continue ;; # skip empty lines and comments *.gz) cat=zcat ;; *.bz2) cat=bzcat ;; + *.xz) cat=xzcat ;; *) cat=cat ;; esac @@ -289,6 +291,7 @@ ptxd_make_world_patchin_apply() find \ -name "*.diff" -o \ -name "*.patch" -o \ + -name "*.xz" -o \ -name "*.bz2" -o \ -name "*.gz" | \ sed -e "s:^[.]/::" | sort > \ diff --git a/scripts/lib/ptxd_make_xpkg_pkg.sh b/scripts/lib/ptxd_make_xpkg_pkg.sh index 476ad58..17d3ff4 100644 --- a/scripts/lib/ptxd_make_xpkg_pkg.sh +++ b/scripts/lib/ptxd_make_xpkg_pkg.sh @@ -694,7 +694,7 @@ ptxd_install_shared() { ptxd_install_file "${src}" "${dst}/${filename}" "${usr}" "${grp}" "${mod}" && - find "$(dirname "${src}")" -maxdepth 1 -type l | while read file; do + find -H "$(dirname "${src}")" -maxdepth 1 -type l | while read file; do if [ "$(basename "$(readlink -f "${file}")")" = "${filename}" ]; then local link="${dst}/$(basename "${file}")" ptxd_install_ln "${filename}" "${link}" "${usr}" "${grp}" || return diff --git a/scripts/migrate/migrate_ptx b/scripts/migrate/migrate_ptx index 85d4edb..833701c 100755 --- a/scripts/migrate/migrate_ptx +++ b/scripts/migrate/migrate_ptx @@ -203,3 +203,11 @@ s/^\(\(# \)\?PTXCONF_\)GLIBC\(_LOCALTIME\)/\1TIMEZONE\3/ # reason : allign with target package name # s/^\(\(# \)\?PTXCONF_HOST\)_LIBBZ2/\1_BZIP2/ + +# +# from : ptxdist-2013.04.0 +# to : ptxdist-2013.05.0 +# symbol : GST*11 -> GST*1 +# reason : allign with target package name +# +s/^\(\(# \)\?PTXCONF_GST[A-Z_]*1\)1/\1/ diff --git a/scripts/ptx-modifications/0001-conf-add-an-option-to-output-the-dependency-informat.patch b/scripts/ptx-modifications/0001-conf-add-an-option-to-output-the-dependency-informat.patch index a6eadf1..c88b3d5 100644 --- a/scripts/ptx-modifications/0001-conf-add-an-option-to-output-the-dependency-informat.patch +++ b/scripts/ptx-modifications/0001-conf-add-an-option-to-output-the-dependency-informat.patch @@ -1,18 +1,17 @@ -From 72a38d63dbcb7c4dfdcd32ba4f14600d2ea55c4b Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Mon, 1 Nov 2010 19:49:21 +0100 Subject: [PATCH] conf: add an option to output the dependency information Signed-off-by: Michael Olbrich --- - scripts/kconfig/conf.c | 39 +++++++++++++++++++++++++++++++++++++++ + scripts/kconfig/conf.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c -index 4da3b4a..9f5db95 100644 +index bde5b95..08d372a 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c -@@ -33,6 +33,7 @@ enum input_mode { +@@ -34,6 +34,7 @@ enum input_mode { savedefconfig, listnewconfig, olddefconfig, @@ -20,7 +19,7 @@ index 4da3b4a..9f5db95 100644 } input_mode = oldaskconfig; static int indent = 1; -@@ -442,6 +443,36 @@ static void check_conf(struct menu *menu) +@@ -446,6 +447,36 @@ static void check_conf(struct menu *menu) check_conf(child); } @@ -57,7 +56,7 @@ index 4da3b4a..9f5db95 100644 static struct option long_opts[] = { {"oldaskconfig", no_argument, NULL, oldaskconfig}, {"oldconfig", no_argument, NULL, oldconfig}, -@@ -461,6 +492,7 @@ static struct option long_opts[] = { +@@ -465,6 +496,7 @@ static struct option long_opts[] = { * value but not 'n') with the counter-intuitive name. */ {"oldnoconfig", no_argument, NULL, olddefconfig}, @@ -65,7 +64,7 @@ index 4da3b4a..9f5db95 100644 {NULL, 0, NULL, 0} }; -@@ -490,6 +522,7 @@ int main(int ac, char **av) +@@ -494,6 +526,7 @@ int main(int ac, char **av) int opt; const char *name, *defconfig_file = NULL /* gcc uninit */; struct stat tmpstat; @@ -73,7 +72,7 @@ index 4da3b4a..9f5db95 100644 setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); -@@ -498,6 +531,10 @@ int main(int ac, char **av) +@@ -504,6 +537,10 @@ int main(int ac, char **av) while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) { input_mode = (enum input_mode)opt; switch (opt) { @@ -84,7 +83,7 @@ index 4da3b4a..9f5db95 100644 case silentoldconfig: sync_kconfig = 1; break; -@@ -663,6 +700,8 @@ int main(int ac, char **av) +@@ -678,6 +715,8 @@ int main(int ac, char **av) input_mode != olddefconfig)); break; } diff --git a/scripts/ptx-modifications/0002-conf-don-t-output-autoconf-stuff.patch b/scripts/ptx-modifications/0002-conf-don-t-output-autoconf-stuff.patch index 07275ae..32a7940 100644 --- a/scripts/ptx-modifications/0002-conf-don-t-output-autoconf-stuff.patch +++ b/scripts/ptx-modifications/0002-conf-don-t-output-autoconf-stuff.patch @@ -1,19 +1,18 @@ -From 9bc155c85184bdcfeec11973d9ae675f92994d8a Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Mon, 1 Nov 2010 19:49:34 +0100 Subject: [PATCH] conf: don't output autoconf stuff Signed-off-by: Michael Olbrich --- - scripts/kconfig/conf.c | 2 ++ - scripts/kconfig/confdata.c | 2 ++ + scripts/kconfig/conf.c | 2 ++ + scripts/kconfig/confdata.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c -index 9f5db95..fbac5e8 100644 +index 08d372a..7ecdc14 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c -@@ -711,10 +711,12 @@ int main(int ac, char **av) +@@ -726,10 +726,12 @@ int main(int ac, char **av) fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n")); exit(1); } @@ -27,7 +26,7 @@ index 9f5db95..fbac5e8 100644 if (conf_write_defconfig(defconfig_file)) { fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"), diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c -index 13ddf11..e0dd10b 100644 +index 43eda40..928cb7b 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -939,6 +939,7 @@ out: diff --git a/scripts/ptx-modifications/0003-Revert-kconfig-make-comments-stand-out-in-menuconfig.patch b/scripts/ptx-modifications/0003-Revert-kconfig-make-comments-stand-out-in-menuconfig.patch index df7ccc2..ae68a71 100644 --- a/scripts/ptx-modifications/0003-Revert-kconfig-make-comments-stand-out-in-menuconfig.patch +++ b/scripts/ptx-modifications/0003-Revert-kconfig-make-comments-stand-out-in-menuconfig.patch @@ -1,4 +1,3 @@ -From f9f72e3b50d3c43d88879452fbb14ae369523a42 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Thu, 11 Nov 2010 06:01:25 +0100 Subject: [PATCH] Revert "kconfig: make comments stand out in menuconfig" @@ -20,14 +19,14 @@ This reverts commit 48874077ddd6c0c444758059af2cf77c10204ece Signed-off-by: Marc Kleine-Budde Signed-off-by: Michael Olbrich --- - scripts/kconfig/mconf.c | 8 -------- + scripts/kconfig/mconf.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c -index 48f6744..04d58b0 100644 +index a69cbd7..a67c307 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c -@@ -441,14 +441,6 @@ static void build_conf(struct menu *menu) +@@ -505,14 +505,6 @@ static void build_conf(struct menu *menu) if (single_menu_mode && menu->data) goto conf_childs; return; diff --git a/scripts/ptx-modifications/0004-Revert-kconfig-ignore-select-of-unknown-symbol.patch b/scripts/ptx-modifications/0004-Revert-kconfig-ignore-select-of-unknown-symbol.patch index 6309f34..75eea38 100644 --- a/scripts/ptx-modifications/0004-Revert-kconfig-ignore-select-of-unknown-symbol.patch +++ b/scripts/ptx-modifications/0004-Revert-kconfig-ignore-select-of-unknown-symbol.patch @@ -1,4 +1,3 @@ -From c7a4639c729b5700c89ddcc8a7d932b3b55478e7 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Thu, 11 Nov 2010 06:00:37 +0100 Subject: [PATCH] Revert "kconfig: ignore select of unknown symbol" @@ -21,14 +20,14 @@ This reverts commit 603d49885e023d1f68c627c2a2db599fb40eefec Signed-off-by: Marc Kleine-Budde Signed-off-by: Michael Olbrich --- - scripts/kconfig/menu.c | 9 ++++++--- + scripts/kconfig/menu.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c -index a3cade6..5d5ff16 100644 +index fd3f018..395521c 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c -@@ -237,9 +237,12 @@ static void sym_check_prop(struct symbol *sym) +@@ -250,9 +250,12 @@ static void sym_check_prop(struct symbol *sym) prop_warn(prop, "config symbol '%s' uses select, but is " "not boolean or tristate", sym->name); diff --git a/scripts/ptx-modifications/0005-nconf-remove-special-P_COMMENT-output.patch b/scripts/ptx-modifications/0005-nconf-remove-special-P_COMMENT-output.patch index 31e31c5..c9a195d 100644 --- a/scripts/ptx-modifications/0005-nconf-remove-special-P_COMMENT-output.patch +++ b/scripts/ptx-modifications/0005-nconf-remove-special-P_COMMENT-output.patch @@ -1,4 +1,3 @@ -From 75671d19736751b8bdf2714598f0a908ddef08b6 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Tue, 2 Nov 2010 20:16:11 +0100 Subject: [PATCH] nconf: remove special P_COMMENT output @@ -7,11 +6,11 @@ This is like the patch reversing 48874077ddd6c0c444758059af2cf77c10204ece Signed-off-by: Michael Olbrich --- - scripts/kconfig/nconf.c | 9 --------- + scripts/kconfig/nconf.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c -index 87d4b15..1dac689 100644 +index dbf31ed..7ceeafb 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c @@ -766,15 +766,6 @@ static void build_conf(struct menu *menu) diff --git a/scripts/ptx-modifications/0006-mconf-fix-comment-on-exit.patch b/scripts/ptx-modifications/0006-mconf-fix-comment-on-exit.patch index 4dc5682..5b9b56d 100644 --- a/scripts/ptx-modifications/0006-mconf-fix-comment-on-exit.patch +++ b/scripts/ptx-modifications/0006-mconf-fix-comment-on-exit.patch @@ -1,18 +1,17 @@ -From b31a6a3a86cf79dac4017df51aa69da9be8c2862 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Sat, 13 Oct 2012 10:39:47 +0200 Subject: [PATCH] mconf: fix comment on exit Signed-off-by: Michael Olbrich --- - scripts/kconfig/mconf.c | 2 +- + scripts/kconfig/mconf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c -index 04d58b0..0fe09e3 100644 +index a67c307..5ce66af 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c -@@ -886,7 +886,7 @@ static int handle_exit(void) +@@ -970,7 +970,7 @@ static int handle_exit(void) case -1: printf(_("\n\n" "*** End of the configuration.\n" diff --git a/scripts/ptx-modifications/series b/scripts/ptx-modifications/series index 621ad86..b2839fd 100644 --- a/scripts/ptx-modifications/series +++ b/scripts/ptx-modifications/series @@ -8,4 +8,3 @@ 0004-Revert-kconfig-ignore-select-of-unknown-symbol.patch 0005-nconf-remove-special-P_COMMENT-output.patch 0006-mconf-fix-comment-on-exit.patch -0007-kconfig-define-CIRCLEQ_-macros-when-needed.patch diff --git a/tests/libptxdisttest.sh b/tests/libptxdisttest.sh index c14d6a7..783a542 100644 --- a/tests/libptxdisttest.sh +++ b/tests/libptxdisttest.sh @@ -123,9 +123,11 @@ test_begin() { } test_end() { + local ret="$?" reportwrite time end echo "" >> "$REPORTFILE" if [ "$exit_now" = "1" ]; then exit 1; fi + return "${ret}" } checking() { From c79241459d94769aba01ca58f8d26b8c814dfd8e Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 15 Sep 2013 16:01:24 +0200 Subject: [PATCH 02/20] change url for orc --- rules/orc.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/orc.make b/rules/orc.make index 67e5ebb..212c8f8 100644 --- a/rules/orc.make +++ b/rules/orc.make @@ -20,7 +20,7 @@ ORC_VERSION := 0.4.18 ORC_MD5 := 1a2552e8d127526c48d644fe6437b377 ORC := orc-$(ORC_VERSION) ORC_SUFFIX := tar.gz -ORC_URL := http://code.entropywave.com/download/orc/$(ORC).$(ORC_SUFFIX) +ORC_URL := http://gstreamer.freedesktop.org/data/src/orc/$(ORC).$(ORC_SUFFIX) ORC_SOURCE := $(SRCDIR)/$(ORC).$(ORC_SUFFIX) ORC_DIR := $(BUILDDIR)/$(ORC) ORC_LICENSE := unknown From 2b0fca53a6e4044563b8c9894837cec5a5aaf3e6 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 15 Sep 2013 16:20:04 +0200 Subject: [PATCH 03/20] pkg-config add depends to libtool --- rules/host-pkg-config.in | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/host-pkg-config.in b/rules/host-pkg-config.in index c3f0aed..d096655 100644 --- a/rules/host-pkg-config.in +++ b/rules/host-pkg-config.in @@ -2,5 +2,6 @@ config HOST_PKG_CONFIG tristate + select HOST_AUTOTOOLS_LIBTOOL default ALLYES From 04bfb2a86ef48f70eb18e0df4552d8b0e6e731c2 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 15 Sep 2013 19:32:18 +0200 Subject: [PATCH 04/20] revert make sure that a .make file is never included more than once --- scripts/lib/ptxd_lib_dgen.awk | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/lib/ptxd_lib_dgen.awk b/scripts/lib/ptxd_lib_dgen.awk index 7f790c9..970b454 100644 --- a/scripts/lib/ptxd_lib_dgen.awk +++ b/scripts/lib/ptxd_lib_dgen.awk @@ -199,7 +199,16 @@ function write_include(this_PKG) { # # include this rules file # - print "include " PKG_to_filename[this_PKG] > DGEN_RULESFILES_MAKE; + + #If there is more than on PACKAGE- line in a .make file we do not want to include this file + # several times as we get a lot of warnings. + #This checks if file has been already included and if so doesn't include it another time. + pkgfilename = PKG_to_filename[this_PKG]; + if (!(pkgfilename in pkgfilename_included)) + { + print "include " pkgfilename > DGEN_RULESFILES_MAKE; + pkgfilename_included[pkgfilename] = 1; + } } function write_vars_pkg_all(this_PKG, this_pkg, prefix) { From 6638dfd13244f4df1eab17224818b5a754569d82 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Mon, 16 Sep 2013 23:55:13 +0200 Subject: [PATCH 05/20] fix autogen.sh --- patches/DeviceKit-disks-009/autogen.sh | 2 +- patches/DirectFB-1.4.3/autogen.sh | 2 +- patches/Frodo-4.1b/autogen-generic.sh | 2 +- patches/MesaLib-8.0.3/autogen.sh | 2 +- patches/at-3.1.12/autogen.sh | 2 +- patches/audiofile-0.3.4/autogen.sh | 2 +- patches/bridge-utils-1.5/autogen.sh | 2 +- patches/cgicc-3.2.9/autogen.sh | 2 +- patches/cppunit-1.12.1/autogen.sh | 2 +- patches/eggdbus-0.6/autogen.sh | 2 +- patches/evtest-1.25/autogen.sh | 2 +- patches/fam-2.7.0/autogen.sh | 2 +- patches/fcgi-2.4.0/autogen.sh | 2 +- patches/fontconfig-2.6.0/autogen.sh | 2 +- patches/glademm-2.6.0/autogen.sh | 2 +- patches/glib-2.34.3/autogen.sh | 2 +- patches/grub-0.97/autogen.sh | 2 +- patches/ima-evm-utils-0.2/autogen.sh | 2 +- patches/inotify-tools-3.13/autogen.sh | 2 +- patches/iozone3_327/autogen.sh | 2 +- patches/libdbus-c++-r9139/autogen.sh | 2 +- patches/libdmtx-0.7.2/autogen.sh | 2 +- patches/libffi-3.0.13/autogen.sh | 2 +- patches/libical-0.46/autogen.sh | 2 +- patches/libmad-0.15.1b/autogen.sh | 2 +- patches/libmemcache-1.4.0.rc2/autogen.sh | 2 +- patches/libmemcached-0.44/autogen.sh | 2 +- patches/libmng-1.0.10/autogen.sh | 2 +- patches/libnet-1.1.4/autogen.sh | 2 +- patches/lmbench-3.0-a9/autogen.sh | 2 +- patches/lua-5.1.4/autogen.sh | 2 +- patches/mod_python-3.3.1/autogen-generic.sh | 2 +- .../0001-make-ubifs-optional.patch | 23 ------- ...Make-liblzo-optional-for-ubifs-tools.patch | 68 ------------------- ..._otp_write-fix-format-string-warning.patch | 30 -------- ...fix-writing-to-NAND-in-presence-of-p.patch | 61 ----------------- ...fix-a-buffer-overflow-on-NAND-with-w.patch | 35 ---------- ...ild-and-install-flash_otp_lock-and-f.patch | 42 ------------ patches/mxs-utils-2011.06.0/autogen.sh | 2 +- patches/mysql-5.1.14-beta/autogen.sh | 2 +- patches/opkg-0.1.8/autogen.sh | 2 +- patches/owfs-2.8p6/autogen.sh | 2 +- patches/polkit-0.96/autogen.sh | 2 +- patches/poppler-0.18.0/autogen.sh | 2 +- patches/serdisplib-1.97.9/autogen.sh | 2 +- patches/splashutils-1.5.4.3/autogen.sh | 2 +- patches/ssmtp-2.64/autogen.sh | 2 +- patches/tslib-1.0/autogen.sh | 2 +- patches/udisks-1.0.0/autogen.sh | 2 +- patches/usplash_0.5.49/autogen.sh | 2 +- patches/valgrind-3.8.1/autogen.sh | 2 +- patches/wireshark-1.2.5/autogen-generic.sh | 2 +- patches/xmlstarlet-1.0.1/autogen.sh | 2 +- patches/xorg-server-1.12.2/autogen.sh | 2 +- 54 files changed, 48 insertions(+), 307 deletions(-) delete mode 100644 patches/mtd-utils-1.5.0/0001-make-ubifs-optional.patch delete mode 100644 patches/mtd-utils-1.5.0/0002-Make-liblzo-optional-for-ubifs-tools.patch delete mode 100644 patches/mtd-utils-1.5.0/0003-flash_otp_write-fix-format-string-warning.patch delete mode 100644 patches/mtd-utils-1.5.0/0004-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch delete mode 100644 patches/mtd-utils-1.5.0/0005-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch delete mode 100644 patches/mtd-utils-1.5.0/0006-Makefile-also-build-and-install-flash_otp_lock-and-f.patch diff --git a/patches/DeviceKit-disks-009/autogen.sh b/patches/DeviceKit-disks-009/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/DeviceKit-disks-009/autogen.sh +++ b/patches/DeviceKit-disks-009/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/DirectFB-1.4.3/autogen.sh b/patches/DirectFB-1.4.3/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/DirectFB-1.4.3/autogen.sh +++ b/patches/DirectFB-1.4.3/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/Frodo-4.1b/autogen-generic.sh b/patches/Frodo-4.1b/autogen-generic.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/Frodo-4.1b/autogen-generic.sh +++ b/patches/Frodo-4.1b/autogen-generic.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/MesaLib-8.0.3/autogen.sh b/patches/MesaLib-8.0.3/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/MesaLib-8.0.3/autogen.sh +++ b/patches/MesaLib-8.0.3/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/at-3.1.12/autogen.sh b/patches/at-3.1.12/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/at-3.1.12/autogen.sh +++ b/patches/at-3.1.12/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/audiofile-0.3.4/autogen.sh b/patches/audiofile-0.3.4/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/audiofile-0.3.4/autogen.sh +++ b/patches/audiofile-0.3.4/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/bridge-utils-1.5/autogen.sh b/patches/bridge-utils-1.5/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/bridge-utils-1.5/autogen.sh +++ b/patches/bridge-utils-1.5/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/cgicc-3.2.9/autogen.sh b/patches/cgicc-3.2.9/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/cgicc-3.2.9/autogen.sh +++ b/patches/cgicc-3.2.9/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/cppunit-1.12.1/autogen.sh b/patches/cppunit-1.12.1/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/cppunit-1.12.1/autogen.sh +++ b/patches/cppunit-1.12.1/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/eggdbus-0.6/autogen.sh b/patches/eggdbus-0.6/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/eggdbus-0.6/autogen.sh +++ b/patches/eggdbus-0.6/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/evtest-1.25/autogen.sh b/patches/evtest-1.25/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/evtest-1.25/autogen.sh +++ b/patches/evtest-1.25/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/fam-2.7.0/autogen.sh b/patches/fam-2.7.0/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/fam-2.7.0/autogen.sh +++ b/patches/fam-2.7.0/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/fcgi-2.4.0/autogen.sh b/patches/fcgi-2.4.0/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/fcgi-2.4.0/autogen.sh +++ b/patches/fcgi-2.4.0/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/fontconfig-2.6.0/autogen.sh b/patches/fontconfig-2.6.0/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/fontconfig-2.6.0/autogen.sh +++ b/patches/fontconfig-2.6.0/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/glademm-2.6.0/autogen.sh b/patches/glademm-2.6.0/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/glademm-2.6.0/autogen.sh +++ b/patches/glademm-2.6.0/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/glib-2.34.3/autogen.sh b/patches/glib-2.34.3/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/glib-2.34.3/autogen.sh +++ b/patches/glib-2.34.3/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/grub-0.97/autogen.sh b/patches/grub-0.97/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/grub-0.97/autogen.sh +++ b/patches/grub-0.97/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/ima-evm-utils-0.2/autogen.sh b/patches/ima-evm-utils-0.2/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/ima-evm-utils-0.2/autogen.sh +++ b/patches/ima-evm-utils-0.2/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/inotify-tools-3.13/autogen.sh b/patches/inotify-tools-3.13/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/inotify-tools-3.13/autogen.sh +++ b/patches/inotify-tools-3.13/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/iozone3_327/autogen.sh b/patches/iozone3_327/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/iozone3_327/autogen.sh +++ b/patches/iozone3_327/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libdbus-c++-r9139/autogen.sh b/patches/libdbus-c++-r9139/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libdbus-c++-r9139/autogen.sh +++ b/patches/libdbus-c++-r9139/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libdmtx-0.7.2/autogen.sh b/patches/libdmtx-0.7.2/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libdmtx-0.7.2/autogen.sh +++ b/patches/libdmtx-0.7.2/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libffi-3.0.13/autogen.sh b/patches/libffi-3.0.13/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libffi-3.0.13/autogen.sh +++ b/patches/libffi-3.0.13/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libical-0.46/autogen.sh b/patches/libical-0.46/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libical-0.46/autogen.sh +++ b/patches/libical-0.46/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libmad-0.15.1b/autogen.sh b/patches/libmad-0.15.1b/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libmad-0.15.1b/autogen.sh +++ b/patches/libmad-0.15.1b/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libmemcache-1.4.0.rc2/autogen.sh b/patches/libmemcache-1.4.0.rc2/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libmemcache-1.4.0.rc2/autogen.sh +++ b/patches/libmemcache-1.4.0.rc2/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libmemcached-0.44/autogen.sh b/patches/libmemcached-0.44/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libmemcached-0.44/autogen.sh +++ b/patches/libmemcached-0.44/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libmng-1.0.10/autogen.sh b/patches/libmng-1.0.10/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libmng-1.0.10/autogen.sh +++ b/patches/libmng-1.0.10/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/libnet-1.1.4/autogen.sh b/patches/libnet-1.1.4/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/libnet-1.1.4/autogen.sh +++ b/patches/libnet-1.1.4/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/lmbench-3.0-a9/autogen.sh b/patches/lmbench-3.0-a9/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/lmbench-3.0-a9/autogen.sh +++ b/patches/lmbench-3.0-a9/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/lua-5.1.4/autogen.sh b/patches/lua-5.1.4/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/lua-5.1.4/autogen.sh +++ b/patches/lua-5.1.4/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/mod_python-3.3.1/autogen-generic.sh b/patches/mod_python-3.3.1/autogen-generic.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/mod_python-3.3.1/autogen-generic.sh +++ b/patches/mod_python-3.3.1/autogen-generic.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/mtd-utils-1.5.0/0001-make-ubifs-optional.patch b/patches/mtd-utils-1.5.0/0001-make-ubifs-optional.patch deleted file mode 100644 index 2dec433..0000000 --- a/patches/mtd-utils-1.5.0/0001-make-ubifs-optional.patch +++ /dev/null @@ -1,23 +0,0 @@ -From: Bernhard Walle -Date: Sun, 11 Mar 2012 20:03:50 +0100 -Subject: [PATCH] make ubifs optional - -Signed-off-by: Bernhard Walle ---- - Makefile | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/Makefile b/Makefile -index f380b42..a682a8f 100644 ---- a/Makefile -+++ b/Makefile -@@ -30,7 +30,9 @@ UBI_BINS = \ - ubidetach ubinize ubiformat ubirename mtdinfo ubirsvol - - BINS = $(MTD_BINS) -+ifneq ($(WITHOUT_MKUBIFS), 1) - BINS += mkfs.ubifs/mkfs.ubifs -+endif - BINS += $(addprefix ubi-utils/,$(UBI_BINS)) - SCRIPTS = flash_eraseall - diff --git a/patches/mtd-utils-1.5.0/0002-Make-liblzo-optional-for-ubifs-tools.patch b/patches/mtd-utils-1.5.0/0002-Make-liblzo-optional-for-ubifs-tools.patch deleted file mode 100644 index 01c3656..0000000 --- a/patches/mtd-utils-1.5.0/0002-Make-liblzo-optional-for-ubifs-tools.patch +++ /dev/null @@ -1,68 +0,0 @@ -From: Bernhard Walle -Date: Sun, 11 Mar 2012 20:11:14 +0100 -Subject: [PATCH] Make liblzo optional for ubifs tools - -Based on patch from Marc Kleine-Budde . - -Signed-off-by: Bernhard Walle ---- - Makefile | 2 +- - mkfs.ubifs/compr.c | 17 +++++++++++++++++ - 2 files changed, 18 insertions(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index a682a8f..190db58 100644 ---- a/Makefile -+++ b/Makefile -@@ -105,7 +105,7 @@ $(call _mkdep,lib/,libmtd.a) - # - obj-mkfs.ubifs = crc16.o lpt.o compr.o devtable.o \ - hashtable/hashtable.o hashtable/hashtable_itr.o --LDLIBS_mkfs.ubifs = -lz -llzo2 -lm -luuid -+LDLIBS_mkfs.ubifs = -lz $(LZOLDLIBS) -lm -luuid - $(call mkdep,mkfs.ubifs/,mkfs.ubifs,,ubi-utils/libubi.a) - - # -diff --git a/mkfs.ubifs/compr.c b/mkfs.ubifs/compr.c -index 4152b6a..244d450 100644 ---- a/mkfs.ubifs/compr.c -+++ b/mkfs.ubifs/compr.c -@@ -24,7 +24,11 @@ - #include - #include - #include -+#ifndef WITHOUT_LZO - #include -+#else -+#define LZO1X_999_MEM_COMPRESS 0 -+#endif - #include - - #define crc32 __zlib_crc32 -@@ -86,6 +90,8 @@ static int zlib_deflate(void *in_buf, size_t in_len, void *out_buf, - return 0; - } - -+ -+#ifndef WITHOUT_LZO - static int lzo_compress(void *in_buf, size_t in_len, void *out_buf, - size_t *out_len) - { -@@ -103,6 +109,17 @@ static int lzo_compress(void *in_buf, size_t in_len, void *out_buf, - - return 0; - } -+#else -+static inline int lzo_compress(void *in_buf, size_t in_len, void *out_buf, -+ size_t *out_len) -+{ -+ (void)in_buf; -+ (void)in_len; -+ (void)out_buf; -+ (void)out_len; -+ return -1; -+} -+#endif - - static int no_compress(void *in_buf, size_t in_len, void *out_buf, - size_t *out_len) diff --git a/patches/mtd-utils-1.5.0/0003-flash_otp_write-fix-format-string-warning.patch b/patches/mtd-utils-1.5.0/0003-flash_otp_write-fix-format-string-warning.patch deleted file mode 100644 index ae49c4e..0000000 --- a/patches/mtd-utils-1.5.0/0003-flash_otp_write-fix-format-string-warning.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= -Date: Wed, 20 Feb 2013 17:25:30 +0100 -Subject: [PATCH] flash_otp_write: fix format string warning -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This fixes - flash_otp_write.c: In function 'main': - flash_otp_write.c:61:2: warning: format '%lx' expects argument of type 'long unsigned int', but argument 3 has type 'off_t' [-Wformat] - -Signed-off-by: Uwe Kleine-König -Forwarded: id:1361378469-18631-1-git-send-email-u.kleine-koenig@pengutronix.de ---- - flash_otp_write.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/flash_otp_write.c b/flash_otp_write.c -index d407ebb..41cf1c5 100644 ---- a/flash_otp_write.c -+++ b/flash_otp_write.c -@@ -58,7 +58,7 @@ int main(int argc,char *argv[]) - return errno; - } - -- printf("Writing OTP user data on %s at offset 0x%lx\n", argv[2], offset); -+ printf("Writing OTP user data on %s at offset 0x%lx\n", argv[2], (unsigned long)offset); - - if (mtdInfo.type == MTD_NANDFLASH) - len = mtdInfo.writesize; diff --git a/patches/mtd-utils-1.5.0/0004-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch b/patches/mtd-utils-1.5.0/0004-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch deleted file mode 100644 index f6c2aac..0000000 --- a/patches/mtd-utils-1.5.0/0004-flash_otp_write-fix-writing-to-NAND-in-presence-of-p.patch +++ /dev/null @@ -1,61 +0,0 @@ -From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= -Date: Wed, 27 Feb 2013 17:49:06 +0100 -Subject: [PATCH] flash_otp_write: fix writing to NAND in presence of partial - reads -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When doing something like: - - { printf "\xff"; printf "\xfe"; } | flash_otp_write -u /dev/mtd0 0 - -flash_otp_write might see only a single byte when reading from stdin for -the first tim. In this case (and without this patch) it pads to -$writesize with '\xff's and writes that out. In the next iteration it -reads the 2nd byte, pads and writes again. So the 2nd byte is written to -offset $writesize instead of 1. - -Signed-off-by: Uwe Kleine-König -Forwarded: id:1362044529-511-1-git-send-email-u.kleine-koenig@pengutronix.de ---- - flash_otp_write.c | 19 ++++++++++++++++++- - 1 file changed, 18 insertions(+), 1 deletion(-) - -diff --git a/flash_otp_write.c b/flash_otp_write.c -index 41cf1c5..0aa872e 100644 ---- a/flash_otp_write.c -+++ b/flash_otp_write.c -@@ -15,6 +15,23 @@ - - #include - -+ssize_t xread(int fd, void *buf, size_t count) -+{ -+ ssize_t ret, done = 0; -+ -+retry: -+ ret = read(fd, buf + done, count - done); -+ if (ret < 0) -+ return ret; -+ -+ done += ret; -+ -+ if (ret == 0 /* EOF */ || done == count) -+ return done; -+ else -+ goto retry; -+} -+ - int main(int argc,char *argv[]) - { - int fd, val, ret, size, wrote, len; -@@ -66,7 +83,7 @@ int main(int argc,char *argv[]) - len = 256; - - wrote = 0; -- while ((size = read(0, buf, len))) { -+ while ((size = xread(0, buf, len))) { - if (size < 0) { - perror("read()"); - return errno; diff --git a/patches/mtd-utils-1.5.0/0005-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch b/patches/mtd-utils-1.5.0/0005-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch deleted file mode 100644 index d1102c0..0000000 --- a/patches/mtd-utils-1.5.0/0005-flash_otp_write-fix-a-buffer-overflow-on-NAND-with-w.patch +++ /dev/null @@ -1,35 +0,0 @@ -From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= -Date: Thu, 28 Feb 2013 10:28:29 +0100 -Subject: [PATCH] flash_otp_write: fix a buffer overflow on NAND with write - size > 2048 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -I'm not aware of any chip having a write size bigger than 2048 today. -Still checking for that instead of a sleeping problem to bite us maybe -in a few years is easy. - -Signed-off-by: Uwe Kleine-König -Forwarded: id:1362044546-559-1-git-send-email-u.kleine-koenig@pengutronix.de ---- - flash_otp_write.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/flash_otp_write.c b/flash_otp_write.c -index 0aa872e..5114e6b 100644 ---- a/flash_otp_write.c -+++ b/flash_otp_write.c -@@ -82,6 +82,12 @@ int main(int argc,char *argv[]) - else - len = 256; - -+ if (len > sizeof(buf)) { -+ printf("huh, writesize (%d) bigger than buffer (%zu)\n", -+ len, sizeof(buf)); -+ return ENOMEM; -+ } -+ - wrote = 0; - while ((size = xread(0, buf, len))) { - if (size < 0) { diff --git a/patches/mtd-utils-1.5.0/0006-Makefile-also-build-and-install-flash_otp_lock-and-f.patch b/patches/mtd-utils-1.5.0/0006-Makefile-also-build-and-install-flash_otp_lock-and-f.patch deleted file mode 100644 index 9727290..0000000 --- a/patches/mtd-utils-1.5.0/0006-Makefile-also-build-and-install-flash_otp_lock-and-f.patch +++ /dev/null @@ -1,42 +0,0 @@ -From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= -Date: Wed, 20 Feb 2013 17:29:12 +0100 -Subject: [PATCH] Makefile: also build and install flash_otp_lock and - flash_otp_write -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Uwe Kleine-König -Forwarded: id:1361378491-18687-1-git-send-email-u.kleine-koenig@pengutronix.de ---- - .gitignore | 2 ++ - Makefile | 3 ++- - 2 files changed, 4 insertions(+), 1 deletion(-) - -diff --git a/.gitignore b/.gitignore -index d4771fb..83ca938 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -25,6 +25,8 @@ - /flash_lock - /flash_otp_dump - /flash_otp_info -+/flash_otp_lock -+/flash_otp_write - /flash_unlock - /flashcp - /ftl_check -diff --git a/Makefile b/Makefile -index 190db58..3f9c24f 100644 ---- a/Makefile -+++ b/Makefile -@@ -19,7 +19,8 @@ TESTS = tests - MTD_BINS = \ - ftl_format flash_erase nanddump doc_loadbios \ - ftl_check mkfs.jffs2 flash_lock flash_unlock \ -- flash_otp_info flash_otp_dump mtd_debug flashcp nandwrite nandtest \ -+ flash_otp_info flash_otp_dump flash_otp_lock flash_otp_write \ -+ mtd_debug flashcp nandwrite nandtest \ - jffs2dump \ - nftldump nftl_format docfdisk \ - rfddump rfdformat \ diff --git a/patches/mxs-utils-2011.06.0/autogen.sh b/patches/mxs-utils-2011.06.0/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/mxs-utils-2011.06.0/autogen.sh +++ b/patches/mxs-utils-2011.06.0/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/mysql-5.1.14-beta/autogen.sh b/patches/mysql-5.1.14-beta/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/mysql-5.1.14-beta/autogen.sh +++ b/patches/mysql-5.1.14-beta/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/opkg-0.1.8/autogen.sh b/patches/opkg-0.1.8/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/opkg-0.1.8/autogen.sh +++ b/patches/opkg-0.1.8/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/owfs-2.8p6/autogen.sh b/patches/owfs-2.8p6/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/owfs-2.8p6/autogen.sh +++ b/patches/owfs-2.8p6/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/polkit-0.96/autogen.sh b/patches/polkit-0.96/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/polkit-0.96/autogen.sh +++ b/patches/polkit-0.96/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/poppler-0.18.0/autogen.sh b/patches/poppler-0.18.0/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/poppler-0.18.0/autogen.sh +++ b/patches/poppler-0.18.0/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/serdisplib-1.97.9/autogen.sh b/patches/serdisplib-1.97.9/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/serdisplib-1.97.9/autogen.sh +++ b/patches/serdisplib-1.97.9/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/splashutils-1.5.4.3/autogen.sh b/patches/splashutils-1.5.4.3/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/splashutils-1.5.4.3/autogen.sh +++ b/patches/splashutils-1.5.4.3/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/ssmtp-2.64/autogen.sh b/patches/ssmtp-2.64/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/ssmtp-2.64/autogen.sh +++ b/patches/ssmtp-2.64/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/tslib-1.0/autogen.sh b/patches/tslib-1.0/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/tslib-1.0/autogen.sh +++ b/patches/tslib-1.0/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/udisks-1.0.0/autogen.sh b/patches/udisks-1.0.0/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/udisks-1.0.0/autogen.sh +++ b/patches/udisks-1.0.0/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/usplash_0.5.49/autogen.sh b/patches/usplash_0.5.49/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/usplash_0.5.49/autogen.sh +++ b/patches/usplash_0.5.49/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/valgrind-3.8.1/autogen.sh b/patches/valgrind-3.8.1/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/valgrind-3.8.1/autogen.sh +++ b/patches/valgrind-3.8.1/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/wireshark-1.2.5/autogen-generic.sh b/patches/wireshark-1.2.5/autogen-generic.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/wireshark-1.2.5/autogen-generic.sh +++ b/patches/wireshark-1.2.5/autogen-generic.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/xmlstarlet-1.0.1/autogen.sh b/patches/xmlstarlet-1.0.1/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/xmlstarlet-1.0.1/autogen.sh +++ b/patches/xmlstarlet-1.0.1/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file diff --git a/patches/xorg-server-1.12.2/autogen.sh b/patches/xorg-server-1.12.2/autogen.sh index 7c32d1a..9f8a4cb 120000 --- a/patches/xorg-server-1.12.2/autogen.sh +++ b/patches/xorg-server-1.12.2/autogen.sh @@ -1 +1 @@ -/home/schpuntik/workdir/Public/BSP.Stlinux/ptxdist_sh/patches/autogen.sh \ No newline at end of file +../autogen.sh \ No newline at end of file From a46f035a36ea2d33a08005b041fb63e4b58c2253 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 29 Sep 2013 02:26:12 +0200 Subject: [PATCH 06/20] add git clone and svn checkout support --- rules/post/ptxd_make_world_common.make | 6 ++ rules/post/ptxd_make_world_get.make | 3 +- scripts/lib/ptxd_make_get.sh | 105 +++++++++++++++++++++++ scripts/lib/ptxd_make_world_check_src.sh | 2 +- scripts/lib/ptxd_make_world_extract.sh | 14 +++ 5 files changed, 128 insertions(+), 2 deletions(-) diff --git a/rules/post/ptxd_make_world_common.make b/rules/post/ptxd_make_world_common.make index df37e51..6041862 100644 --- a/rules/post/ptxd_make_world_common.make +++ b/rules/post/ptxd_make_world_common.make @@ -66,6 +66,12 @@ world/env/impl = \ pkg_md5="$(call ptx/escape,$($(1)_MD5))" \ pkg_url="$(call ptx/escape,$($(1)_URL))" \ \ + pkg_git="$(call ptx/escape,$($(1)_GIT))" \ + pkg_git_branch="$(call ptx/escape,$($(1)_GIT_BRANCH))" \ + pkg_git_head="$(call ptx/escape,$($(1)_GIT_HEAD))" \ + pkg_svn="$(call ptx/escape,$($(1)_SVN))" \ + pkg_svn_rev="$(call ptx/escape,$($(1)_SVN_REV))" \ + \ pkg_dir="$(call ptx/escape,$($(1)_DIR))" \ pkg_subdir="$(call ptx/escape,$($(1)_SUBDIR))" \ pkg_strip_level="$(call ptx/escape,$($(1)_STRIP_LEVEL))" \ diff --git a/rules/post/ptxd_make_world_get.make b/rules/post/ptxd_make_world_get.make index 152674c..4ebe1fb 100644 --- a/rules/post/ptxd_make_world_get.make +++ b/rules/post/ptxd_make_world_get.make @@ -54,7 +54,8 @@ world/check_src = \ # get = \ PTXCONF_SETUP_NO_DOWNLOAD="$(PTXCONF_SETUP_NO_DOWNLOAD)" \ - ptxd_make_get "$($(strip $(1))_SOURCE)" "$($(strip $(1))_URL)" + ptxd_make_get "$($(strip $(1))_SOURCE)" "$($(strip $(1))_URL)" \ + "$($(strip $(1))_GIT)" "$($(strip $(1))_SVN)" "$($(strip $(1))_SVN_REV)" check_src = \ ptxd_make_check_src "$($(strip $(1))_SOURCE)" "$($(strip $(1))_MD5)" diff --git a/scripts/lib/ptxd_make_get.sh b/scripts/lib/ptxd_make_get.sh index bfb03a3..bfa6c46 100644 --- a/scripts/lib/ptxd_make_get.sh +++ b/scripts/lib/ptxd_make_get.sh @@ -139,7 +139,78 @@ ptxd_make_get_git() { } export -f ptxd_make_get_git +# +# in env: +# +# ${path} : local file name +# ${url} : the url to download +# ${opts[]} : an array of options + +ptxd_make_clone_git() { + set -- "${opts[@]}" + echo "url =$url" + echo "git =$git" + echo "path =$path" + unset opts + local prefix="$(basename "${path}")" + + echo "${PROMPT}git: clone '${git}' into '${path}'...test" + if [ -z "${path}" ]; then + git clone "${git}" "${path}" + fi + +} +export -f ptxd_make_clone_git + +# +# in env: +# +# ${path} : local file name +# ${url} : the url to download +# ${opts[]} : an array of options +# +ptxd_make_check_svn() { + set -- "${opts[@]}" + echo "url =$url" + echo "svn =$svn" + echo "rev =$rev" + echo "path =$path" + unset opts + local prefix="$(basename "${path}")" + + # + # scan for valid options + # + while [ ${#} -ne 0 ]; do + local opt="${1}" + shift + + case "${opt}" in + rev=*) + rev="${opt#rev=}" + ;; + *) + ptxd_bailout "invalid option '${opt}' to ${FUNCNAME}" + ;; + esac + done + unset opt + if [ -z "${rev}" ]; then + ptxd_bailout "svn url '${svn}' has no 'rev' option" + fi + + echo "${PROMPT}svn: fetching '${svn} into '${path}'..." + if [ ! -d "${path}" ]; then + svn checkout -r ${rev} "${svn}" "${path}" + else + svn update -r ${rev} "${path}" + fi && + lmtime=$(svn info -r ${rev} "${path}" | \ + awk '/^Last Changed Date:/ {print $4 " " $5 " " $6}') && + echo "${PROMPT}svn: last modification time '${lmtime}'" +} +export -f ptxd_make_check_svn # # in env: # @@ -258,6 +329,10 @@ ptxd_make_get() { local mrd=false # is mirror already part of urls? local path="${1}" + local url="${2}" + local git="${3}" + local svn="${4}" + local rev="${5}" shift local -a orig_argv @@ -304,6 +379,30 @@ ptxd_make_get() { mrd=true fi ;; + clone://*) + # restrict donwload only to the PTXMIRROR + if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then + # keep original URL + argv[${#argv[@]}]="${url}" + fi + # add mirror to URLs, but only once + if ! ${mrd}; then + ptxmirror_url="${path/#\/*\//${PTXCONF_SETUP_PTXMIRROR}/}" + mrd=true + fi + ;; + check://*) + # restrict donwload only to the PTXMIRROR + if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then + # keep original URL + argv[${#argv[@]}]="${url}" + fi + # add mirror to URLs, but only once + if ! ${mrd}; then + ptxmirror_url="${path/#\/*\//${PTXCONF_SETUP_PTXMIRROR}/}" + mrd=true + fi + ;; svn://*) # restrict donwload only to the PTXMIRROR if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then @@ -362,6 +461,12 @@ ptxd_make_get() { ptxd_make_get_download_permitted && ptxd_make_get_git && return ;; + clone://*) + ptxd_make_clone_git && return + ;; + check://*) + ptxd_make_check_svn && return + ;; svn://*) ptxd_make_get_download_permitted && ptxd_make_get_svn && return diff --git a/scripts/lib/ptxd_make_world_check_src.sh b/scripts/lib/ptxd_make_world_check_src.sh index fa89ec5..d03f0bf 100644 --- a/scripts/lib/ptxd_make_world_check_src.sh +++ b/scripts/lib/ptxd_make_world_check_src.sh @@ -89,7 +89,7 @@ export -f ptxd_make_world_update_md5 ptxd_make_world_check_src() { ptxd_make_world_init && - if [ -z "${pkg_src}" ]; then + if [ -z "${pkg_src}" ] || [ -z "${pkg_svn}" ] || [ -z "${pkg_git}" ]; then return fi ptxd_make_check_src_impl "${pkg_src}" "${pkg_md5}" && return diff --git a/scripts/lib/ptxd_make_world_extract.sh b/scripts/lib/ptxd_make_world_extract.sh index 0e911e7..2482326 100644 --- a/scripts/lib/ptxd_make_world_extract.sh +++ b/scripts/lib/ptxd_make_world_extract.sh @@ -55,6 +55,20 @@ ptxd_make_world_extract() { ptxd_bailout "the URL '${pkg_url}' points to non existing directory or file." fi ;; + clone://*) + echo "Clone git" + echo "head=$pkg_git_head" + cp -a "${pkg_src}" "${pkg_dir}" + cd ${pkg_dir} && git fetch && git checkout "${pkg_git_branch}" && git pull -u origin "${pkg_git_branch}" && git checkout "${pkg_git_head}" + return + ;; + check://*) + echo "Checkout svn" + echo "revision=$pkg_svn_rev" + cp -a "${pkg_src}" "${pkg_dir}" + cd ${pkg_dir} && svn update && svn up -r "${pkg_svn_rev}" + return + ;; esac mkdir -p "${pkg_extract_dir}" || return From ec5fd5d2f885218d1e1dc90d000f389f2b601550 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 29 Sep 2013 21:34:15 +0200 Subject: [PATCH 07/20] fix git clone --- scripts/lib/ptxd_make_get.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lib/ptxd_make_get.sh b/scripts/lib/ptxd_make_get.sh index bfa6c46..60d604f 100644 --- a/scripts/lib/ptxd_make_get.sh +++ b/scripts/lib/ptxd_make_get.sh @@ -155,7 +155,7 @@ ptxd_make_clone_git() { local prefix="$(basename "${path}")" echo "${PROMPT}git: clone '${git}' into '${path}'...test" - if [ -z "${path}" ]; then + if [ ! -z "${path}" ]; then git clone "${git}" "${path}" fi From 4b02522c2bba72d5725368aa795182337413d488 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Tue, 1 Oct 2013 23:23:53 +0200 Subject: [PATCH 08/20] code optimized for git clone support --- rules/post/ptxd_make_world_common.make | 2 - rules/post/ptxd_make_world_get.make | 3 +- scripts/lib/ptxd_make_get.sh | 217 +++++++---------------- scripts/lib/ptxd_make_world_check_src.sh | 2 +- scripts/lib/ptxd_make_world_extract.sh | 7 +- 5 files changed, 73 insertions(+), 158 deletions(-) diff --git a/rules/post/ptxd_make_world_common.make b/rules/post/ptxd_make_world_common.make index 6041862..9b04f28 100644 --- a/rules/post/ptxd_make_world_common.make +++ b/rules/post/ptxd_make_world_common.make @@ -66,10 +66,8 @@ world/env/impl = \ pkg_md5="$(call ptx/escape,$($(1)_MD5))" \ pkg_url="$(call ptx/escape,$($(1)_URL))" \ \ - pkg_git="$(call ptx/escape,$($(1)_GIT))" \ pkg_git_branch="$(call ptx/escape,$($(1)_GIT_BRANCH))" \ pkg_git_head="$(call ptx/escape,$($(1)_GIT_HEAD))" \ - pkg_svn="$(call ptx/escape,$($(1)_SVN))" \ pkg_svn_rev="$(call ptx/escape,$($(1)_SVN_REV))" \ \ pkg_dir="$(call ptx/escape,$($(1)_DIR))" \ diff --git a/rules/post/ptxd_make_world_get.make b/rules/post/ptxd_make_world_get.make index 4ebe1fb..3b8e225 100644 --- a/rules/post/ptxd_make_world_get.make +++ b/rules/post/ptxd_make_world_get.make @@ -54,8 +54,7 @@ world/check_src = \ # get = \ PTXCONF_SETUP_NO_DOWNLOAD="$(PTXCONF_SETUP_NO_DOWNLOAD)" \ - ptxd_make_get "$($(strip $(1))_SOURCE)" "$($(strip $(1))_URL)" \ - "$($(strip $(1))_GIT)" "$($(strip $(1))_SVN)" "$($(strip $(1))_SVN_REV)" + ptxd_make_get "$($(strip $(1))_SOURCE)" "$($(strip $(1))_URL)" "$($(strip $(1))_SVN_REV)" check_src = \ ptxd_make_check_src "$($(strip $(1))_SOURCE)" "$($(strip $(1))_MD5)" diff --git a/scripts/lib/ptxd_make_get.sh b/scripts/lib/ptxd_make_get.sh index 60d604f..d90930b 100644 --- a/scripts/lib/ptxd_make_get.sh +++ b/scripts/lib/ptxd_make_get.sh @@ -87,6 +87,16 @@ ptxd_make_get_git() { mirror="$(dirname "${path}")/${mirror//\//.}" local prefix="$(basename "${path}")" prefix="${prefix%.tar.*}/" + + # + # scan for git options + # + if [ -z "${pkg_git_head}" ] || [ -z "${pkg_git_branch}" ]; then + echo "${PROMPT}git: clone '${url}' into '${path}'...test" + if [ ! -z "${path}" ]; then + git clone "${url}" "${path}" + fi + else case "${path}" in *.tar.gz|*.tar.bz2|*.tar.xz|*.zip) @@ -136,82 +146,10 @@ ptxd_make_get_git() { fi && git --git-dir="${mirror}" archive --prefix="${prefix}" -o "${path}" "${tag}" -} -export -f ptxd_make_get_git - -# -# in env: -# -# ${path} : local file name -# ${url} : the url to download -# ${opts[]} : an array of options - -ptxd_make_clone_git() { - set -- "${opts[@]}" - echo "url =$url" - echo "git =$git" - echo "path =$path" - unset opts - local prefix="$(basename "${path}")" - - echo "${PROMPT}git: clone '${git}' into '${path}'...test" - if [ ! -z "${path}" ]; then - git clone "${git}" "${path}" fi - } -export -f ptxd_make_clone_git - -# -# in env: -# -# ${path} : local file name -# ${url} : the url to download -# ${opts[]} : an array of options -# -ptxd_make_check_svn() { - set -- "${opts[@]}" - echo "url =$url" - echo "svn =$svn" - echo "rev =$rev" - echo "path =$path" - unset opts - local prefix="$(basename "${path}")" - - # - # scan for valid options - # - while [ ${#} -ne 0 ]; do - local opt="${1}" - shift - - case "${opt}" in - rev=*) - rev="${opt#rev=}" - ;; - *) - ptxd_bailout "invalid option '${opt}' to ${FUNCNAME}" - ;; - esac - done - unset opt - - if [ -z "${rev}" ]; then - ptxd_bailout "svn url '${svn}' has no 'rev' option" - fi +export -f ptxd_make_get_git - echo "${PROMPT}svn: fetching '${svn} into '${path}'..." - if [ ! -d "${path}" ]; then - svn checkout -r ${rev} "${svn}" "${path}" - else - svn update -r ${rev} "${path}" - fi && - lmtime=$(svn info -r ${rev} "${path}" | \ - awk '/^Last Changed Date:/ {print $4 " " $5 " " $6}') && - echo "${PROMPT}svn: last modification time '${lmtime}'" -} -export -f ptxd_make_check_svn -# # in env: # # ${path} : local file name @@ -222,61 +160,67 @@ ptxd_make_get_svn() { set -- "${opts[@]}" unset opts local rev + echo "alles=$@" + echo "mirror=$mirror" + echo "rev=$rev" + echo "tarcomp=$opts" + + if [ -z "${pkg_svn_rev}" ]; then + echo "${PROMPT}svn: fetching '${url} into '${path}'... checkout" + echo "rev=$rev" + echo "url=$url" + echo "alles=$@" + if [ ! -d "${path}" ]; then + svn checkout "${url}" "${path}" + else + svn update -r ${rev} "${path}" + fi && + lmtime=$(svn info -r ${rev} "${path}" | \ + awk '/^Last Changed Date:/ {print $4 " " $5 " " $6}') && + echo "${PROMPT}svn: last modification time '${lmtime}'" + + else local tarcomp local mirror="${url#[a-z]*//}" mirror="$(dirname "${path}")/${mirror//\//.}" local prefix="$(basename "${path}")" prefix="${prefix%.tar.*}" - - case "${path}" in - *.tar.gz) + + case "${path}" in + *.tar.gz) tarcomp="--gzip" - ;; - *.tar.bz2) - tarcomp="--bzip2" - ;; - *.tar.xz) - tarcomp="--xz" - ;; - *) - ptxd_bailout "Only .tar.gz, .tar.bz2, .tar.xz and archives are supported for svn downloads." - ;; - esac + ;; + *.tar.bz2) + tarcomp="--bzip2" + ;; + *.tar.xz) + tarcomp="--xz" + ;; + *) + ptxd_bailout "Only .tar.gz, .tar.bz2, .tar.xz and archives are supported for svn downloads." + ;; + esac - # - # scan for valid options - # - while [ ${#} -ne 0 ]; do - local opt="${1}" - shift - case "${opt}" in - rev=*) - rev="${opt#rev=}" - ;; - *) - ptxd_bailout "invalid option '${opt}' to ${FUNCNAME}" - ;; - esac - done - unset opt + unset opt - if [ -z "${rev}" ]; then - ptxd_bailout "svn url '${url}' has no 'rev' option" - fi + if [ -z "${rev}" ]; then + ptxd_bailout "svn url '${url}' has no 'rev' option" + fi - echo "${PROMPT}svn: fetching '${url} into '${mirror}'..." - if [ ! -d "${mirror}" ]; then - svn checkout -r ${rev} "${url}" "${mirror}" - else - svn update -r ${rev} "${mirror}" - fi && - lmtime=$(svn info -r ${rev} "${mirror}" | \ - awk '/^Last Changed Date:/ {print $4 " " $5 " " $6}') && - echo "${PROMPT}svn: last modification time '${lmtime}'" && - tar --exclude-vcs --show-stored-names ${tarcomp} \ + echo "${PROMPT}svn: fetching '${url} into '${mirror}'..." + if [ ! -d "${mirror}" ]; then + svn checkout -r ${rev} "${url}" "${mirror}" + else + svn update -r ${rev} "${mirror}" + fi && + lmtime=$(svn info -r ${rev} "${mirror}" | \ + awk '/^Last Changed Date:/ {print $4 " " $5 " " $6}') && + echo "${PROMPT}svn: last modification time '${lmtime}'" && + tar --exclude-vcs --show-stored-names ${tarcomp} \ --mtime="${lmtime}" --transform "s|^\.|${prefix}|g" \ --create --file "${path}" -C "${mirror}" . + fi } export -f ptxd_make_get_svn @@ -330,9 +274,10 @@ ptxd_make_get() { local path="${1}" local url="${2}" - local git="${3}" - local svn="${4}" - local rev="${5}" + local rev="${3}" + echo "rev=$rev" + echo "alles=$@" + shift local -a orig_argv @@ -367,31 +312,7 @@ ptxd_make_get() { mrd=true fi ;; - git://*|http://*".git;"*|https://*".git;"*) - # restrict donwload only to the PTXMIRROR - if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then - # keep original URL - argv[${#argv[@]}]="${url}" - fi - # add mirror to URLs, but only once - if ! ${mrd}; then - ptxmirror_url="${path/#\/*\//${PTXCONF_SETUP_PTXMIRROR}/}" - mrd=true - fi - ;; - clone://*) - # restrict donwload only to the PTXMIRROR - if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then - # keep original URL - argv[${#argv[@]}]="${url}" - fi - # add mirror to URLs, but only once - if ! ${mrd}; then - ptxmirror_url="${path/#\/*\//${PTXCONF_SETUP_PTXMIRROR}/}" - mrd=true - fi - ;; - check://*) + git://*|git@*|http://*".git;"*|https://*".git;"*) # restrict donwload only to the PTXMIRROR if [ -z "${PTXCONF_SETUP_PTXMIRROR_ONLY}" ]; then # keep original URL @@ -457,16 +378,10 @@ ptxd_make_get() { shift case "${url}" in - git://*|http://*.git|https://*.git) + git://*|git@*) ptxd_make_get_download_permitted && ptxd_make_get_git && return ;; - clone://*) - ptxd_make_clone_git && return - ;; - check://*) - ptxd_make_check_svn && return - ;; svn://*) ptxd_make_get_download_permitted && ptxd_make_get_svn && return diff --git a/scripts/lib/ptxd_make_world_check_src.sh b/scripts/lib/ptxd_make_world_check_src.sh index d03f0bf..78f72c8 100644 --- a/scripts/lib/ptxd_make_world_check_src.sh +++ b/scripts/lib/ptxd_make_world_check_src.sh @@ -89,7 +89,7 @@ export -f ptxd_make_world_update_md5 ptxd_make_world_check_src() { ptxd_make_world_init && - if [ -z "${pkg_src}" ] || [ -z "${pkg_svn}" ] || [ -z "${pkg_git}" ]; then + if [ -z "${pkg_src}" ] || [ -z "${pkg_svn_rev}" ] || [ -z "${pkg_git_branch}" ] || [ -z "${pkg_git_head}" ]; then return fi ptxd_make_check_src_impl "${pkg_src}" "${pkg_md5}" && return diff --git a/scripts/lib/ptxd_make_world_extract.sh b/scripts/lib/ptxd_make_world_extract.sh index 2482326..6abfc35 100644 --- a/scripts/lib/ptxd_make_world_extract.sh +++ b/scripts/lib/ptxd_make_world_extract.sh @@ -55,14 +55,17 @@ ptxd_make_world_extract() { ptxd_bailout "the URL '${pkg_url}' points to non existing directory or file." fi ;; - clone://*) + git://*|git@*) echo "Clone git" echo "head=$pkg_git_head" cp -a "${pkg_src}" "${pkg_dir}" + if echo "${pkg_url}" | grep 'git@' -q; then + exec ssh-agent + fi cd ${pkg_dir} && git fetch && git checkout "${pkg_git_branch}" && git pull -u origin "${pkg_git_branch}" && git checkout "${pkg_git_head}" return ;; - check://*) + svn://*) echo "Checkout svn" echo "revision=$pkg_svn_rev" cp -a "${pkg_src}" "${pkg_dir}" From 77edf7252d9375e6fd45410a87ed8c9bd1f9d86c Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sat, 5 Oct 2013 23:52:11 +0200 Subject: [PATCH 09/20] add sh4 ipk --- scripts/lib/ptxd_make_00-init.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/lib/ptxd_make_00-init.sh b/scripts/lib/ptxd_make_00-init.sh index de257d6..e91c173 100644 --- a/scripts/lib/ptxd_make_00-init.sh +++ b/scripts/lib/ptxd_make_00-init.sh @@ -52,6 +52,17 @@ ptxd_init_arch() { ;; esac ;; + sh) + local target="$(ptxd_get_ptxconf PTXCONF_GNU_TARGET)" + case "${target}" in + sh*-linux) + ipkg_arch=sh4 + ;; + *) + ipkg_arch=sh4 + ;; + esac + ;; esac PTXDIST_IPKG_ARCH_STRING="${ipkg_arch}" From e5d467cb33364ce844f021acbe2ce84aeea4b276 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 20 Oct 2013 00:31:06 +0200 Subject: [PATCH 10/20] update sdparm to 1.07 --- rules/sdparm.make | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/sdparm.make b/rules/sdparm.make index 6c4dea1..924782c 100644 --- a/rules/sdparm.make +++ b/rules/sdparm.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_SDPARM) += sdparm # # Paths and names # -SDPARM_VERSION := 1.04 -SDPARM_MD5 := b20c281bc185ea7d3c5e78a8c0be2a46 +SDPARM_VERSION := 1.07 +SDPARM_MD5 := c807f9db3dd7af175214be0d7fece494 SDPARM := sdparm-$(SDPARM_VERSION) SDPARM_SUFFIX := tgz SDPARM_URL := http://sg.danny.cz/sg/p/$(SDPARM).$(SDPARM_SUFFIX) From 15dbeb209fbb2620a06a131dc958428308c53795 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 20 Oct 2013 00:31:58 +0200 Subject: [PATCH 11/20] update usb-modeswitch to 1.2.7 --- rules/usb-modeswitch.make | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/usb-modeswitch.make b/rules/usb-modeswitch.make index 6f49f1d..8b09d4a 100644 --- a/rules/usb-modeswitch.make +++ b/rules/usb-modeswitch.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_USB_MODESWITCH) += usb-modeswitch # # Paths and names # -USB_MODESWITCH_VERSION := 1.2.5 -USB_MODESWITCH_MD5 := c393603908eceab95444c5bde790f6f0 +USB_MODESWITCH_VERSION := 1.2.7 +USB_MODESWITCH_MD5 := 18d889d72195534ae9133a8181cad42b USB_MODESWITCH := usb-modeswitch-$(USB_MODESWITCH_VERSION) USB_MODESWITCH_SUFFIX := tar.bz2 USB_MODESWITCH_URL := http://www.draisberghof.de/usb_modeswitch/$(USB_MODESWITCH).$(USB_MODESWITCH_SUFFIX) From f31586d668d913460069d0225387169fcda2e171 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 20 Oct 2013 00:32:35 +0200 Subject: [PATCH 12/20] update rtmpdump to 2.4 --- rules/rtmpdump.make | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/rtmpdump.make b/rules/rtmpdump.make index 109001c..a05782e 100644 --- a/rules/rtmpdump.make +++ b/rules/rtmpdump.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_RTMPDUMP) += rtmpdump # # Paths and names # -RTMPDUMP_VERSION := 2.3 -RTMPDUMP_MD5 := eb961f31cd55f0acf5aad1a7b900ef59 +RTMPDUMP_VERSION := 2.4 +RTMPDUMP_MD5 := 8241345cf6476c1c1b9689494d6e820f RTMPDUMP := rtmpdump-$(RTMPDUMP_VERSION) RTMPDUMP_SUFFIX := tgz RTMPDUMP_URL := http://rtmpdump.mplayerhq.hu/download/$(RTMPDUMP).$(RTMPDUMP_SUFFIX) From 36fba6099b7a88b43af0da324101101655508625 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 20 Oct 2013 00:35:29 +0200 Subject: [PATCH 13/20] fix typo --- rules/pre/kernel.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/pre/kernel.make b/rules/pre/kernel.make index b5f8092..3704c53 100644 --- a/rules/pre/kernel.make +++ b/rules/pre/kernel.make @@ -55,7 +55,7 @@ kernel/opts = \ HOSTCC=$(HOSTCC) \ ARCH=$(GENERIC_KERNEL_ARCH) \ CROSS_COMPILE=$(COMPILER_PREFIX) \ - DEPMOD=$(PTXCONF_SYSROOT_HOST)/sbin/depmod + DEPMOD=$(PTXCONF_SYSROOT_HOST)/sbin/depmod \ \ INSTALL_MOD_PATH=$($(1)_PKGDIR) \ PTX_KERNEL_DIR=$($(1)_DIR) From c3b0b3059130c45bc0dfaf5593de8be277ed1306 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 20 Oct 2013 00:36:22 +0200 Subject: [PATCH 14/20] synch to master --- generic/etc/init.d/lldpd | 139 ++++++++++++++++++++++++++ rules/fuse.make | 4 +- rules/glew.make | 10 +- rules/glu.in | 9 ++ rules/glu.make | 61 ++++++++++++ rules/host-mesalib.in | 2 + rules/host-mesalib.make | 50 +++++++++- rules/libdrm.in | 28 ++++++ rules/libdrm.make | 42 ++++++-- rules/lldpd-bbinit.in | 9 ++ rules/lldpd.in | 95 ++++++++++++++++++ rules/lldpd.make | 89 +++++++++++++++++ rules/log4cplus.make | 4 +- rules/mesa-demos.in | 83 +++++++++++++++- rules/mesa-demos.make | 33 +++++- rules/mesalib.in | 134 +++++++++++++++---------- rules/mesalib.make | 101 ++++++++++--------- rules/net-snmp.in | 210 ++++++++++++++++++++++++++++++++------- rules/net-snmp.make | 104 +++++++++++-------- rules/wayland.make | 4 +- rules/xorg-server.in | 1 - 21 files changed, 1008 insertions(+), 204 deletions(-) create mode 100644 generic/etc/init.d/lldpd create mode 100644 rules/glu.in create mode 100644 rules/glu.make create mode 100644 rules/lldpd-bbinit.in create mode 100644 rules/lldpd.in create mode 100644 rules/lldpd.make diff --git a/generic/etc/init.d/lldpd b/generic/etc/init.d/lldpd new file mode 100644 index 0000000..00c8240 --- /dev/null +++ b/generic/etc/init.d/lldpd @@ -0,0 +1,139 @@ +#!/bin/sh + +PATH=/sbin:/usr/sbin:/bin:/usr/bin +DESC="LLDP daemon" +NAME=lldpd +DAEMON=/usr/sbin/$NAME +DAEMON_ARGS="@DAEMON_ARGS@" +PIDFILE=/var/run/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +CHROOT=@PRIVSEP_CHROOT@ + +# exit if binary is missing +[ -x "$DAEMON" ] || exit 0 + +# read further config if present +[ -r /etc/default/$NAME ] && . /etc/default/$NAME + +is_running() { + start-stop-daemon -K --quiet --test --exec $DAEMON --pidfile $PIDFILE +} + +do_chroot() { + oldumask=$(umask) + umask 022 + [ -d $CHROOT/etc ] || mkdir -p $CHROOT/etc + [ -f $CHROOT/etc/localtime ] || [ ! -f /etc/localtime ] || \ + cp /etc/localtime $CHROOT/etc/localtime + umask $oldumask +} + +do_start() { + do_chroot + is_running && return 1 + start-stop-daemon -S --quiet --pidfile $PIDFILE --exec $DAEMON -- \ + $DAEMON_ARGS \ + || return 2 +} + +do_stop() { + is_running || return 0 + start-stop-daemon -K --quiet --pidfile $PIDFILE --name $NAME + RETVAL="$?" + + # wait up to 30 seconds until daemon stopped + for i in $(seq 30) + do + sleep 1 + echo -n '.' + if ! is_running + then + break + fi + done + + # see if it's still running + if is_running + then + start-stop-daemon -K --quiet --signal KILL --pidfile $PIDFILE --name $NAME + + for i in $(seq 5) + do + sleep 1 + echo -n '.' + if ! is_running + then + break + fi + done + + if is_running + then + return 2 + fi + fi + + rm -f $PIDFILE + return "$RETVAL" +} + +do_reload() { + # send SIGHUP + start-stop-daemon -K --signal 1 --quiet --pidfile $PIDFILE --name $NAME + return 0 +} + +case "$1" in + start) + echo -n "Starting $DESC ..." + do_start + case "$?" in + 0|1) echo " Done." ;; + 2) echo " Failed." ;; + esac + ;; + stop) + echo -n "Stopping $DESC ." + do_stop + case "$?" in + 0|1) echo " Done." ;; + 2) echo " Failed." ;; + esac + ;; + reload) + echo -n "Reloading $DESC ..." + do_reload + echo " Done." + ;; + restart|force-reload) + echo -n "Restarting $DESC .." + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) echo " Done." ;; + 1) echo " Failed." ;; # Old process still running + *) echo " Failed." ;; # Failed to start + esac + ;; + *) + echo " Failed." # Failed to stop + ;; + esac + ;; + status) + if is_running + then + echo "$NAME is running with PID $(cat $PIDFILE) ..." + else + echo "$NAME is not running" + fi + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload|status}" >&2 + exit 3 + ;; +esac + +: diff --git a/rules/fuse.make b/rules/fuse.make index 3033f56..a43e9a0 100644 --- a/rules/fuse.make +++ b/rules/fuse.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_FUSE) += fuse # # Paths and names # -FUSE_VERSION := 2.9.0 -FUSE_MD5 := 894ee11674f89a915ae87524aed55bc4 +FUSE_VERSION := 2.9.3 +FUSE_MD5 := 33cae22ca50311446400daf8a6255c6a FUSE := fuse-$(FUSE_VERSION) FUSE_SUFFIX := tar.gz FUSE_URL := $(call ptx/mirror, SF, fuse/$(FUSE).$(FUSE_SUFFIX)) diff --git a/rules/glew.make b/rules/glew.make index 08acaff..0869c62 100644 --- a/rules/glew.make +++ b/rules/glew.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_GLEW) += glew # # Paths and names # -GLEW_VERSION := 1.5.2 -GLEW_MD5 := 310916d887253dc9f4be6ab13501603a +GLEW_VERSION := 1.10.0 +GLEW_MD5 := 2f09e5e6cb1b9f3611bcac79bc9c2d5d GLEW := glew-$(GLEW_VERSION) GLEW_SUFFIX := tgz GLEW_URL := $(call ptx/mirror, SF, glew/$(GLEW_VERSION)/$(GLEW).$(GLEW_SUFFIX)) @@ -39,9 +39,9 @@ GLEW_MAKE_OPT := \ $(CROSS_ENV_CC) \ $(CROSS_ENV_AR) \ LD=$(CROSS_CC) \ - CFLAGS.EXTRA='$(CROSS_CPPFLAGS) $(CROSS_CFLAGS)' \ - LDFLAGS.EXTRA='$(CROSS_LDFLAGS)' \ - LDFLAGS.GL='`$(CROSS_ENV) eval PATH=$(CROSS_PATH) $$PKG_CONFIG --libs glu`' \ + CFLAGS.EXTRA='' \ + LDFLAGS.EXTRA='' \ + LDFLAGS.GL='-lGL -lX11' \ GLEW_DEST=$(GLEW_PKGDIR)/usr \ LIBDIR=$(GLEW_PKGDIR)/usr/lib \ M_ARCH=$(PTXCONF_ARCH_STRING) diff --git a/rules/glu.in b/rules/glu.in new file mode 100644 index 0000000..1f4a798 --- /dev/null +++ b/rules/glu.in @@ -0,0 +1,9 @@ +## SECTION=multimedia_libs + +config GLU + tristate + prompt "glu" + select MESALIB + select MESALIB_OPENGL + help + Mesa OpenGL utility library (GLU) diff --git a/rules/glu.make b/rules/glu.make new file mode 100644 index 0000000..b268081 --- /dev/null +++ b/rules/glu.make @@ -0,0 +1,61 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Michael Olbrich +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_GLU) += glu + +# +# Paths and names +# +GLU_VERSION := 9.0.0 +GLU_MD5 := be9249132ff49275461cf92039083030 +GLU := glu-$(GLU_VERSION) +GLU_SUFFIX := tar.bz2 +GLU_URL := ftp://ftp.freedesktop.org/pub/mesa/glu/$(GLU).$(GLU_SUFFIX) +GLU_SOURCE := $(SRCDIR)/$(GLU).$(GLU_SUFFIX) +GLU_DIR := $(BUILDDIR)/$(GLU) +GLU_LICENSE := unknown + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +GLU_CONF_TOOL := autoconf +GLU_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static \ + --disable-debug \ + --disable-osmesa + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/glu.targetinstall: + @$(call targetinfo) + + @$(call install_init, glu) + @$(call install_fixup, glu,PRIORITY,optional) + @$(call install_fixup, glu,SECTION,base) + @$(call install_fixup, glu,AUTHOR,"Michael Olbrich ") + @$(call install_fixup, glu,DESCRIPTION,missing) + + @$(call install_lib, glu, 0, 0, 0644, libGLU) + + @$(call install_finish, glu) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/host-mesalib.in b/rules/host-mesalib.in index 6e64e0b..1627c51 100644 --- a/rules/host-mesalib.in +++ b/rules/host-mesalib.in @@ -3,3 +3,5 @@ config HOST_MESALIB tristate select HOST_MAKEDEPEND + select HOST_SYSTEM_PYTHON + select HOST_SYSTEM_PYTHON_XML2 diff --git a/rules/host-mesalib.make b/rules/host-mesalib.make index 364b194..db2cdd3 100644 --- a/rules/host-mesalib.make +++ b/rules/host-mesalib.make @@ -14,14 +14,56 @@ HOST_PACKAGES-$(PTXCONF_HOST_MESALIB) += host-mesalib HOST_MESALIB_DIR = $(HOST_BUILDDIR)/Mesa-$(MESALIB_VERSION) -HOST_MESALIB_SUBDIR := src/glsl # ---------------------------------------------------------------------------- # Prepare # ---------------------------------------------------------------------------- -HOST_MESALIB_CONF_TOOL := NO -# gcc & g++ are provided by the wrappers and call the correct tools -HOST_MESALIB_MAKE_OPT := CC=gcc CXX=g++ builtin_compiler +HOST_MESALIB_CONF_ENV := \ + $(HOST_ENV) \ + ac_cv_prog_PYTHON2=$(PTXDIST_TOPDIR)/bin/python + +HOST_MESALIB_CONF_TOOL := autoconf +HOST_MESALIB_CONF_OPT := \ + $(HOST_AUTOCONF) \ + --disable-static \ + --enable-shared \ + --disable-debug \ + --disable-mangling \ + --disable-texture-float \ + --disable-asm \ + --disable-selinux \ + --enable-opengl \ + --disable-gles1 \ + --disable-gles2 \ + --disable-openvg \ + --disable-dri \ + --disable-glx \ + --disable-osmesa \ + --disable-gallium-osmesa \ + --disable-egl \ + --disable-xorg \ + --disable-xa \ + --disable-gbm \ + --disable-xvmc \ + --disable-vdpau \ + --disable-opencl \ + --disable-xlib-glx \ + --disable-gallium-egl \ + --disable-gallium-gbm \ + --disable-r600-llvm-compiler \ + --disable-gallium-tests \ + --disable-shared-glapi \ + --disable-driglx-direct \ + --disable-glx-tls \ + --disable-gallium-llvm \ + --with-gallium-drivers= \ + --with-dri-drivers= \ + --without-expat + +$(STATEDIR)/host-mesalib.install: + @$(call targetinfo) + install -D -m755 $(HOST_MESALIB_DIR)/src/glsl/builtin_compiler/builtin_compiler $(HOST_MESALIB_PKGDIR)/bin/mesa/builtin_compiler + @$(call touch) # vim: syntax=make diff --git a/rules/libdrm.in b/rules/libdrm.in index c4cf5f4..2710722 100644 --- a/rules/libdrm.in +++ b/rules/libdrm.in @@ -21,5 +21,33 @@ config LIBDRM_INTEL bool prompt "intel KMS support" +config LIBDRM_RADEON + bool + prompt "radeon KMS support" + +config LIBDRM_NOUVEAU + bool + prompt "nouveau KMS support" + +config LIBDRM_VMWGFX + bool + prompt "vmwgfx KMS support" + +config LIBDRM_OMAP + bool + prompt "omap KMS support" + +config LIBDRM_EXYNOS + bool + prompt "exynos KMS support" + +config LIBDRM_FREEDRENO + bool + prompt "freedreno KMS support" + +config LIBDRM_TESTS + bool + prompt "install test programs" + endif diff --git a/rules/libdrm.make b/rules/libdrm.make index d029d56..e6e7820 100644 --- a/rules/libdrm.make +++ b/rules/libdrm.make @@ -17,8 +17,8 @@ PACKAGES-$(PTXCONF_LIBDRM) += libdrm # # Paths and names # -LIBDRM_VERSION := 2.4.35 -LIBDRM_MD5 := 77992a226118a55e214f315bf23d4273 +LIBDRM_VERSION := 2.4.46 +LIBDRM_MD5 := b454a43366eb386294f87a5cd16699e6 LIBDRM := libdrm-$(LIBDRM_VERSION) LIBDRM_SUFFIX := tar.gz LIBDRM_URL := http://dri.freedesktop.org/libdrm/$(LIBDRM).$(LIBDRM_SUFFIX) @@ -29,6 +29,23 @@ LIBDRM_DIR := $(BUILDDIR)/$(LIBDRM) # Prepare # ---------------------------------------------------------------------------- +ifdef PTXCONF_ARCH_X86 +LIBDRM_BACKENDS-$(PTXCONF_LIBDRM_INTEL) += intel +endif +LIBDRM_BACKENDS-$(PTXCONF_LIBDRM_RADEON) += radeon +LIBDRM_BACKENDS-$(PTXCONF_LIBDRM_NOUVEAU) += nouveau +LIBDRM_BACKENDSC-$(PTXCONF_LIBDRM_VMWGFX) += vmwgfx +LIBDRM_BACKENDSC-$(PTXCONF_LIBDRM_OMAP) += omap-experimental-api +LIBDRM_BACKENDSL-$(PTXCONF_LIBDRM_OMAP) += omap +LIBDRM_BACKENDSC-$(PTXCONF_LIBDRM_EXYNOS) += exynos-experimental-api +LIBDRM_BACKENDSL-$(PTXCONF_LIBDRM_EXYNOS) += exynos +LIBDRM_BACKENDSC-$(PTXCONF_LIBDRM_FREEDRENO) += freedreno-experimental-api +LIBDRM_BACKENDSL-$(PTXCONF_LIBDRM_FREEDRENO) += freedreno + +LIBDRM_BACKENDSC-y += $(LIBDRM_BACKENDS-y) +LIBDRM_BACKENDSC- += $(LIBDRM_BACKENDS-) +LIBDRM_BACKENDSL-y += $(LIBDRM_BACKENDS-y) + # # autoconf # @@ -37,9 +54,12 @@ LIBDRM_CONF_OPT := \ $(CROSS_AUTOCONF_USR) \ --enable-udev \ --$(call ptx/endis, PTXCONF_LIBDRM_LIBKMS)-libkms \ - --$(call ptx/endis, PTXCONF_LIBDRM_INTEL)-intel \ - --disable-radeon \ - --disable-nouveau + $(addprefix --enable-,$(LIBDRM_BACKENDSC-y)) \ + $(addprefix --disable-,$(LIBDRM_BACKENDSC-)) \ + --$(call ptx/endis, PTXCONF_LIBDRM_TESTS)-install-test-programs \ + --disable-cairo-tests \ + --disable-manpages + # ---------------------------------------------------------------------------- # Target-Install @@ -59,10 +79,14 @@ $(STATEDIR)/libdrm.targetinstall: ifdef PTXCONF_LIBDRM_LIBKMS @$(call install_lib, libdrm, 0, 0, 0644, libkms) endif -ifdef PTXCONF_ARCH_X86 -ifdef PTXCONF_LIBDRM_INTEL - @$(call install_lib, libdrm, 0, 0, 0644, libdrm_intel) -endif + @$(foreach backend,$(LIBDRM_BACKENDSL-y), \ + $(call install_lib, libdrm, 0, 0, 0644, libdrm_$(backend));) + +ifdef PTXCONF_LIBDRM_TESTS + @$(call install_copy, libdrm, 0, 0, 0755, -, /usr/bin/kmstest) + @$(call install_copy, libdrm, 0, 0, 0755, -, /usr/bin/modeprint) + @$(call install_copy, libdrm, 0, 0, 0755, -, /usr/bin/modetest) + @$(call install_copy, libdrm, 0, 0, 0755, -, /usr/bin/vbltest) endif @$(call install_finish, libdrm) diff --git a/rules/lldpd-bbinit.in b/rules/lldpd-bbinit.in new file mode 100644 index 0000000..103452a --- /dev/null +++ b/rules/lldpd-bbinit.in @@ -0,0 +1,9 @@ +## SECTION=initmethod_bbinit + +config LLDPD_BBINIT_LINK + string + depends on LLDPD_STARTSCRIPT + prompt "lldpd" + default "S28lldpd" + +# vim: ft=kconfig noet tw=72 diff --git a/rules/lldpd.in b/rules/lldpd.in new file mode 100644 index 0000000..c4b4434 --- /dev/null +++ b/rules/lldpd.in @@ -0,0 +1,95 @@ +## SECTION=networking + +menuconfig LLDPD + tristate + prompt "lldpd " + select INITMETHOD + select LIBEVENT + select NET_SNMP if LLDPD_SNMP + select NET_SNMP_MIB_MODULES_AGENTX if LLDPD_SNMP + select LIBXML2 if LLDPD_XML + select BUSYBOX_START_STOP_DAEMON if LLDPD_STARTSCRIPT + select BUSYBOX_FEATURE_START_STOP_DAEMON_LONG_OPTIONS if LLDPD_STARTSCRIPT + help + lldpd is an ISC-licensed implementation of LLDP for various + Unixes. It also supports some proprietary protocols. + +if LLDPD + +config LLDPD_PRIVSEP_USER + string + prompt "Which user to use for privilege separation" + default "nobody" + +config LLDPD_PRIVSEP_GROUP + string + prompt "Which group to use for privilege separation" + default "nogroup" + +config LLDPD_PRIVSEP_CHROOT + string + prompt "Which directory to use to chroot lldpd" + default "/var/run/lldpd" + +config LLDPD_CDP + bool + prompt "Enable Cisco Discovery Protocol" + default y + +config LLDPD_FDP + bool + prompt "Enable Foundry Discovery Protocol" + default y + +config LLDPD_EDP + bool + prompt "Enable Extreme Discovery Protocol" + default y + +config LLDPD_SONMP + bool + prompt "Enable SynOptics Network Management Protocol" + default y + +config LLDPD_LLDPMED + bool + prompt "Enable LLDP-MED extension" + default y + +config LLDPD_DOT1 + bool + prompt "Enable Dot1 extension (VLAN stuff)" + default y + +config LLDPD_DOT3 + bool + prompt "Enable Dot3 extension (PHY stuff)" + default y + +config LLDPD_OLDIES + bool + prompt "Enable compatibility with Linux kernel older than 2.6.18" + +config LLDPD_SNMP + bool + prompt "Enable the use of SNMP" + +config LLDPD_XML + bool + prompt "Enable XML output via libxml2" + +config LLDPD_STARTSCRIPT + bool + prompt "install /etc/init.d/lldpd" + default y + +config LLDPD_DAEMON_ARGS + string + prompt "additional arguments for daemon startup" + default "" + help + This could be -c -e -f -s … + +endif + +# vim: ft=kconfig noet tw=72 diff --git a/rules/lldpd.make b/rules/lldpd.make new file mode 100644 index 0000000..a999100 --- /dev/null +++ b/rules/lldpd.make @@ -0,0 +1,89 @@ +# -*-makefile-*- +# +# Copyright (C) 2013 by Alexander Dahl +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_LLDPD) += lldpd + +# +# Paths and names +# +LLDPD_VERSION := 0.7.6 +LLDPD_MD5 := dbd90a68b91448dcb94a4a77c5d8ef65 +LLDPD := lldpd-$(LLDPD_VERSION) +LLDPD_SUFFIX := tar.gz +LLDPD_URL := http://media.luffy.cx/files/lldpd//$(LLDPD).$(LLDPD_SUFFIX) +LLDPD_SOURCE := $(SRCDIR)/$(LLDPD).$(LLDPD_SUFFIX) +LLDPD_DIR := $(BUILDDIR)/$(LLDPD) +LLDPD_LICENSE := ICS + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +LLDPD_CONF_TOOL := autoconf +LLDPD_CONF_OPT := $(CROSS_AUTOCONF_USR) \ + --disable-doxygen-doc \ + --without-embedded-libevent \ + --$(call ptx/endis, PTXCONF_LLDPD_CDP)-cdp \ + --$(call ptx/endis, PTXCONF_LLDPD_FDP)-fdp \ + --$(call ptx/endis, PTXCONF_LLDPD_EDP)-edp \ + --$(call ptx/endis, PTXCONF_LLDPD_SONMP)-sonmp \ + --$(call ptx/endis, PTXCONF_LLDPD_LLDPMED)-lldpmed \ + --$(call ptx/endis, PTXCONF_LLDPD_DOT1)-dot1 \ + --$(call ptx/endis, PTXCONF_LLDPD_DOT3)-dot3 \ + --$(call ptx/endis, PTXCONF_LLDPD_OLDIES)-oldies \ + --$(call ptx/wwo, PTXCONF_LLDPD_SNMP)-snmp \ + --$(call ptx/wwo, PTXCONF_LLDPD_XML)-xml \ + --with-privsep-user="$(PTXCONF_LLDPD_PRIVSEP_USER)" \ + --with-privsep-group="$(PTXCONF_LLDPD_PRIVSEP_GROUP)" \ + --with-privsep-chroot="$(PTXCONF_LLDPD_PRIVSEP_CHROOT)" + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/lldpd.targetinstall: + @$(call targetinfo) + + @$(call install_init, lldpd) + @$(call install_fixup, lldpd,PRIORITY,optional) + @$(call install_fixup, lldpd,SECTION,base) + @$(call install_fixup, lldpd,AUTHOR,"Alexander Dahl ") + @$(call install_fixup, lldpd,DESCRIPTION,missing) + + @$(call install_copy, lldpd, 0, 0, 0755, -, /usr/sbin/lldpd) + @$(call install_copy, lldpd, $(PTXCONF_LLDPD_PRIVSEP_USER), \ + $(PTXCONF_LLDPD_PRIVSEP_GROUP), 4750, -, /usr/sbin/lldpcli) + @$(call install_link, lldpd, lldpcli, /usr/sbin/lldpctl) + + @$(call install_lib, lldpd, 0, 0, 0644, liblldpctl) + +ifdef PTXCONF_INITMETHOD_BBINIT +ifdef PTXCONF_LLDPD_STARTSCRIPT + @$(call install_alternative, lldpd, 0, 0, 0755, /etc/init.d/lldpd) + @$(call install_replace, lldpd, /etc/init.d/lldpd, \ + @DAEMON_ARGS@, $(PTXCONF_LLDPD_DAEMON_ARGS)) + @$(call install_replace, lldpd, /etc/init.d/lldpd, \ + @PRIVSEP_CHROOT@, $(PTXCONF_LLDPD_PRIVSEP_CHROOT)) + +ifneq ($(call remove_quotes,$(PTXCONF_LLDPD_BBINIT_LINK)),) + @$(call install_link, lldpd, ../init.d/lldpd, \ + /etc/rc.d/$(PTXCONF_LLDPD_BBINIT_LINK)) +endif +endif +endif + + @$(call install_finish, lldpd) + + @$(call touch) + +# vim: ft=make noet diff --git a/rules/log4cplus.make b/rules/log4cplus.make index b91ea67..b389dd0 100644 --- a/rules/log4cplus.make +++ b/rules/log4cplus.make @@ -17,8 +17,8 @@ PACKAGES-$(PTXCONF_LOG4CPLUS) += log4cplus # # Paths and names # -LOG4CPLUS_VERSION := 1.1.0 -LOG4CPLUS_MD5 := 8f04a7b2db55384440b0ab83b6362d5d +LOG4CPLUS_VERSION := 1.1.1 +LOG4CPLUS_MD5 := e7844ba5c18073d9936e14def184d60a LOG4CPLUS := log4cplus-$(LOG4CPLUS_VERSION) LOG4CPLUS_SUFFIX := tar.xz LOG4CPLUS_URL := $(call ptx/mirror, SF, log4cplus/$(LOG4CPLUS).$(LOG4CPLUS_SUFFIX)) diff --git a/rules/mesa-demos.in b/rules/mesa-demos.in index 8e10794..d244d02 100644 --- a/rules/mesa-demos.in +++ b/rules/mesa-demos.in @@ -1,13 +1,40 @@ -## SECTION=multimedia_xorg_support_libs +## SECTION=multimedia_libs menuconfig MESA_DEMOS bool select MESALIB select GLEW + select GLU + select MESALIB_EGL if MESA_DEMOS_EGL + select MESALIB_GLES1 if MESA_DEMOS_GLES1 + select MESALIB_GLES2 if MESA_DEMOS_GLES2 + select MESALIB_OPENVG if MESA_DEMOS_VG + select MESALIB_EGL_WAYLAND if MESA_DEMOS_WAYLAND + select XORG_LIB_X11 if MESA_DEMOS_X11 + select XORG_LIB_XEXT if MESA_DEMOS_X11 prompt "mesa tools & demos " if MESA_DEMOS +config MESA_DEMOS_GLES1 + bool + +config MESA_DEMOS_EGL + bool + +config MESA_DEMOS_X11 + bool + +config MESA_DEMOS_WAYLAND + bool + +menuconfig MESA_DEMOS_X + bool + select MESA_DEMOS_X11 + prompt "X demos" + +if MESA_DEMOS_X11 + config MESA_DEMOS_CORENDER bool prompt "corender" @@ -88,6 +115,10 @@ config MESA_DEMOS_PBINFO bool prompt "pbinfo" +config MESA_DEMOS_SHAPE + bool + prompt "shape" + config MESA_DEMOS_SHAREDTEX bool prompt "sharedtex" @@ -111,5 +142,55 @@ config MESA_DEMOS_XFONT config MESA_DEMOS_XROTFONTDEMO bool prompt "xrotfontdemo" +endif + +menuconfig MESA_DEMOS_GLES2 + bool + select MESA_DEMOS_EGL + prompt "OpenGL ES2 demos" + +if MESA_DEMOS_GLES2 + +config MESA_DEMOS_ES2_INFO + bool + prompt "es2_info" + +config MESA_DEMOS_ES2GEARS_SCREEN + bool + prompt "es2gears_screen" + +config MESA_DEMOS_ES2GEARS_X11 + bool + prompt "es2gears_x11" + +config MESA_DEMOS_ES2TRI + bool + prompt "es2tri" + +config MESA_DEMOS_ES2GEARS_WAYLAND + bool + select MESA_DEMOS_WAYLAND + prompt "es2gears_wayland" + +endif + +menuconfig MESA_DEMOS_VG + bool + select MESA_DEMOS_GLES1 + select MESA_DEMOS_EGL + select MESA_DEMOS_X11 + prompt "OpenVG demos" + +if MESA_DEMOS_VG + +config MESA_DEMOS_VGIMAGE2TEX + bool + prompt "vgimage2tex" + +config MESA_DEMOS_TEX2VGIMAGE + bool + prompt "tex2vgimage" + +endif endif diff --git a/rules/mesa-demos.make b/rules/mesa-demos.make index 25bfbdf..d2d6de6 100644 --- a/rules/mesa-demos.make +++ b/rules/mesa-demos.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_MESA_DEMOS) += mesa-demos # # Paths and names # -MESA_DEMOS_VERSION := 8.0.1 -MESA_DEMOS_MD5 := 320c2a4b6edc6faba35d9cb1e2a30bf4 +MESA_DEMOS_VERSION := 8.1.0 +MESA_DEMOS_MD5 := 9df33ba69a26bbfbc7c8148602e59542 MESA_DEMOS := mesa-demos-$(MESA_DEMOS_VERSION) MESA_DEMOS_SUFFIX := tar.bz2 MESA_DEMOS_URL := ftp://ftp.freedesktop.org/pub/mesa/demos/$(MESA_DEMOS_VERSION)/$(MESA_DEMOS).$(MESA_DEMOS_SUFFIX) @@ -29,10 +29,29 @@ MESA_DEMOS_LICENSE := unknown # Prepare # ---------------------------------------------------------------------------- +MESA_DEMOS_CONF_ENV := \ + $(CROSS_ENV) \ + ac_cv_header_GL_glut_h=no \ + ac_cv_lib_glut_glutInit=no + # # autoconf # MESA_DEMOS_CONF_TOOL := autoconf +MESA_DEMOS_CONF_OPT := \ + $(CROSS_AUTOCONF_USR) \ + --disable-static \ + --$(call ptx/endis, PTXCONF_MESA_DEMOS_EGL)-egl \ + --$(call ptx/endis, PTXCONF_MESA_DEMOS_GLES1)-gles1 \ + --$(call ptx/endis, PTXCONF_MESA_DEMOS_GLES2)-gles2 \ + --$(call ptx/endis, PTXCONF_MESA_DEMOS_VG)-vg \ + --disable-osmesa \ + --disable-libdrm \ + --$(call ptx/endis, PTXCONF_MESA_DEMOS_X11)-x11 \ + --$(call ptx/endis, PTXCONF_MESA_DEMOS_WAYLAND)-wayland \ + --disable-gbm \ + --disable-freetype2 \ + # ---------------------------------------------------------------------------- # Target-Install @@ -41,7 +60,7 @@ MESA_DEMOS_CONF_TOOL := autoconf MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_CORENDER) += corender MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_GLSYNC) += glsync MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_GLTHREADS) += glthreads -MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_GLXCONTEXTS) += glxcontexts +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_GLXCONTEXTS) += glxcontexts MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_GLXDEMO) += glxdemo MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_GLXGEARS) += glxgears MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_GLXGEARS_FBCONFIG) += glxgears_fbconfig @@ -58,12 +77,20 @@ MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_OFFSET) += offset MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_OVERLAY) += overlay MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_PBDEMO) += pbdemo MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_PBINFO) += pbinfo +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_SHAPE) += shape MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_SHAREDTEX) += sharedtex MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_SHAREDTEX_MT) += sharedtex_mt MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_TEXTURE_FROM_PIXMAP)+= texture_from_pixmap MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_WINCOPY) += wincopy MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_XFONT) += xfont MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_XROTFONTDEMO) += xrotfontdemo +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_ES2_INFO) += es2_info +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_ES2GEARS_SCREEN) += es2gears_screen +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_ES2GEARS_WAYLAND) += es2gears_wayland +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_ES2GEARS_X11) += es2gears_x11 +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_ES2TRI) += es2tri +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_TEX2VGIMAGE) += tex2vgimage +MESA_DEMOS_BIN-$(PTXCONF_MESA_DEMOS_VGIMAGE2TEX) += vgimage2tex $(STATEDIR)/mesa-demos.targetinstall: @$(call targetinfo) diff --git a/rules/mesalib.in b/rules/mesalib.in index 9494949..617a3d6 100644 --- a/rules/mesalib.in +++ b/rules/mesalib.in @@ -1,23 +1,32 @@ -## SECTION=multimedia_xorg_support_libs +## SECTION=multimedia_libs menuconfig MESALIB tristate prompt "mesa " - select LIBDRM - select DRI2PROTO select HOST_MESALIB select HOST_MAKEDEPEND select HOST_SYSTEM_PYTHON select HOST_SYSTEM_PYTHON_XML2 - select XORG_LIB_X11 if MESALIB_DRI - select XORG_LIB_XEXT if MESALIB_DRI || MESALIB_XLIB_GLX - select XORG_LIB_XXF86VM if MESALIB_DRI - select XORG_LIB_XDAMAGE if MESALIB_DRI - select XORG_LIB_XFIXES if MESALIB_DRI - select XORG_PROTO_GL if MESALIB_DRI - select EXPAT if MESALIB_DRI select GCCLIBS select GCCLIBS_CXX + select LIBDRM + select UDEV if MESALIB_UDEV + select UDEV_LIBUDEV if MESALIB_UDEV + select WAYLAND if MESALIB_EGL_WAYLAND + select LIBDRM_RADEON if MESALIB_DRI_R200 + select LIBDRM_RADEON if MESALIB_DRI_R300 + select LIBDRM_RADEON if MESALIB_DRI_R600 + select LIBDRM_RADEON if MESALIB_DRI_RADEONSI + select LIBDRM_NOUVEAU if MESALIB_DRI_NOUVEAU + select LIBDRM_FREEDRENO if MESALIB_DRI_FREEDRENO + select DRI2PROTO if MESALIB_GLX + select XORG_LIB_X11 if MESALIB_GLX + select XORG_LIB_XEXT if MESALIB_GLX + select XORG_LIB_XXF86VM if MESALIB_GLX + select XORG_LIB_XDAMAGE if MESALIB_GLX + select XORG_LIB_XFIXES if MESALIB_GLX + select XORG_PROTO_GL if MESALIB_GLX + select EXPAT if MESALIB_GLX help Mesa is a 3-D graphics library with an API which is very similar to that of OpenGL. See the project homepage for @@ -27,84 +36,107 @@ menuconfig MESALIB if MESALIB -config MESALIB_DRI - prompt "DRI modules" +config MESALIB_UDEV bool config MESALIB_GLX prompt "GLX library" bool -config MESALIB_XLIB_GLX - depends on MESALIB_GLX - default !MESALIB_DRI && !MESALIB_OSMESA +comment "Drivers" + +config MESALIB_DRI_SWRAST bool + prompt "Software Rasterizer" -config MESALIB_OSMESA - prompt "OSMesa library" +config MESALIB_DRI_I915 bool + select MESALIB_OPENGL + prompt "Intel i915" -if MESALIB_DRI +config MESALIB_DRI_I965 + bool + select MESALIB_OPENGL + prompt "Intel i965" -config MESALIB_DRI_SWRAST +config MESALIB_DRI_R200 bool - prompt "Software Rasterizer " + select MESALIB_OPENGL + prompt "AMD R200" -menuconfig MESALIB_DRI_INTEL +config MESALIB_DRI_R300 bool - prompt "Intel DRI drivers " + prompt "AMD R300" -if MESALIB_DRI_INTEL +config MESALIB_DRI_R600 + bool + prompt "AMD R600" -config MESALIB_DRI_I915 +config MESALIB_DRI_RADEONSI bool - prompt "i915" + # needs LLVM + depends on BROKEN + prompt "AMD RadeonSI" -config MESALIB_DRI_I965 +config MESALIB_DRI_NOUVEAU_VIEUX bool - prompt "i965" + select MESALIB_OPENGL + prompt "Nvidia <= GForce4" -endif +config MESALIB_DRI_NOUVEAU + bool + prompt "Nvidia > GForce4" -menuconfig MESALIB_DRI_ATI +config MESALIB_DRI_FREEDRENO bool - prompt "Ati DRI drivers " + prompt "Freedreno" -if MESALIB_DRI_ATI +comment "API Support" -config MESALIB_DRI_R200 +config MESALIB_OPENGL bool - # needs libdrm_radeon - depends on BROKEN - prompt "r200" + prompt "OpenGL" -config MESALIB_DRI_R300 +config MESALIB_GLES1 bool - prompt "r300" + prompt "OpenGL ES1" -config MESALIB_DRI_R600 +config MESALIB_GLES2 bool - prompt "r600" + select MESALIB_OPENGL + prompt "OpenGL ES2" -config MESALIB_DRI_RADEON +config MESALIB_OPENVG bool - # needs libdrm_radeon - depends on BROKEN - prompt "radeon" + prompt "OpenVG" -endif +config MESALIB_EGL + bool + select MESALIB_UDEV + prompt "EGL" -menu "Other DRI Drivers " +config MESALIB_GBM + bool + select MESALIB_UDEV + prompt "GBM" -config MESALIB_DRI_NOUVEAU +if MESALIB_EGL + +comment "EGL Platforms" + +config MESALIB_EGL_X11 bool - # need libdrm_nouveau - depends on BROKEN - prompt "nouveau" + default MESALIB_GLX -endmenu +config MESALIB_EGL_DRM + bool + select MESALIB_GBM + prompt "DRM" -endif +config MESALIB_EGL_WAYLAND + bool + prompt "Wayland" endif +endif diff --git a/rules/mesalib.make b/rules/mesalib.make index e988333..1efdcef 100644 --- a/rules/mesalib.make +++ b/rules/mesalib.make @@ -19,11 +19,11 @@ PACKAGES-$(PTXCONF_MESALIB) += mesalib # # Paths and names # -MESALIB_VERSION := 8.0.3 -MESALIB_MD5 := cc5ee15e306b8c15da6a478923797171 +MESALIB_VERSION := 9.2.0 +MESALIB_MD5 := 4185b6aae890bc62a964f4b24cc1aca8 MESALIB := MesaLib-$(MESALIB_VERSION) MESALIB_SUFFIX := tar.bz2 -MESALIB_URL := ftp://ftp.freedesktop.org/pub/mesa/$(MESALIB_VERSION)/$(MESALIB).$(MESALIB_SUFFIX) +MESALIB_URL := ftp://ftp.freedesktop.org/pub/mesa/9.2/$(MESALIB).$(MESALIB_SUFFIX) MESALIB_SOURCE := $(SRCDIR)/$(MESALIB).$(MESALIB_SUFFIX) MESALIB_DIR := $(BUILDDIR)/Mesa-$(MESALIB_VERSION) @@ -39,22 +39,40 @@ ifdef PTXCONF_ARCH_X86 MESALIB_DRI_DRIVERS-$(PTXCONF_MESALIB_DRI_I915) += i915 MESALIB_DRI_DRIVERS-$(PTXCONF_MESALIB_DRI_I965) += i965 endif -MESALIB_DRI_DRIVERS-$(PTXCONF_MESALIB_DRI_NOUVEAU) += nouveau +MESALIB_DRI_DRIVERS-$(PTXCONF_MESALIB_DRI_NOUVEAU_VIEUX)+= nouveau MESALIB_DRI_DRIVERS-$(PTXCONF_MESALIB_DRI_R200) += r200 -MESALIB_DRI_DRIVERS-$(PTXCONF_MESALIB_DRI_RADEON) += radeon -MESALIB_DRI_DRIVERS-$(PTXCONF_MESALIB_DRI_SWRAST) += swrast -ifdef PTXCONF_ARCH_X86 -MESALIB_GALLIUM_DRIVERS-$(PTXCONF_MESALIB_DRI_I915) += i915 -endif ifndef PTXCONF_ARCH_X86 # needs llvm MESALIB_GALLIUM_DRIVERS-$(PTXCONF_MESALIB_DRI_R300) += r300 endif MESALIB_GALLIUM_DRIVERS-$(PTXCONF_MESALIB_DRI_R600) += r600 +MESALIB_GALLIUM_DRIVERS-$(PTXCONF_MESALIB_DRI_RADEONSI) += radeonsi + MESALIB_GALLIUM_DRIVERS-$(PTXCONF_MESALIB_DRI_NOUVEAU) += nouveau +MESALIB_GALLIUM_DRIVERS-$(PTXCONF_MESALIB_DRI_FREEDRENO)+= freedreno + MESALIB_GALLIUM_DRIVERS-$(PTXCONF_MESALIB_DRI_SWRAST) += swrast -MESALIB_DRI_LIBS-y += $(MESALIB_DRI_DRIVERS-y) $(MESALIB_GALLIUM_DRIVERS-y) +MESALIB_DRI_LIBS-y += \ + $(MESALIB_DRI_DRIVERS-y) \ + $(subst freedreno,kgsl,$(MESALIB_GALLIUM_DRIVERS-y)) + +MESALIB_LIBS-y := libglapi +ifneq ($(MESALIB_DRI_DRIVERS-y),) +MESALIB_LIBS-y += libdricore$(MESALIB_VERSION) +endif +MESALIB_LIBS-$(PTXCONF_MESALIB_GLX) += libGL +MESALIB_LIBS-$(PTXCONF_MESALIB_GLES1) += libGLESv1_CM +MESALIB_LIBS-$(PTXCONF_MESALIB_GLES2) += libGLESv2 +MESALIB_LIBS-$(PTXCONF_MESALIB_OPENVG) += libOpenVG +MESALIB_LIBS-$(PTXCONF_MESALIB_EGL) += libEGL egl/egl_gallium +MESALIB_LIBS-$(PTXCONF_MESALIB_GBM) += libgbm gbm/gbm_gallium_drm + +MESALIB_LIBS-y += $(addprefix gallium-pipe/pipe_,$(filter-out freedreno,$(MESALIB_GALLIUM_DRIVERS-y))) + +MESALIBS_EGL_PLATFORMS-$(PTXCONF_MESALIB_EGL_X11) += x11 +MESALIBS_EGL_PLATFORMS-$(PTXCONF_MESALIB_EGL_DRM) += drm +MESALIBS_EGL_PLATFORMS-$(PTXCONF_MESALIB_EGL_WAYLAND) += wayland MESALIB_CONF_TOOL := autoconf MESALIB_CONF_OPT := \ @@ -65,46 +83,35 @@ MESALIB_CONF_OPT := \ --disable-mangling \ --disable-texture-float \ --disable-asm \ - --enable-pic \ --disable-selinux \ - --enable-opengl \ - --disable-gles1 \ - --disable-gles2 \ - --disable-openvg \ - --$(call ptx/endis, PTXCONF_MESALIB_DRI)-dri \ + --$(call ptx/endis, PTXCONF_MESALIB_OPENGL)-opengl \ + --$(call ptx/endis, PTXCONF_MESALIB_GLES1)-gles1 \ + --$(call ptx/endis, PTXCONF_MESALIB_GLES2)-gles2 \ + --$(call ptx/endis, PTXCONF_MESALIB_OPENVG)-openvg \ + --enable-dri \ --$(call ptx/endis, PTXCONF_MESALIB_GLX)-glx \ - --$(call ptx/endis, PTXCONF_MESALIB_OSMESA)-osmesa \ - --disable-egl \ + --disable-osmesa \ + --disable-gallium-osmesa \ + --$(call ptx/endis, PTXCONF_MESALIB_EGL)-egl \ --disable-xorg \ --disable-xa \ - --disable-d3d1x \ - --disable-gbm \ + --$(call ptx/endis, PTXCONF_MESALIB_GBM)-gbm \ --disable-xvmc \ --disable-vdpau \ - --disable-va \ - --$(call ptx/endis, PTXCONF_MESALIB_XLIB_GLX)-xlib-glx \ - --disable-gallium-egl \ - --disable-gallium-gbm \ - --disable-shared-glapi \ + --disable-opencl \ + --disable-xlib-glx \ + --$(call ptx/endis, PTXCONF_MESALIB_EGL)-gallium-egl \ + --$(call ptx/endis, PTXCONF_MESALIB_GBM)-gallium-gbm \ + --disable-r600-llvm-compiler \ + --disable-gallium-tests \ + --enable-shared-glapi \ --enable-driglx-direct \ - --disable-shared-dricore \ - --$(call ptx/endis,PTXCONF_XORG_SERVER_OPT_GLX_TLS)-glx-tls \ - --disable-gallium-g3dvl \ - --enable-glu \ + --enable-glx-tls \ --disable-gallium-llvm \ --with-gallium-drivers=$(subst $(space),$(comma),$(MESALIB_GALLIUM_DRIVERS-y)) \ --with-dri-drivers=$(subst $(space),$(comma),$(MESALIB_DRI_DRIVERS-y)) \ - --with-expat=$(SYSROOT)/usr - - -# the 32/64 bit options result in CFLAGS -> -m32 and -m64 which seem -# only to be available on x86 - -ifdef PTXCONF_ARCH_X86 -MESALIB_CONF_OPT += \ - --enable-32-bit \ - --disable-64-bit -endif + --with-expat=$(SYSROOT)/usr \ + --with-egl-platforms="$(MESALIBS_EGL_PLATFORMS-y)" # ---------------------------------------------------------------------------- # Compile @@ -114,7 +121,7 @@ MESALIB_MAKE_OPT := HOST_CC=$(HOSTCC) $(STATEDIR)/mesalib.compile: @$(call targetinfo) - cp $(PTXCONF_SYSROOT_HOST)/bin/mesa/* $(MESALIB_DIR)/src/glsl/ + cp $(PTXCONF_SYSROOT_HOST)/bin/mesa/builtin_compiler $(MESALIB_DIR)/src/glsl/builtin_compiler/ @$(call compile, MESALIB) @$(call touch) @@ -131,16 +138,12 @@ $(STATEDIR)/mesalib.targetinstall: @$(call install_fixup, mesalib,AUTHOR,"Robert Schwebel ") @$(call install_fixup, mesalib,DESCRIPTION,missing) -ifdef PTXCONF_MESALIB_DRI @$(foreach lib, $(MESALIB_DRI_LIBS-y), \ - $(call install_copy, mesalib, 0, 0, 0644, -, /usr/lib/dri/$(lib)_dri.so);) -endif + $(call install_copy, mesalib, 0, 0, 0644, -, \ + /usr/lib/dri/$(lib)_dri.so);) - @$(call install_lib, mesalib, 0, 0, 0644, libGL) - @$(call install_lib, mesalib, 0, 0, 0644, libGLU) -ifdef PTXCONF_MESALIB_OSMESA - @$(call install_lib, mesalib, 0, 0, 0644, libOSMesa) -endif + @$(foreach lib, $(MESALIB_LIBS-y), \ + $(call install_lib, mesalib, 0, 0, 0644, $(lib));) @$(call install_finish, mesalib) diff --git a/rules/net-snmp.in b/rules/net-snmp.in index aed84a8..9821328 100644 --- a/rules/net-snmp.in +++ b/rules/net-snmp.in @@ -6,57 +6,146 @@ menuconfig NET_SNMP select GCCLIBS_GCC_S if NET_SNMP_AGENT select LIBC_DL if NET_SNMP_AGENT || NET_SNMP_APPLICATIONS select LIBNL if NET_SNMP_AGENT || NET_SNMP_APPLICATIONS + select LM_SENSORS if NET_SNMP_MIB_MODULES_LM_SENSORS if NET_SNMP -config NET_SNMP_MINI_AGENT +menu "additional mib modules " + +config NET_SNMP_MIB_MODULES_AGENTX + prompt "agentx" bool - default y - prompt "minimal agent" + help + AgentX support (includes both agentx/master and agentx/client). -config NET_SNMP_AGENT +config NET_SNMP_MIB_MODULES_UCD_SNMP + prompt "ucd_snmp" bool - prompt "agent (snmpd)" + help + UCD-SNMP-MIB specific extensions. -config NET_SNMP_APPLICATIONS +config NET_SNMP_MIB_MODULES_LM_SENSORS + prompt "ucd-snmp/lmsensorsMib" bool - prompt "apps (snmpget, ...)" + help + hardware monitoring (LM-SENSORS-MIB) -config NET_SNMP_SCRIPTS +config NET_SNMP_MIB_MODULES + prompt "additional mib modules" + string + default "" + help + space separated list of optional modules + tunnel Linux TUNNEL-MIB support (ifTable extension) + mibII/interfaces (old ifTable implementation) + misc/ipfwacc accounting rules IP firewall information + ipfwchains/ipfwchains firewall chains under ipfw + sctp-mib support for the SCTP-MIB + etherlike-mib support for the EtherLike-MIB + +config NET_SNMP_WITHOUT_MIB_MODULES + prompt "without these mib modules" + string + default "" + help + space separated list of default mib modules compiled into the + agent (which can be removed): + mibII support for the mib-II tree. + snmpv3mibs support for the snmpv3 mib modules. + agent_mibs NET-SNMP-AGENT-MIB extensions + notification mibs supporting specification of trap destinations. + target Support for the SNMP WGs TARGET-MIB. + utilities general agent configuration utilities. + disman/event support for the DISMAN-EVENT-MIB + disman/schedule support for the DISMAN-SCHEDULE-MIB + host host resources mib support. + +endmenu + +menuconfig NET_SNMP_MIBS bool - prompt "scripts (mib2c, ...)" + prompt "mib files " + +if NET_SNMP_MIBS -config NET_SNMP_MIBS +config NET_SNMP_V1MIBS bool - prompt "mib files" + prompt "v1 MIBS" + default y + help + RFC1155-SMI, RFC1213-MIB, RFC-1215 -config NET_SNMP_MIB_LOADING +config NET_SNMP_V2MIBS bool - prompt "include code that parses and manipulates mib files" + prompt "v2 MIBS" + default y + help + SNMPv2-CONF, SNMPv2-SMI, SNMPv2-TC, SNMPv2-TM, SNMPv2-MIB -config NET_SNMP_SNMPV1 +config NET_SNMP_V3MIBS bool - prompt "support for SNMPv1" + prompt "v3 MIBS" + default y + help + SNMP-FRAMEWORK-MIB, SNMP-MPD-MIB, SNMP-TARGET-MIB, + SNMP-NOTIFICATION-MIB, SNMP-PROXY-MIB, SNMP-USER-BASED-SM-MIB, + SNMP-VIEW-BASED-ACM-MIB, SNMP-COMMUNITY-MIB, TRANSPORT-ADDRESS-MIB -config NET_SNMP_SNMPV2C +config NET_SNMP_AGENTMIBS bool - prompt "support for SNMPv2c" + prompt "agent MIBS" + default y + help + AGENTX-MIB, SMUX-MIB -config NET_SNMP_DES +config NET_SNMP_IANAMIBS bool - prompt "DES encryption" + prompt "IANA MIBS" + default y + help + IANAifType-MIB, IANA-LANGUAGE-MIB, IANA-ADDRESS-FAMILY-NUMBERS-MIB -config NET_SNMP_MD5 +config NET_SNMP_RFCMIBS bool - prompt "MD5 authentication" + prompt "RFC MIBS" + default y + help + IF-MIB, IF-INVERTED-STACK-MIB, EtherLike-MIB, IP-MIB, + IP-FORWARD-MIB, IANA-RTPROTO-MIB, TCP-MIB, UDP-MIB, + INET-ADDRESS-MIB, HCNUM-TC, HOST-RESOURCES-MIB, + HOST-RESOURCES-TYPES, RMON-MIB, IPV6-TC, IPV6-MIB, IPV6-ICMP-MIB, + IPV6-TCP-MIB, IPV6-UDP-MIB, DISMAN-EVENT-MIB, DISMAN-SCRIPT-MIB, + DISMAN-SCHEDULE-MIB, NOTIFICATION-LOG-MIB, SNMP-USM-AES-MIB, + SNMP-USM-DH-OBJECTS-MIB -config NET_SNMP_SNMPTRAPD +config NET_SNMP_NETSNMPMIBS bool - prompt "agentx subagent code in snmptrapd" + prompt "Net-SNMP MIBS" + default y + help + NET-SNMP-TC, NET-SNMP-MIB, NET-SNMP-AGENT-MIB, + NET-SNMP-EXAMPLES-MIB, NET-SNMP-EXTEND-MIB, NET-SNMP-PASS-MIB -config NET_SNMP_LOCAL_SMUX +config NET_SNMP_UCDMIBS bool - prompt "restrict SMUX connections to localhost (by default)" + prompt "UCD MIBS" + default y + help + UCD-SNMP-MIB, UCD-DEMO-MIB, UCD-IPFWACC-MIB, UCD-DLMOD-MIB, + UCD-DISKIO-MIB + +config NET_SNMP_LMSENSORS_MIB + bool "lm-sensors MIBS" if NET_SNMP_MIB_MODULES_LM_SENSORS + help + LM-SENSORS-MIB + +config NET_SNMP_OTHERMIBS + bool + prompt "other MIBS" + help + BRIDGE-MIB, IPV6-FLOW-LABEL-MIB, SCTP-MIB, TUNNEL-MIB + +endif choice prompt "debugging" @@ -82,6 +171,59 @@ config NET_SNMP_STRIP_DEBUGGING endchoice +config NET_SNMP_MINI_AGENT + bool + default y + prompt "minimal agent" + +config NET_SNMP_AGENT + bool + prompt "agent (snmpd)" + +config NET_SNMP_APPLICATIONS + bool + prompt "apps (snmpget, ...)" + +config NET_SNMP_SCRIPTS + bool + prompt "scripts (mib2c, ...)" + +config NET_SNMP_MIB_LOADING + bool + prompt "include code that parses and manipulates mib files" + +config NET_SNMP_SNMPV1 + bool + prompt "support for SNMPv1" + +config NET_SNMP_SNMPV2C + bool + prompt "support for SNMPv2c" + +config NET_SNMP_DES + bool + prompt "DES encryption" + +config NET_SNMP_MD5 + bool + prompt "MD5 authentication" + +config NET_SNMP_DOM_SOCK_ONLY + bool "Disable UDP/TCP transports for agentx" if NET_SNMP_AGENT + default y + help + Enable this to disable TCP and UDP connections for subagent + connections with AgentX protocol. Only unix socket connections are + allowed then. + +config NET_SNMP_SNMPTRAPD + bool + prompt "agentx subagent code in snmptrapd" + +config NET_SNMP_LOCAL_SMUX + bool + prompt "restrict SMUX connections to localhost (by default)" + config NET_SNMP_DEVELOPER bool prompt "super-duper-extra-compile-warnings using gcc" @@ -101,24 +243,20 @@ config NET_SNMP_PERSISTENT_DIR string default "/var/net-snmp" -config NET_SNMP_MIB_MODULES - prompt "additional mib modules" - string - default "" - config NET_SNMP_DEFAULT_MIBS prompt "default mib id's to read" string - default "" + default "SNMPv2-MIB:IF-MIB:IP-MIB:TCP-MIB:UDP-MIB" + help + Colon separated list of default mib IDs to read. (The default list + is "SNMPv2-MIB:IF-MIB:IP-MIB:TCP-MIB:UDP-MIB" with the addition of + any mibs used by the mib modules the agent is configured with) config NET_SNMP_MIB_INSTALL_DIR prompt "directory to install mib files" string default "/usr/share/snmp/mibs" -config NET_SNMP_DOM_SOCK_ONLY - bool "Only allow domain socket connections to the agent" if NET_SNMP_AGENT - default y - help - Enable this to disable TCP and UDP connections to the agent. endif + +# vim: ft=kconfig noet tw=72 diff --git a/rules/net-snmp.make b/rules/net-snmp.make index 7a25043..6bdecd8 100644 --- a/rules/net-snmp.make +++ b/rules/net-snmp.make @@ -2,6 +2,7 @@ # # Copyright (C) 2006 by Randall Loomis # 2010 Michael Olbrich +# 2013 Alexander Dahl # # See CREDITS for details about who has contributed to this project. # @@ -31,7 +32,12 @@ NET_SNMP_DIR := $(BUILDDIR)/$(NET_SNMP) NET_SNMP_PATH := PATH=$(CROSS_PATH) NET_SNMP_ENV := $(CROSS_ENV) -NET_SNMP_BINCONFIG_GLOB := net-snmp-config + +NET_SNMP_MIB_MODULES-y := $(call remove_quotes,$(PTXCONF_NET_SNMP_MIB_MODULES)) +NET_SNMP_MIB_MODULES- := $(call remove_quotes,$(PTXCONF_NET_SNMP_WITHOUT_MIB_MODULES)) +NET_SNMP_MIB_MODULES-$(PTXCONF_NET_SNMP_MIB_MODULES_AGENTX) += agentx +NET_SNMP_MIB_MODULES-$(PTXCONF_NET_SNMP_MIB_MODULES_UCD_SNMP) += ucd_snmp +NET_SNMP_MIB_MODULES-$(PTXCONF_NET_SNMP_MIB_MODULES_LM_SENSORS) += ucd-snmp/lmsensorsMib # # autoconf @@ -42,7 +48,8 @@ NET_SNMP_AUTOCONF := \ --with-defaults \ --disable-manuals \ --without-openssl \ - --with-mib-modules=$(PTXCONF_NET_SNMP_MIB_MODULES) \ + --with-mib-modules="$(NET_SNMP_MIB_MODULES-y)" \ + --with-out-mib-modules="$(NET_SNMP_MIB_MODULES-)" \ --with-mibs=$(PTXCONF_NET_SNMP_DEFAULT_MIBS) \ --with-logfile=$(call remove_quotes,$(PTXCONF_NET_SNMP_LOGFILE)) \ --with-persistent-directory=$(call remove_quotes,$(PTXCONF_NET_SNMP_PERSISTENT_DIR)) \ @@ -54,11 +61,10 @@ NET_SNMP_AUTOCONF := \ --disable-privacy \ --disable-internal-md5 \ --$(call ptx/endis, PTXCONF_NET_SNMP_DOM_SOCK_ONLY)-agentx-dom-sock-only \ - --disable-mib-config-checking \ - --disable-mfd-rewrites \ + --enable-mib-config-checking \ + --enable-mfd-rewrites \ --disable-testing-code \ --disable-reentrant \ - --disable-embedded-perl \ --disable-ucd-snmp-compatibility ifdef PTXCONF_ENDIAN_LITTLE @@ -153,57 +159,79 @@ else NET_SNMP_AUTOCONF += --disable-developer endif -##NET_SNMP_AUTOCONF += --with-mib-modules=mibII -##NET_SNMP_AUTOCONF += --with-sys-contact=root@localhost -##NET_SNMP_AUTOCONF += --with-sys-location=unknown - NET_SNMP_MAKE_PAR := NO # ---------------------------------------------------------------------------- # Target-Install # ---------------------------------------------------------------------------- -NET_SNMP_LIBMAJOR := 25 -NET_SNMP_LIBMINOR := 0.1 -NET_SNMP_LIBVER :=$(NET_SNMP_LIBMAJOR).$(NET_SNMP_LIBMINOR) +NET_SNMP_MIBS := + +ifdef PTXCONF_NET_SNMP_MIBS -NET_SNMP_V1MIBS := RFC1155-SMI.txt RFC1213-MIB.txt RFC-1215.txt +ifdef PTXCONF_NET_SNMP_V1MIBS +NET_SNMP_MIBS += RFC1155-SMI.txt RFC1213-MIB.txt RFC-1215.txt +endif -NET_SNMP_V2MIBS := SNMPv2-CONF.txt SNMPv2-SMI.txt SNMPv2-TC.txt SNMPv2-TM.txt SNMPv2-MIB.txt +ifdef PTXCONF_NET_SNMP_V2MIBS +NET_SNMP_MIBS += SNMPv2-CONF.txt SNMPv2-SMI.txt SNMPv2-TC.txt \ + SNMPv2-TM.txt SNMPv2-MIB.txt +endif -NET_SNMP_V3MIBS := SNMP-FRAMEWORK-MIB.txt SNMP-MPD-MIB.txt SNMP-TARGET-MIB.txt \ - SNMP-NOTIFICATION-MIB.txt SNMP-PROXY-MIB.txt \ - SNMP-USER-BASED-SM-MIB.txt SNMP-VIEW-BASED-ACM-MIB.txt \ +ifdef PTXCONF_NET_SNMP_V3MIBS +NET_SNMP_MIBS += SNMP-FRAMEWORK-MIB.txt SNMP-MPD-MIB.txt \ + SNMP-TARGET-MIB.txt SNMP-NOTIFICATION-MIB.txt \ + SNMP-PROXY-MIB.txt SNMP-USER-BASED-SM-MIB.txt \ + SNMP-VIEW-BASED-ACM-MIB.txt \ SNMP-COMMUNITY-MIB.txt TRANSPORT-ADDRESS-MIB.txt +endif -NET_SNMP_AGENTMIBS := AGENTX-MIB.txt SMUX-MIB.txt +ifdef PTXCONF_NET_SNMP_AGENTMIBS +NET_SNMP_MIBS += AGENTX-MIB.txt SMUX-MIB.txt +endif -NET_SNMP_IANAMIBS := IANAifType-MIB.txt IANA-LANGUAGE-MIB.txt \ +ifdef PTXCONF_NET_SNMP_IANAMIBS +NET_SNMP_MIBS += IANAifType-MIB.txt IANA-LANGUAGE-MIB.txt \ IANA-ADDRESS-FAMILY-NUMBERS-MIB.txt +endif -NET_SNMP_RFCMIBS := IF-MIB.txt IF-INVERTED-STACK-MIB.txt \ - EtherLike-MIB.txt \ - IP-MIB.txt IP-FORWARD-MIB.txt IANA-RTPROTO-MIB.txt \ - TCP-MIB.txt UDP-MIB.txt \ - INET-ADDRESS-MIB.txt HCNUM-TC.txt \ - HOST-RESOURCES-MIB.txt HOST-RESOURCES-TYPES.txt \ - RMON-MIB.txt \ - IPV6-TC.txt IPV6-MIB.txt IPV6-ICMP-MIB.txt IPV6-TCP-MIB.txt \ - IPV6-UDP-MIB.txt \ - DISMAN-EVENT-MIB.txt DISMAN-SCRIPT-MIB.txt DISMAN-SCHEDULE-MIB.txt \ +ifdef PTXCONF_NET_SNMP_RFCMIBS +NET_SNMP_MIBS += IF-MIB.txt IF-INVERTED-STACK-MIB.txt \ + EtherLike-MIB.txt IP-MIB.txt \ + IP-FORWARD-MIB.txt IANA-RTPROTO-MIB.txt \ + TCP-MIB.txt UDP-MIB.txt INET-ADDRESS-MIB.txt \ + HCNUM-TC.txt HOST-RESOURCES-MIB.txt \ + HOST-RESOURCES-TYPES.txt RMON-MIB.txt \ + IPV6-TC.txt IPV6-MIB.txt IPV6-ICMP-MIB.txt \ + IPV6-TCP-MIB.txt IPV6-UDP-MIB.txt \ + DISMAN-EVENT-MIB.txt DISMAN-SCRIPT-MIB.txt \ + DISMAN-SCHEDULE-MIB.txt \ NOTIFICATION-LOG-MIB.txt SNMP-USM-AES-MIB.txt \ SNMP-USM-DH-OBJECTS-MIB.txt +endif -NET_SNMP_NETSNMPMIBS := NET-SNMP-TC.txt NET-SNMP-MIB.txt NET-SNMP-AGENT-MIB.txt \ - NET-SNMP-EXAMPLES-MIB.txt NET-SNMP-EXTEND-MIB.txt \ - NET-SNMP-PASS-MIB.txt +ifdef PTXCONF_NET_SNMP_NETSNMPMIBS +NET_SNMP_MIBS += NET-SNMP-TC.txt NET-SNMP-MIB.txt \ + NET-SNMP-AGENT-MIB.txt \ + NET-SNMP-EXAMPLES-MIB.txt \ + NET-SNMP-EXTEND-MIB.txt NET-SNMP-PASS-MIB.txt +endif -NET_SNMP_UCDMIBS := UCD-SNMP-MIB.txt UCD-DEMO-MIB.txt UCD-IPFWACC-MIB.txt \ +ifdef PTXCONF_NET_SNMP_UCDMIBS +NET_SNMP_MIBS += UCD-SNMP-MIB.txt UCD-DEMO-MIB.txt UCD-IPFWACC-MIB.txt \ UCD-DLMOD-MIB.txt UCD-DISKIO-MIB.txt +endif -## FIXME: for now, you need to manually edit this list to represent what mibs to install on target. -NET_SNMP_MIBS := $(NET_SNMP_V1MIBS) $(NET_SNMP_V2MIBS) $(NET_SNMP_V3MIBS) \ - $(NET_SNMP_AGENTMIBS) $(NET_SNMP_IANAMIBS) $(NET_SNMP_RFCMIBS) $(NET_SNMP_NETSNMPMIBS) $(NET_SNMP_UCDMIBS) +ifdef PTXCONF_NET_SNMP_LMSENSORS_MIB +NET_SNMP_MIBS += LM-SENSORS-MIB.txt +endif + +ifdef PTXCONF_NET_SNMP_OTHERMIBS +NET_SNMP_MIBS += BRIDGE-MIB.txt IPV6-FLOW-LABEL-MIB.txt SCTP-MIB.txt \ + TUNNEL-MIB.txt +endif + +endif $(STATEDIR)/net-snmp.targetinstall: @$(call targetinfo) @@ -264,9 +292,7 @@ endif # snmplib @$(call install_lib, net-snmp, 0, 0, 0644, libnetsnmp) -# MIB files ifdef PTXCONF_NET_SNMP_MIBS - @for i in $(NET_SNMP_MIBS); do \ $(call install_copy, net-snmp, 0, 0, 0644, -, \ $(call remove_quotes,$(PTXCONF_NET_SNMP_MIB_INSTALL_DIR))/$$i, n) ; \ @@ -276,4 +302,4 @@ endif @$(call install_finish, net-snmp) @$(call touch) -# vim: syntax=make +# vim: ft=make noet diff --git a/rules/wayland.make b/rules/wayland.make index c84de5c..5d833d9 100644 --- a/rules/wayland.make +++ b/rules/wayland.make @@ -16,8 +16,8 @@ PACKAGES-$(PTXCONF_WAYLAND) += wayland # # Paths and names # -WAYLAND_VERSION := 1.1.0 -WAYLAND_MD5 := d2dc9398a83692cafc16eba6e45f85d8 +WAYLAND_VERSION := 1.2.1 +WAYLAND_MD5 := dc75d060f23c0ef17ae95307cd525240 WAYLAND := wayland-$(WAYLAND_VERSION) WAYLAND_SUFFIX := tar.xz WAYLAND_URL := http://wayland.freedesktop.org/releases/$(WAYLAND).$(WAYLAND_SUFFIX) diff --git a/rules/xorg-server.in b/rules/xorg-server.in index cdee20e..8f73e32 100644 --- a/rules/xorg-server.in +++ b/rules/xorg-server.in @@ -384,7 +384,6 @@ config XORG_SERVER_EXT_GLX bool # This select doesn't work! But it is workarounded by mesalib only # presenting the DRI driver as it's backend if GLX is active. - select MESALIB_DRI select MESALIB_GLX prompt "glx extension" help From e5b3d684fd8420e9d2b9e0a8cfb4d4578f5557bb Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 20 Oct 2013 00:53:45 +0200 Subject: [PATCH 15/20] rtmpdump fix suffix --- rules/rtmpdump.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/rtmpdump.make b/rules/rtmpdump.make index a05782e..60c8fc7 100644 --- a/rules/rtmpdump.make +++ b/rules/rtmpdump.make @@ -19,7 +19,7 @@ PACKAGES-$(PTXCONF_RTMPDUMP) += rtmpdump RTMPDUMP_VERSION := 2.4 RTMPDUMP_MD5 := 8241345cf6476c1c1b9689494d6e820f RTMPDUMP := rtmpdump-$(RTMPDUMP_VERSION) -RTMPDUMP_SUFFIX := tgz +RTMPDUMP_SUFFIX := tar.gz RTMPDUMP_URL := http://rtmpdump.mplayerhq.hu/download/$(RTMPDUMP).$(RTMPDUMP_SUFFIX) RTMPDUMP_SOURCE := $(SRCDIR)/$(RTMPDUMP).$(RTMPDUMP_SUFFIX) RTMPDUMP_DIR := $(BUILDDIR)/$(RTMPDUMP) From 36eef2dc099f0a63f7880b2d0fc1f3cf4959f9a1 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 20 Oct 2013 00:54:31 +0200 Subject: [PATCH 16/20] fix patches mesalib --- .../0001-remove-crosscompile-check.patch | 41 ---------------- ...mpiling-host-tools-without-configure.patch | 48 ------------------- patches/MesaLib-8.0.3/series | 5 -- .../autogen.sh | 0 4 files changed, 94 deletions(-) delete mode 100644 patches/MesaLib-8.0.3/0001-remove-crosscompile-check.patch delete mode 100644 patches/MesaLib-8.0.3/0002-HACK-allow-compiling-host-tools-without-configure.patch delete mode 100644 patches/MesaLib-8.0.3/series rename patches/{MesaLib-8.0.3 => MesaLib-9.2.0}/autogen.sh (100%) diff --git a/patches/MesaLib-8.0.3/0001-remove-crosscompile-check.patch b/patches/MesaLib-8.0.3/0001-remove-crosscompile-check.patch deleted file mode 100644 index a874846..0000000 --- a/patches/MesaLib-8.0.3/0001-remove-crosscompile-check.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Erwin Rol -Date: Wed, 7 Jul 2010 10:57:40 +0200 -Subject: [PATCH] remove crosscompile check - -When cross compiling it refuses to use assembly since it assumes it can -not use the gen_matypes tool. But we fixed the gen_matypes so now the -test is not needed anymore. - -Signed-off-by: Erwin Rol -Signed-off-by: Marc Kleine-Budde ---- - configure.ac | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/configure.ac b/configure.ac -index fbaa376..1777d91 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -457,14 +457,14 @@ GLAPI_ASM_SOURCES="" - AC_MSG_CHECKING([whether to enable assembly]) - test "x$enable_asm" = xno && AC_MSG_RESULT([no]) - # disable if cross compiling on x86/x86_64 since we must run gen_matypes --if test "x$enable_asm" = xyes && test "x$cross_compiling" = xyes; then -- case "$host_cpu" in -- i?86 | x86_64) -- enable_asm=no -- AC_MSG_RESULT([no, cross compiling]) -- ;; -- esac --fi -+#if test "x$enable_asm" = xyes && test "x$cross_compiling" = xyes; then -+# case "$host_cpu" in -+# i?86 | x86_64) -+# enable_asm=no -+# AC_MSG_RESULT([no, cross compiling]) -+# ;; -+# esac -+#fi - # check for supported arches - if test "x$enable_asm" = xyes; then - case "$host_cpu" in diff --git a/patches/MesaLib-8.0.3/0002-HACK-allow-compiling-host-tools-without-configure.patch b/patches/MesaLib-8.0.3/0002-HACK-allow-compiling-host-tools-without-configure.patch deleted file mode 100644 index 7f43860..0000000 --- a/patches/MesaLib-8.0.3/0002-HACK-allow-compiling-host-tools-without-configure.patch +++ /dev/null @@ -1,48 +0,0 @@ -From: Michael Olbrich -Date: Wed, 7 Jul 2010 10:58:14 +0200 -Subject: [PATCH] HACK: allow compiling host tools without configure - -This patch modifies the Makefiles for the hosttools to allow -compiling without configure. This way we can avoid -unnecessary dependencies when only compiling host tools. - -Signed-off-by: Michael Olbrich ---- - src/glsl/Makefile | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -diff --git a/src/glsl/Makefile b/src/glsl/Makefile -index d9ecbc8..c6726a7 100644 ---- a/src/glsl/Makefile -+++ b/src/glsl/Makefile -@@ -3,7 +3,11 @@ - - TOP = ../.. - -+ifeq ($(wildcard $(TOP)/configs/current),) -+include $(TOP)/configs/default -+else - include $(TOP)/configs/current -+endif - - LIBNAME = glsl - -@@ -118,7 +122,8 @@ endif - - # Dummy target - install: $(DRICORE_INSTALL_TARGET) -- @echo -n "" -+ $(INSTALL) -d $(DESTDIR)/bin/mesa/ -+ $(INSTALL) -m 755 builtin_compiler $(DESTDIR)/bin/mesa/ - - install-dricore: default - $(INSTALL) -d $(DESTDIR)$(DRI_DRIVER_INSTALL_DIR) -@@ -165,7 +170,7 @@ glcpp/glcpp-parse.c: glcpp/glcpp-parse.y - builtin_compiler: $(GLSL2_OBJECTS) $(OBJECTS) builtin_stubs.o - $(APP_CXX) $(INCLUDES) $(CXXFLAGS) $(LDFLAGS) $(OBJECTS) $(GLSL2_OBJECTS) builtin_stubs.o -o $@ - --builtin_function.cpp: builtins/profiles/* builtins/ir/* builtins/tools/generate_builtins.py builtins/tools/texture_builtins.py builtin_compiler -+builtin_function.cpp: builtins/profiles/* builtins/ir/* builtins/tools/generate_builtins.py builtins/tools/texture_builtins.py - @echo Regenerating builtin_function.cpp... - $(PYTHON2) $(PYTHON_FLAGS) builtins/tools/generate_builtins.py ./builtin_compiler > builtin_function.cpp || rm -f builtin_function.cpp - diff --git a/patches/MesaLib-8.0.3/series b/patches/MesaLib-8.0.3/series deleted file mode 100644 index d6e472d..0000000 --- a/patches/MesaLib-8.0.3/series +++ /dev/null @@ -1,5 +0,0 @@ -# generated by git-ptx-patches -#tag:base --start-number 1 -0001-remove-crosscompile-check.patch -0002-HACK-allow-compiling-host-tools-without-configure.patch -# 4eecf2c7eca888d7920cf111797a97d5 - git-ptx-patches magic diff --git a/patches/MesaLib-8.0.3/autogen.sh b/patches/MesaLib-9.2.0/autogen.sh similarity index 100% rename from patches/MesaLib-8.0.3/autogen.sh rename to patches/MesaLib-9.2.0/autogen.sh From 266817c29b14929661d6521b16a8456b965b087e Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 20 Oct 2013 17:19:53 +0200 Subject: [PATCH 17/20] fix typo --- rules/net-snmp.make | 1 - 1 file changed, 1 deletion(-) diff --git a/rules/net-snmp.make b/rules/net-snmp.make index 1267e60..6bdecd8 100644 --- a/rules/net-snmp.make +++ b/rules/net-snmp.make @@ -66,7 +66,6 @@ NET_SNMP_AUTOCONF := \ --disable-testing-code \ --disable-reentrant \ --disable-ucd-snmp-compatibility - --disable-ucd-snmp-compatibility ifdef PTXCONF_ENDIAN_LITTLE NET_SNMP_AUTOCONF += --with-endianness=little From 0f5ffc8f3f37331d34560a2727254c4acc80f490 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Mon, 28 Oct 2013 02:01:35 +0100 Subject: [PATCH 18/20] upgrade directfb to 1.6.3 --- .../0001-fix-X11-detection.patch | 42 - ...py-that-needs-kernel-kernel-config-f.patch | 33 - patches/DirectFB-1.4.3/autogen.sh | 1 - patches/DirectFB-1.4.3/series | 2 - .../DirectFB-1.6.3/DirectFB-1.6.3.stm.patch | 21527 ++++++++++++++++ patches/DirectFB-1.6.3/autogen.sh | 18 + .../directfb-1.6.3.enigma2remote.diff | 444 + .../DirectFB-1.6.3/directfb-1.6.3.no-vt.diff | 106 + patches/DirectFB-1.6.3/series | 3 + rules/directfb.in | 18 +- rules/directfb.make | 55 +- 11 files changed, 22153 insertions(+), 96 deletions(-) delete mode 100644 patches/DirectFB-1.4.3/0001-fix-X11-detection.patch delete mode 100644 patches/DirectFB-1.4.3/0002-disable-ppc-memcpy-that-needs-kernel-kernel-config-f.patch delete mode 120000 patches/DirectFB-1.4.3/autogen.sh delete mode 100644 patches/DirectFB-1.4.3/series create mode 100644 patches/DirectFB-1.6.3/DirectFB-1.6.3.stm.patch create mode 100755 patches/DirectFB-1.6.3/autogen.sh create mode 100644 patches/DirectFB-1.6.3/directfb-1.6.3.enigma2remote.diff create mode 100644 patches/DirectFB-1.6.3/directfb-1.6.3.no-vt.diff create mode 100644 patches/DirectFB-1.6.3/series diff --git a/patches/DirectFB-1.4.3/0001-fix-X11-detection.patch b/patches/DirectFB-1.4.3/0001-fix-X11-detection.patch deleted file mode 100644 index 9570ad2..0000000 --- a/patches/DirectFB-1.4.3/0001-fix-X11-detection.patch +++ /dev/null @@ -1,42 +0,0 @@ -From ab900fcc9de2c1e2146cbf56abe95caebeba1caa Mon Sep 17 00:00:00 2001 -From: Erwin Rol -Date: Wed, 20 Jan 2010 00:15:56 +0100 -Subject: [PATCH 1/2] fix X11 detection - -Use pkgconfig for X11 detection. This diff is simply cherrypicked from -upstream and should not be needed anymore for the next release -of directfb. - -Signed-off-by: Erwin Rol ---- - configure.in | 14 ++------------ - 1 files changed, 2 insertions(+), 12 deletions(-) - -diff --git a/configure.in b/configure.in -index 1ca4d6d..6b7e0ba 100644 ---- a/configure.in -+++ b/configure.in -@@ -134,18 +134,8 @@ AC_ARG_ENABLE(x11, - enable_x11=yes) - - if test "$enable_x11" = "yes"; then -- CFLAGS_saved="$CFLAGS" -- CFLAGS="$CFLAGS -I/usr/X11R6/include" -- AC_CHECK_HEADER(X11/X.h, x11_found=yes, x11_found=no) -- CFLAGS="$CFLAGS_saved" -- if test "$x11_found" = no; then -- enable_x11=no -- AC_MSG_WARN([ --*** no X11/X.h found -- building without X11 support.]) -- else -- X11_LIBS="-L/usr/X11R6/lib -lX11 -lXext" -- X11_CFLAGS="-I/usr/X11R6/include" -- fi -+ PKG_CHECK_MODULES([X11], [xproto x11 xext], [enable_x11="yes"], [enable_x11="no", -+ AC_MSG_WARN([*** no X11 found -- building without X11 support])]) - fi - - AM_CONDITIONAL(X11_CORE, test "$enable_x11" = "yes") --- -1.6.6 - diff --git a/patches/DirectFB-1.4.3/0002-disable-ppc-memcpy-that-needs-kernel-kernel-config-f.patch b/patches/DirectFB-1.4.3/0002-disable-ppc-memcpy-that-needs-kernel-kernel-config-f.patch deleted file mode 100644 index fa00110..0000000 --- a/patches/DirectFB-1.4.3/0002-disable-ppc-memcpy-that-needs-kernel-kernel-config-f.patch +++ /dev/null @@ -1,33 +0,0 @@ -From be2ee14c009408145dcb2fe26a4667b3e7ed554b Mon Sep 17 00:00:00 2001 -From: Marc Kleine-Budde -Date: Wed, 20 Jan 2010 00:16:34 +0100 -Subject: [PATCH 2/2] disable ppc memcpy that needs kernel kernel config file - -ppcasm_memcpy_cachable.S needs the kernel config to compile. -This patch simply disables the file. - -Signed-off-by: Marc Kleine-Budde ---- - lib/direct/Makefile.am | 5 ----- - 1 files changed, 0 insertions(+), 5 deletions(-) - -diff --git a/lib/direct/Makefile.am b/lib/direct/Makefile.am -index ff89144..33ed187 100644 ---- a/lib/direct/Makefile.am -+++ b/lib/direct/Makefile.am -@@ -22,12 +22,7 @@ EXTRA_DIST = \ - ppc_asm.h - - if BUILDPPCASM --if HAVE_LINUX --ppcasm_sources = ppcasm_memcpy.S ppcasm_memcpy_cachable.S --else - ppcasm_sources = ppcasm_memcpy.S --endif -- - ppcasm_headers = ppcasm_memcpy.h ppc_asm.h - endif - --- -1.6.6 - diff --git a/patches/DirectFB-1.4.3/autogen.sh b/patches/DirectFB-1.4.3/autogen.sh deleted file mode 120000 index 9f8a4cb..0000000 --- a/patches/DirectFB-1.4.3/autogen.sh +++ /dev/null @@ -1 +0,0 @@ -../autogen.sh \ No newline at end of file diff --git a/patches/DirectFB-1.4.3/series b/patches/DirectFB-1.4.3/series deleted file mode 100644 index d8faf44..0000000 --- a/patches/DirectFB-1.4.3/series +++ /dev/null @@ -1,2 +0,0 @@ -0001-fix-X11-detection.patch -0002-disable-ppc-memcpy-that-needs-kernel-kernel-config-f.patch diff --git a/patches/DirectFB-1.6.3/DirectFB-1.6.3.stm.patch b/patches/DirectFB-1.6.3/DirectFB-1.6.3.stm.patch new file mode 100644 index 0000000..f2b568c --- /dev/null +++ b/patches/DirectFB-1.6.3/DirectFB-1.6.3.stm.patch @@ -0,0 +1,21527 @@ +diff --git a/SPECS/stm-target-directfb.template b/SPECS/stm-target-directfb.template +new file mode 100644 +index 0000000..16e23e6 +--- /dev/null ++++ b/SPECS/stm-target-directfb.template +@@ -0,0 +1,616 @@ ++%define _dfb_build_config x@BUILD_CONFIG@ ++ ++Name: %{_stm_pkg_prefix}-target-directfb@BUILD_CONFIG@ ++Summary: Hardware graphics acceleration library ++Group: DirectFB/Libraries ++%define _dfbversion 1.6.3 ++%define _abiversion 1.6-0 ++%define _stmversion +STM2013.08.30 ++Version: 1.6.3%{_stmversion} ++Release: 1 ++Epoch: 1 ++License: LGPL ++# created by: ++# git archive --format=tar --prefix=DirectFB-1.6.3/ DIRECTFB_1_6_3 | bzip2 --best > DirectFB-1.6.3.tar.bz2 ++# git diff DIRECTFB_1_6_3..DIRECTFB_1_6_3_STM2013.08.30 | bzip2 --best > DirectFB-1.6.3.stm.patch.bz2 ++# old way: ++# git archive --format=tar --prefix=DirectFB-1.6.1+STM2012.07.25/ DIRECTFB_1_6_1_STM2012.07.25 | bzip2 --best > DirectFB-1.6.1+STM2012.07.25.tar.bz2 ++Source0: DirectFB-%{_dfbversion}.tar.bz2 ++Patch0: DirectFB-%{_dfbversion}.stm.patch.bz2 ++ ++ ++URL: http://www.directfb.org ++Buildroot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-%{_stm_target_arch}-XXXXXX) ++Prefix: %{_stm_cross_target_dir} ++ ++BuildRequires: %{_stm_pkg_prefix}-%{_stm_target_arch}-libpng-dev ++BuildRequires: %{_stm_pkg_prefix}-host-fluxcomp >= 1.4.3 ++%if %target_cpu arm sh ++%define _mme_enabled yes ++%define _stmfbdev --enable-stmfbdev ++%else ++%define _mme_enabled no ++%define _stmfbdev --disable-stmfbdev ++%endif ++%if %target_cpu arm ++%define _multicore_enabled yes ++%else ++%define _multicore_enabled no ++%endif ++%if "%{_dfb_build_config}" == "x-multi" ++BuildRequires: %{_stm_pkg_prefix}-%{_stm_target_arch}-linux-fusion-headers >= 9.0.0 ++%define _dfb_multiapp --enable-multi ++%else ++%if "%{_dfb_build_config}" == "x" ++%define _dfb_multiapp --disable-multi ++%else ++# unsupported, error out ++unsupported BUILD_CONFIG option ++%endif ++%endif ++ ++%define _pkgname %{_stm_pkg_prefix}-%{_stm_target_arch}-directfb ++%define _fullname directfb-%{_abiversion} ++%define _docdir %{_stm_cross_target_dir}%{_stm_target_doc_dir} ++ ++ ++# ++# SRPM Package ++# ++%description ++The source package for directfb. ++ ++# ++# RPMS ++# ++%package -n %{_pkgname}@BUILD_CONFIG@ ++Summary: Hardware graphics acceleration library ++Group: DirectFB/Libraries ++Provides: %{_pkgname} = %{version}-%{release} ++ ++%if "%{_dfb_build_config}" == "x-multi" ++Provides: %{_pkgname}-multi = %{version}-%{release} ++Conflicts: %{_pkgname}-single ++%else ++%if "%{_dfb_build_config}" == "x" ++Provides: %{_pkgname}-single = %{version}-%{release} ++Conflicts: %{_pkgname}-multi ++%endif ++%endif ++%description -n %{_pkgname}@BUILD_CONFIG@ ++DirectFB is a thin library that provides developers with hardware graphics ++acceleration, input device handling and abstraction, an integrated windowing ++system with support for translucent windows and multiple display layers on top ++of the Linux frame buffer device. It is a complete hardware abstraction layer ++with software fallbacks for every graphics operation that is not supported by ++the underlying hardware. ++%if "%{_dfb_build_config}" == "x-multi" ++This version has been built with the Multi Application Core. ++%else ++%if "%{_dfb_build_config}" == "x" ++This version has been built with the Single Application Core. ++%endif ++%endif ++ ++%package -n %{_pkgname}@BUILD_CONFIG@-dev ++Summary: Hardware graphics acceleration library - development ++Group: DirectFB/Development ++AutoReq: no ++Provides: %{_pkgname}-dev = %{version}-%{release} ++%if "%{_dfb_build_config}" == "x-multi" ++Requires: %{_pkgname}-multi = %{version}-%{release} ++Provides: %{_pkgname}-multi-dev = %{version}-%{release} ++%else ++%if "%{_dfb_build_config}" == "x" ++Requires: %{_pkgname}-single = %{version}-%{release} ++Provides: %{_pkgname}-single-dev = %{version}-%{release} ++%endif ++%endif ++%description -n %{_pkgname}@BUILD_CONFIG@-dev ++DirectFB header files needed for building DirectFB applications. ++ ++%package -n %{_pkgname}@BUILD_CONFIG@-dbg ++Summary: Hardware graphics acceleration library - debug info ++Group: DirectFB/Development ++AutoReq: no ++Provides: %{_pkgname}-dbg = %{version}-%{release} ++%if "%{_dfb_build_config}" == "x-multi" ++Requires: %{_pkgname}-multi = %{version}-%{release} ++Provides: %{_pkgname}-multi-dbg = %{version}-%{release} ++%else ++%if "%{_dfb_build_config}" == "x" ++Requires: %{_pkgname}-single = %{version}-%{release} ++Provides: %{_pkgname}-single-dbg = %{version}-%{release} ++%endif ++%endif ++%description -n %{_pkgname}@BUILD_CONFIG@-dbg ++This package provides debug information for DirectFB. Debug information ++is useful for providing meaningful backtraces in case of bugs. ++ ++%package -n %{_pkgname}-bin ++Summary: Hardware graphics acceleration library - binaries ++Group: DirectFB/Development ++%description -n %{_pkgname}-bin ++ DirectFB is a graphics library which was designed with embedded systems ++ in mind. It offers maximum hardware accelerated performance at a minimum ++ of resource usage and overhead. ++ . ++ This package contains the various DirectFB tools, e.g. a background ++ configuration tool, and also the directfbrc man page. ++ ++%package -n %{_pkgname}-tests ++Summary: Hardware graphics acceleration library - tests ++Group: DirectFB/Development ++%description -n %{_pkgname}-tests ++ DirectFB is a graphics library which was designed with embedded systems ++ in mind. It offers maximum hardware accelerated performance at a minimum ++ of resource usage and overhead. ++ . ++ This package various tests that come with the DirectFB source tree. They ++ are normally not needed, except for maybe driver validatation. ++ ++ ++%prep ++%target_setup ++%setup -qn DirectFB-%{_dfbversion} ++%patch0 -p1 ++# the patch contains symlinks (in git format), but only git-patch can ++# deal with these, do it manually ++for i in fb.h vt.h ; do ++ rm -f systems/stmfbdev/${i} ++ ln -s ../fbdev/${i} systems/stmfbdev/ ++done ++%target_autoreconf ++ ++%build ++%target_setup ++# the st231 compiler emits a warning when it encounters multiple -O statements, ++# which makes auto* assume that some of its tests failed. Strip out existing -O ++# and add -O3 ++_stripped_flags= ++for _this_flag in $CFLAGS ; do ++ _stripped_flags="${_stripped_flags} `echo $_this_flag | sed -e 's,-O.,,'`" ++done ++export CFLAGS="${_stripped_flags} -O3" ++export CPPFLAGS="$CPPFLAGS -DDIRECTFB_VERSION_VENDOR=\\\"%{_stmversion}\\\"" ++# add -g for debug package ++export CFLAGS="${CFLAGS} -g3" ++export CXXFLAGS="${CFLAGS} -g3" ++ ++%target_do_configure \ ++ --enable-static \ ++ \ ++ --disable-devmem \ ++ --disable-sdl \ ++ %{_stmfbdev} \ ++ \ ++ --enable-voodoo \ ++ \ ++ --with-gfxdrivers=none \ ++ --enable-mme=%{_mme_enabled} \ ++ --enable-multicore=%{_multicore_enabled} \ ++ --with-message-size=65536 \ ++ \ ++ %{_dfb_multiapp} \ ++ \ ++ --with-tests ++%make ++ ++ ++%install ++%target_setup ++%target_makeinstall_destdir ++# make sure the graphics drivers directory exists as we don't (necessarily) ++# build graphics drivers. This will ensure a defined owner of this directory ++# (the DirectFB RPMs), also ensuring that the directory is removed during ++# uninstall of the DFB RPMs. ++mkdir -p %{buildroot}%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/gfxdrivers ++ ++# build directfb-config for host environment ++# we assume that _stm_target_lib_dir is in the default search path of both the cross ++# and target dynamic linkers, to suppres spurious -L/usr/lib in *.la files ++mkdir -p %{buildroot}%{_stm_cross_bin_dir} ++sed -e "s,libs=-L%{_stm_target_lib_dir},libs=,g" \ ++ -e "s,%{_stm_target_prefix},%{_stm_cross_target_dir}%{_stm_target_prefix},g" \ ++ < %{buildroot}%{_stm_cross_target_dir}%{_stm_target_bin_dir}/directfb-config \ ++ > %{buildroot}%{_stm_cross_bin_dir}/%{_stm_target_toolprefix}directfb-config ++chmod +x %{buildroot}%{_stm_cross_bin_dir}/%{_stm_target_toolprefix}directfb-config ++ ++%target_install_fixup ++# Process target .pc files so they are useful in a cross environment ++for f in %{buildroot}%{_stm_cross_target_dir}%{_stm_target_pkgconfig_dir}/*.pc ; do ++ sed -i '/^prefix=/!s,%{_stm_target_prefix},${prefix},' $f ++done ++ ++ ++cd .. ++cp COPYING LICENSE ++ ++ ++# pull debug from elf files out into separate files, to be packaged in the -dbg package ++: > debugfiles.list ++files=`find %{buildroot}%{_stm_cross_target_dir}%{_stm_target_bin_dir} -type f` || true ++files="${files} `find %{buildroot}%{_stm_cross_target_dir}%{_stm_target_lib_dir} -name '*so*' -type f | egrep -v '\.debug$' | egrep '(\.so$|\.so\.)'`" ++for elffile in ${files} ; do ++ sofile=`readelf -h ${elffile} 2> /dev/null | grep "DYN"` || true ++ execfile=`readelf -h ${elffile} 2> /dev/null | grep "EXEC"` || true ++ if [ "X${sofile}" != "X" -o "X${execfile}" != "X" ] ; then ++ debugfile=%{_stm_cross_target_dir}%{_stm_target_debug_dir}`echo ${elffile} | sed -e s,%{buildroot}%{_stm_cross_target_dir},,`.debug ++ mkdir -p `dirname %{buildroot}${debugfile}` ++ %{_stm_target_toolprefix}objcopy --only-keep-debug ${elffile} %{buildroot}${debugfile} ++ %{_stm_target_toolprefix}objcopy --strip-debug ${elffile} ++ %{_stm_target_toolprefix}objcopy --add-gnu-debuglink=%{buildroot}${debugfile} ${elffile} ++ echo ${debugfile} >> debugfiles.list ++ fi ++done ++ ++ ++%clean ++rm -rf %{buildroot} ++ ++ ++%files -n %{_pkgname}@BUILD_CONFIG@ ++%defattr(-,root,root) ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/lib*.so.* ++%dir %{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname} ++%dir %{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/* ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/*/lib*.so ++%dir %{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/interfaces/* ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/interfaces/*/lib*.so ++%dir %{_stm_cross_target_dir}%{_stm_target_data_dir}/directfb-%{_dfbversion} ++%{_stm_cross_target_dir}%{_stm_target_data_dir}/directfb-%{_dfbversion}/cursor.dat ++%doc AUTHORS ChangeLog LICENSE NEWS README TODO ++ ++%files -n %{_pkgname}@BUILD_CONFIG@-dev ++%defattr(-,root,root) ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/directfb-config ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/directfb-csource ++%{_stm_cross_target_dir}%{_stm_target_include_dir}/directfb ++%{_stm_cross_target_dir}%{_stm_target_include_dir}/directfb-internal ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/lib*.so ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/lib*.a ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/lib*.la ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/*/lib*.a ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/*/lib*.la ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/*/lib*.o ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/interfaces/*/lib*.a ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/interfaces/*/lib*.la ++%{_stm_cross_target_dir}%{_stm_target_lib_dir}/%{_fullname}/interfaces/*/lib*.o ++%{_stm_cross_target_dir}%{_stm_target_pkgconfig_dir}/*.pc ++%{_stm_cross_target_dir}%{_stm_target_data_dir}/man/man1/directfb-csource*1* ++%{_stm_cross_bin_dir}/* ++%doc AUTHORS ChangeLog LICENSE NEWS README TODO ++ ++%files -n %{_pkgname}@BUILD_CONFIG@-dbg -f debugfiles.list ++%defattr(-,root,root) ++%doc AUTHORS ChangeLog LICENSE NEWS README TODO ++ ++%files -n %{_pkgname}-bin ++%defattr(-,root,root) ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbdump ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbfx ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbg ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbinfo ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbinput ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbinspector ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfblayer ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbmaster ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbpenmount ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbproxy ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbscreen ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbdumpinput ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/mkdfiff ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/mkdgiff ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/mkdgifft ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/voodooplay ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/voodooplay_client ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/voodooplay_server ++%{_stm_cross_target_dir}%{_stm_target_data_dir}/man/man1/dfbg*1* ++%{_stm_cross_target_dir}%{_stm_target_data_dir}/man/man5/directfbrc*5* ++%doc AUTHORS ChangeLog LICENSE NEWS README TODO ++ ++%files -n %{_pkgname}-tests ++%defattr(-,root,root) ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/coretest_* ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/dfbtest_* ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/direct_* ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/fusion_* ++%{_stm_cross_target_dir}%{_stm_target_bin_dir}/voodoo_bench* ++%dir %{_stm_cross_target_dir}%{_stm_target_data_dir}/directfb-%{_dfbversion} ++%{_stm_cross_target_dir}%{_stm_target_data_dir}/directfb-%{_dfbversion}/decker.dgiff ++%doc AUTHORS ChangeLog LICENSE NEWS README TODO ++ ++ ++%changelog ++* Fri Aug 30 2013 Ilyes Gouta - 1:1.6.3+STM2013.08.30-1 ++- [Bugzilla: 29557] colour fill to NV12 and NV21 broken ++- [Bugzilla: 29559] IDirectFBSurface::Dump() for DSPF_YUV444P incorrect ++- [Bugzilla: 29496] IDirectFBSurface::Dump() for DSPF_(A)VYU incorrect ++- [Bugzilla: 29512] IDirectFBSurface::Dump() for DSPF_YV16 incorrect ++- [Bugzilla: 29985] DSPF_NV12MB and DSPF_NV16MB aren't marked as YCbCr ++- [Bugzilla: 35133] WebP imageprovider crashes when doing multiple RenderTo() ++- inputdrivers: set DICAPS_KEYS only for input devices with keys ++- imageprovider: add a new TIFF image provider ++ ++* Wed Jun 12 2013 André Draszik - 1:1.6.3+STM2013.04.10-2 ++- [Spec; Bugzilla: 31952] make sure we create and own the gfxdrivers directory ++ ++* Wed Apr 10 2013 Ilyes Gouta - 1:1.6.3+STM2013.04.10-1 ++- [Bugzilla: 29280] idirectfb: allow creating NV1xMB surfaces with ++ DSCAPS_PREMULTIPLIED set ++- imageprovider: add WebP imageprovider ++- hwjpeg: early validate the JPEG buffer with the h/w decoder ++- hwjpeg: don't downsample NV24 to a temporary NV16 buffer ++- [Bugzilla: 27188] fusion: ref: immediately execute FusionCall in ++ fusion_ref_down() ++- [Bugzilla: 16971] Revert ++ "direct: replace C++ style comments by standard C comments" ++- [Bugzilla: 27699] interfaces: gif: fix up DVPLAY_PACED decoding mode ++- [Bugzilla: 27886] idirectfb: don't clear config.surface_caps if already set ++ ++* Mon Feb 25 2013 Francesco Virlinzi 2 ++- [Spec; Bugzilla: 23138] Make compatible with rpm-build 4.10. ++ ++* Fri Feb 01 2013 Ilyes Gouta - 1:1.6.3+STM2013.02.01-1 ++- [Update: 1.6.3] update to 1.6.3 release ++- [Bugzilla: 25124] direct: reimplement direct_waitqueue_wait_timeout() to use ++ clock_gettime() ++- interfaces: jpeg: new hwjpeg-v4l2 image provider ++- directfb: new DSPF_NV24 pixel format ++- directfb: new DSPF_BYTE pixel format ++ ++* Fri Sep 21 2012 Ilyes Gouta - 1:1.6.1+STM2012.09.21-1 ++- [Bugzilla: 21232] DirectFB-1.6: Grayscale JPEG decoding is broken ++- [Bugzilla: 21233] DirectFB-1.6: LUT4 (or LUT2) animated gif doesn't ++ get rendered properly ++- [Bugzilla: 16971] DirectFB-1.6: replace C++ style comments by ++ standard C comments ++- [Bugzilla: 18969] Bad interaction between libmme.so and DirectFB ++ ++* Wed Aug 01 2012 Ilyes Gouta - 1:1.6.1+STM2012.07.25-1 ++- [Spec] configure with a 65356 bytes per Fusion message buffer (IPC) ++- [Spec] disable parallel build process (fluxcomp/gcc concurrency) ++ ++* Wed Jul 25 2012 André Draszik - 1:1.6.1+STM2012.07.25-1 ++- [Update: 1.6.1] update to 1.6.1 release ++- [Spec] change contents of SRPM to contain pristine tarball + STM patch ++- [Spec] add BuildRequires for fluxcomp ++- [Spec] enable voodoo during configure ++- [Spec] package binaries in new -bin package and move man pages here ++- [Spec] package tests in new -tests package ++- [Spec] always fully disable gfxdrivers, stgfx(1) is completely gone, ++ and stgfx2 is now hosted elsewhere ++- [Spec] build armv7 version with multicore support (SMP) ++- [Spec] always fully disable gfxdrivers, stgfx(1) is completely gone, ++ and stgfx2 is now hosted elsewhere ++- [Spec] forcefully enable stmfbdev on SH4 and ARM ++- [Bugzilla: 18771] stmfbdev: don't error out if display driver announced no ++ supported modes ++- stmfbdev: fix to actually allow configuring DVO, allow selection ++ between RGB 24bit and YCbCr 444 16bit ++- stmfbdev: add support for 960x540 and 1440x540 NTG5 modes ++- stmfbdev: for HDMI outputs, be more explicit about YCbCr 444 / 422 / RGB ++- move all of the stmfbdev layer and screen handling out of stgfx2, so that ++ stmfbdev can be used independently of any hardware acceleration ++- [Bugzilla: 12425] JPEG decode segfaults for iDCT downscaled grayscale images ++- [Bugzilla: 16039] jpeg software decode error path broken in case h/w decode ++ failed earlier ++- [Bugzilla: 16040] jpeg: optimise grayscale JPEG decoding ++- jpeg: use JDCT_FASTEST instead of JDCT_IFAST ++- image providers: change the backgrounded image provider API to use the ++ DIRenderFlags that upstream added recently, instead of our ++ DFBImageProviderFlags ++- rle: remove image provider ++- add DSPF_LUT4 implementation ++- add DSPF_BGR24 implementation ++- add DSPF_NV12MB and DSPF_NV16MB and (incomplete) implementation ++- directfb: extend IDirectFBInputDevice to recognize sensors-based input devices ++ ++* Fri Jun 08 2012 Ilyes Gouta 1:1.4.12+STM2011.09.27-3 ++- [Bugzilla: 17925] jpeg: fix stack corruption when going through hardware ++ assisted decode ++- [Bugzilla: 17956] fix SIGSEGV when downscaling via iDCT in the JPEG raw ++ decode path ++- [Bugzilla: 17958] image provider: have to wait for the hardware in certain ++ cases ++- [Bugzilla: 18969] prefer runtime dynamic linking for certain image providers ++- [Delete patch: DirectFB-1.4.12-directfb-improved-idirectfbvideoprovider_gif.patch, ++ DirectFB-1.4.12-directfb-DVPLAY_PACED-declaration.patch, ++ DirectFB-1.4.12-directfb-palette_pass_data-core_instead_of_NULL.patch] ++ not needed anymore ++ ++* Thu Feb 16 2012 Mohamed Hafsia 1:1.4.12+STM2011.09.27-2 ++- [Bugzilla: 16564] Rework IDirectFBVideoProvider_GIF to implement a paced decode ++- [Add patch: DirectFB-1.4.12-directfb-improved-idirectfbvideoprovider_gif.patch, ++ DirectFB-1.4.12-directfb-DVPLAY_PACED-declaration.patch ++ DirectFB-1.4.12-directfb-palette_pass_data-core_instead_of_NULL.patch] ++ Improved DirectFB IDirectFBVideoProvider_gif ++ ++* Tue Sep 27 2011 André Draszik - 1:1.4.12+STM2011.09.27-1 ++- [Bugzilla: 14222] subpixel based backwards blits don't look perfect ++- [Delete patch: ++ DirectFB-1.4.12+STM2011.05.05-bdisp2_accel-fix-directions-for-backwards-copy.patch, ++ DirectFB-1.4.12+STM2011.05.05-bdisp_accel-hot-fix-for-backwards-blits-than-don-t-r.patch] ++ not needed anymore ++ ++* Fri Sep 16 2011 André Draszik - 1:1.4.12+STM2011.05.05-3 ++- [Bugzilla: 14177; Add patch: ++ DirectFB-1.4.12+STM2011.05.05-bdisp2_accel-fix-directions-for-backwards-copy.patch, ++ DirectFB-1.4.12+STM2011.05.05-bdisp_accel-hot-fix-for-backwards-blits-than-don-t-r.patch] ++ hotfix for STLinux bugzilla 14177 ++ ++* Wed Aug 31 2011 Giuseppe Condorelli 1:1.4.12+STM2011.05.05-2 ++- [Spec] Add libpng BuildRequires, also rebuilding package against updated libpng ++ ++* Thu May 05 2011 André Draszik 1:1.4.12+STM2011.05.05-1 ++- [Bugzilla: 11922] really fix raw jpeg decoding for libjpeg >= v7 ++- [Bugzilla: 10850, 12050] clipping in "fb_gfxcard_drawstring" not checked correctly ++- fix small memory leak in DirectGetInterface() ++ ++* Thu Apr 14 2011 André Draszik 1:1.4.12+STM2011.04.14-1 ++- [Update: 1.4.12+STM2011.04.14] update to DirectFB 1.4.12 and latest STM version ++- [Bugzilla: 11689] inputdrivers: support lirc>=0.8.6 ++- [Bugzilla: 11884] build: libidirectfbfont_ft2 must be linked against libm ++- [Delete patch: DirectFB-1.4.11-non-mme-hotfix.patch] not needed anymore ++- [Bugzilla: 11922] fix raw jpeg decoding for libjpeg >= v7 ++ ++* Tue Apr 05 2011 André Draszik 1:1.4.11+STM2010.12.15-4 ++- [Bugzilla: 11825; Spec] add debug info package ++- [Spec] update summary of -dev package ++ ++* Thu Jan 06 2011 André Draszik 1:1.4.11+STM2010.12.15-3 ++- [Add patch: DirectFB-1.4.11-non-mme-hotfix.patch] hotfix for builds with ++ disabled MME ++- Breaks binary compatibility with Mali drivers (Mali drivers need to be rebuilt) ++ ++* Wed Jan 05 2011 André Draszik 1:1.4.11+STM2010.12.15-2 ++- [Spec] disable MME use for image decoding for non sh4 builds during configure ++ to fix build failures on ARM ++ ++* Wed Dec 15 2010 André Draszik 1:1.4.11+STM2010.12.15-1 ++- [Update: 1.4.11+STM2010.12.15] new release based on 1.4.11 + git 811a8c0 ++- [Bugzilla: 10320] don't set any output resolution on startup ++- [Bugzilla: 10344] take DirectFB's init-layer= option into account ++- [Bugzilla: 10769] want SOURCE2 support in DirectFB BDisp driver ++- image providers: accelerate JPEG and PNG using MME ++- fixed point fixes ++- [Delete patch: DirectFB-1.4.3-0001-stgfx2-version-bump.patch] integrated upstream ++- [Spec] Bump BuildRequires for linux-fusion to 8.2.0 ++- [Spec] drop setting of LIBPNG_CONFIG - it's not needed anymore ++ ++* Thu Oct 21 2010 André Draszik 1:1.4.3+STM2010.10.15-1 ++- [Add patch: DirectFB-1.4.3-0001-stgfx2-version-bump.patch] bump stgfx2 version ++ to 0.8 ++ ++* Fri Oct 15 2010 André Draszik 1:1.4.3+STM2010.10.15-1 ++- [Update: 1.4.3+STM2010.10.15] new release ++- [Bugzilla: 10253] jpeg: fix raw decode error paths ++- [Bugzilla: 10242] stgfx2: DSBLIT_XOR does not work ++- [Bugzilla: 10254] stgfx2: incorrect use of line filters for 'slim' stretch blits ++- [Bugzilla: 10228] stgfx2: disable use of hw based clipping ++- [Bugzilla: 10226] stgfx2: full DSBLIT_BLEND_COLORALPHA support ++- [Bugzilla: 10227] stgfx2: fix some 'unusual' PorterDuff blends ++- [Bugzilaa: 10247] stgfx2: DSPD_CLEAR crashes the BDisp in 422r modes ++- stgfx2 cleanup: blit state rewrite, compiler warnings, debug for DirectFB 1.4.3, ++ fixes for RGB32 ++- [Spec] some changes so as to make future updates easier ++ ++* Thu Aug 26 2010 André Draszik 1:1.4.3+STM2010.06.22-2 ++- [Spec] fix build requires to reference correct stmfb headers package version ++ on sh4 ++ ++* Wed Aug 25 2010 André Draszik 1:1.4.3+STM2010.06.22-1 ++- [Update: 1.4.3+STM2010.06.22] new release ++- [Delete patch: DirectFB-1.4.3+STM2010.06.16-stmfb0029.patch] we have an up to ++ date stmfb in STLinux 2.4 now, so this patch is a) harmful for STi7108 support ++ and b) not needed anymore anyway ++- stgfx2: fix clip validation ++ ++* Wed Jun 16 2010 André Draszik 1:1.4.3+STM2010.06.16-1 ++- [Update: 1.4.3.STM2010.06.16] new release ++- [Delete patch: DirectFB-1.4.3.STM2010.03.10-libjpeg7.patch, ++ DirectFB-1.4.3.STM2010.03.10-libjpeg7_2.patch] ++ jpeg problems correctly fixed upstream ++- [Delete patch: DirectFB-1.4-Revert-versioned-DirectFB-libraries.patch] ++ not needed anymore ++- [Add patch: DirectFB-1.4.3+STM2010.06.16-stmfb0029.patch] needed now ++ ++* Tue Apr 27 2010 André Draszik 1.4.3.STM2010.03.10-4 ++- [Bugzilla: 8912; Add patch: DirectFB-1.4.3.STM2010.03.10-libjpeg7.patch, ++ DirectFB-1.4.3.STM2010.03.10-libjpeg7_2.patch] ++ fix libjpeg usage for libjpeg versions >= 7 ++- [Spec] simplify file ownership list ++- [Spec] bump version to rebuild against updated libjpeg ++ ++* Tue Apr 13 2010 André Draszik 1.4.3.STM2010.03.10-3 ++- [Spec] fix source package name ++ ++* Wed Mar 31 2010 Stuart Menefy 2 ++- [Spec] Bump the release number for 2.4 product release. ++- [Spec] Update BuildRoot to use %%(mktemp ...) to guarantee a unique name. ++ ++* Wed Mar 09 2010 André Draszik 1.4.3.STM2010.03.10-1 ++- [Spec] add some more files to main package's documentation ++- merge in latest updates from DirectFB/master branch ++- input: handle button devices with just up/down keys as keyboards, too ++- stgfx2: fix shutdown error path ++- stgfx2: big cleanup regarding the destination address ++- stgfx2: slightly smaller cleanup regarding the s3 address & type ++- stgfx2: cleanup regarding s2 address & type ++- stgfx2: huge cleanup regarding drawing state ++- the above four changes yield in about 10% less CPU usage on fills! ++- [Bugzilla: 8256] XOR doesn't work as expected ++- [Bugzilla: 8406] prevent BDisp crash when doing YCbCr422R fast blit ++- [Bugzilla: 8366] desaturation of YCbCr surfaces ++- stgfx2: back to bdisp_aq_VideoYCbCr601_2_RGB matrix for YCbCr->RGB conversions ++- stgfx2: allow 'other' accelerators to access our surface pools ++- stgfx2: RGB32 updates ++ ++* Fri Feb 05 2010 André Draszik 1.4.3.STM2010.02.08-1 ++- [Bugzilla: 8193] do necessary changes (pollvsync_after) ++- [Bugzilla: 7360, 8077] subpixel vertical filter setup has been ++ greatly simplified and corrected ++ ++* Fri Feb 05 2010 André Draszik 1.4.3.STM2010.02.05-1 ++- stgfx stgfx2: fix shutdown when not running in stmfbdev system ++- linux_input: fix compilation if stmfbdev is disabled ++ ++* Sun Jan 31 2010 André Draszik 1.4.3.STM2010.01.31-1 ++- merge in latest updates from DirectFB/master branch ++- stmfbdev: address compiler warnings in non debug builds ++- stmfbdev: fix crash in shutdown ++- stmfbdev: optimize ioctl handling ++- stmfbdev: don't instanciate screens, layers & surface pools anymore ++- stgfx/stgfx2: move instanciation of the above here, this gets us rid of more of DirectFB's startup warnings ++ ++* Fri Jan 29 2010 André Draszik 1.4.3.STM2010.01.29-1 ++- [Bugzilla: 7995] new system: 'stmfbdev' for many new features reg. screen control ++- stgfx2: ++ + some fixes for blit and fill if destination is YUV ++ + WA for https://bugzilla.stlinux.com/show_bug.cgi?id=7084 ++ + update alignment restrictions for STi7108 ++ + stgfx surface pools: prevent confusing startup message ++- stgfx: ++ + update alignment restrictions for STi7108 ++ + stgfx surface pools: prevent confusing startup message ++- misc: ++ + dfbscreen: little fixes ++ + generic: LUT8 is not a YUV format ++ + screen: NTSC and PAL60 standards are defined as 59.94Hz not 60Hz ++ + IDirectFBScreen: add IDirectFBScreen::GetVSyncCount() ++ + directfb.h: add a DVO 656 'connector' ++ + dfblayer: allow to set layer position and size using command line ++ + dfbinspector: add DSPF_AVYU and DSPF_VYU pixelformats ++- [Delete patch: DirectFB-1.4.3.STM2009.12.11-CLUT8_fix.patch] integrated upstream ++ ++* Fri Jan 29 2010 André Draszik 1.4.3.STM2009.12.11-4 ++- [Add patch: DirectFB-1.4.3.STM2009.12.11-CLUT8_fix.patch] fix CLUT8 issue in ++ software renderer ++ ++* Mon Jan 11 2010 André Draszik 1.4.3.STM2009.12.11-3 ++- [Spec] unify multi app and single app spec files ++ ++* Wed Dec 16 2009 André Draszik 1.4.3.STM2009.12.11-2 ++- [Add patch: DirectFB-1.4.3.STM2009.12.11-autoconf259.patch] so as to enable ++ successful build on arm with old autotools in STLinux-2.3 ++ ++* Fri Dec 11 2009 André Draszik 1.4.3.STM2009.12.11-1 ++- [update: 2009-12.11] update to DirectFB 1.4.3 ++- misc: use pkgconfig to detect X11 ++- misc: surface: replace GetFramebufferOffset() with GetPhysicalAddress() ++- stgfx2: pick up all updates from 1.0.1 branch ++- stgfx2: release surface pools on shutdown ++- [Bugzilla: 7776] stgfx2: cleanup draw/blitting wrt flags ++- stgfx: release surface pools on shutdown ++- [Bugzilla: 7570] jpeg: implement decimated decode for software JPEG decoder ++- [Bugzilla: 7636] jpeg: implement raw libjpeg decode for possible HW acceleration (using stgfx2) ++ ++* Fri Aug 21 2009 André Draszik 1.4.1.STM2009.08.21-1 ++- [update: 2009-08-21] ++ allow source widths and heights < 1.0 (but > 0) in BatchStretchBlit() ++ ++* Tue Aug 18 2009 André Draszik 1.4.1.STM2009.08.18-1 ++- [update: 2009-08-18] ++ ++* Tue Jul 29 2009 André Draszik 1 ++- [update: 1.4.1] new upstream version with all the STM patches +diff --git a/configure.in b/configure.in +index 38d7e78..ec26981 100644 +--- a/configure.in ++++ b/configure.in +@@ -818,6 +818,46 @@ AM_CONDITIONAL(FBDEV_CORE, test "$enable_fbdev" = "yes") + + + ++dnl Test for STMicroelectronics frame buffer system ++stmfbdev_own_headers=no ++AC_ARG_ENABLE(stmfbdev, ++ AC_HELP_STRING([--enable-stmfbdev], ++ [build with STMicroelectronics stmfb system support @<:@default=auto@:>@]), ++ [], [enable_stmfbdev=yes]) ++if test "$have_linux" = "no"; then ++ enable_stmfbdev=no ++ AC_MSG_WARN([ ++*** no linux kernel -- building without STMicroelectronics stmfb system support.]) ++fi ++ ++if test "$enable_stmfbdev" = "yes"; then ++ orig_CFLAGS="$CFLAGS" ++ ++ AC_CHECK_HEADER([linux/stmfb.h], ++ [AC_MSG_CHECKING([whether linux/stmfb.h has stereoscopy support]) ++ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ++ #include ]], ++ [[struct stmfbio_3d_configuration 3d_config;]])], ++ [have_stmfbdev_h=yes], ++ [have_stmfbdev_h=no] ++ ) ++ AC_MSG_RESULT([$have_stmfbdev_h]) ++ ], ++ [have_stmfbdev_h=no], ++ [[#include ]]) ++ ++ if test "x$have_stmfbdev_h" != "xyes"; then ++ AC_MSG_WARN([*** STMFB header files not found. Will use own copy!]) ++ fi ++ ++ CFLAGS="$orig_CFLAGS" ++fi ++ ++AM_CONDITIONAL(STMFBDEV_CORE, test "$enable_stmfbdev" = "yes") ++AM_CONDITIONAL([STMFBDEV_USE_OWN_HEADERS], [test "x$have_stmfbdev_h" != "xyes"]) ++ ++ ++ + dnl Test for SDL + AC_ARG_ENABLE(sdl, + AC_HELP_STRING([--enable-sdl], +@@ -884,13 +924,61 @@ AC_SUBST(MESA_CFLAGS) + + + ++dnl test for MME ++MME=no ++mme_own_headers=no ++mme_own_transformers=no ++AC_ARG_ENABLE(mme, ++ AC_HELP_STRING([--enable-mme], ++ [build with MME support @<:@default=yes@:>@]), ++ [], [enable_mme=yes]) ++if test "$enable_mme" = "yes" ; then ++ MME=yes ++ AC_DEFINE(USE_MME, 1, [Define to 1 if MME should be used]) ++ ++ dnl use our own copy of mme.h and try to dlopen() libmme.so ++ AC_MSG_WARN([*** MME library not found. Will use dlopen().]) ++ AC_DEFINE(MME_USE_DLOPEN, 1, [Define to 1 if dlopen() etc should be used for MME libraries]) ++ LIBMME= ++ ++ AC_CHECK_HEADER([mme.h], [mme_ok="yes"], [mme_ok="no"]) ++ if test "$mme_ok" != "yes"; then ++ AC_MSG_WARN([*** MME header files not found. Will use own copy!]) ++ AC_DEFINE(MME_USE_OWN_HEADERS, 1, [Define to 1 if builtin MME headers should be used]) ++ mme_own_headers=yes ++ fi ++ AC_CHECK_HEADERS([JPEG_TransformerTypes.h JPEGDECHW_VideoTransformerTypes.h PNGDecode_interface.h], ++ [mme_ok="yes"], [mme_ok="no"]) ++ if test "$mme_ok" != "yes"; then ++ AC_MSG_WARN([*** MME Transformer header files not found. Will use own copies!]) ++ mme_own_transformers=yes ++ fi ++else ++ MME=no ++fi ++ ++AM_CONDITIONAL(MME_USE_OWN_HEADERS, test "$mme_own_headers" = "yes") ++AM_CONDITIONAL(MME_USE_OWN_TRANSFORMERS, test "$mme_own_transformers" = "yes") ++AC_SUBST(LIBMME) ++ ++ + dnl Test for libjpeg + JPEG=no ++JPEG_HW=no ++JPEG_HW_V4L2=no + + AC_ARG_ENABLE(jpeg, + AC_HELP_STRING([--enable-jpeg], + [build JPEG image provider @<:@default=yes@:>@]), + [], [enable_jpeg=yes]) ++AC_ARG_ENABLE(hwjpeg, ++ AC_HELP_STRING([--enable-hwjpeg], ++ [add hardware acceleration to JPEG image provider @<:@default=yes@:>@]), ++ [], [enable_hwjpeg=yes]) ++AC_ARG_ENABLE(hwjpeg_v4l2, ++ AC_HELP_STRING([--enable-hwjpeg-v4l2], ++ [enable a new JPEG image provider featuring h/w accelerated decoding via V4L2 @<:@default=yes@:>@]), ++ [], [enable_hwjpeg_v4l2=no]) + + if test "$enable_jpeg" = "yes"; then + if test -z "$LIBJPEG"; then +@@ -919,11 +1007,37 @@ if test "$enable_jpeg" = "yes"; then + fi + fi + ++if test "$enable_hwjpeg" != "no"; then ++ if test "$JPEG" = "yes"; then ++ if test "$MME" = "yes" ; then ++ AC_DEFINE(JPEG_PROVIDER_USE_MME, 1, [Define to 1 to enable hardware JPEG decoder]) ++ JPEG_HW=yes ++ JPEG_LIBMME=$LIBMME ++ else ++ AC_MSG_WARN([*** MME not found. Hardware JPEG image provider will not be built.]) ++ JPEG_HW=no ++ fi ++ else ++ AC_MSG_WARN([*** JPEG decoding not enabled. Hardware JPEG image provider can not be built.]) ++ JPEG_HW=no ++ fi ++else ++ JPEG_HW=no ++fi ++ ++if test "$enable_hwjpeg_v4l2" = "yes"; then ++ JPEG_HW_V4L2=yes ++fi ++ + AM_CONDITIONAL(JPEG_PROVIDER, test "$JPEG" = "yes") ++AM_CONDITIONAL(JPEG_PROVIDER_HW, test "$JPEG_HW" = "yes") ++AM_CONDITIONAL(JPEG_PROVIDER_HW_V4L2, test "$JPEG_HW_V4L2" = "yes") + +-if test "$enable_jpeg" != "no" && test "$JPEG" != "yes"; then +- jpeg_warning=" ++if test "$JPEG" != "yes"; then ++ if test "$enable_jpeg" != "no" || test "$enable_hwjpeg" != "no" ; then ++ jpeg_warning=" + JPEG support is missing - many applications won't work correctly!" ++ fi + fi + + +@@ -957,22 +1071,49 @@ AC_SUBST(ZLIB_LIBS) + + dnl Test for libpng + PNG=no ++PNG_HW=no + + AC_ARG_ENABLE(png, + AC_HELP_STRING([--enable-png], + [build PNG image provider, @<:@default=yes@:>@]), + [], [enable_png=yes]) ++AC_ARG_ENABLE(hwpng, ++ AC_HELP_STRING([--enable-hwpng], ++ [add hardware acceleration to PNG image provider @<:@default=yes@:>@]), ++ [], enable_hwpng="yes") ++ + if test "$enable_png" = "yes"; then + PKG_CHECK_MODULES([LIBPNG], [libpng >= 1.2.2], [PNG=yes], [PNG=no + AC_MSG_WARN([*** PNG library not found. PNG image provider will not be built.])]) + fi + ++if test "$enable_hwpng" != "no"; then ++ if test "$PNG" = "yes" ; then ++ if test "$MME" = "yes"; then ++ AC_DEFINE(PNG_PROVIDER_USE_MME, 1, [Define to 1 to enable hardware PNG decoder]) ++ PNG_HW=yes ++ PNG_LIBMME=$LIBMME ++ else ++ AC_MSG_WARN([*** MME not found. Hardware PNG image provider will not be built.]) ++ PNG_HW=no ++ fi ++ else ++ AC_MSG_WARN([*** PNG decoding not enabled. Hardware PNG image provider can not be built.]) ++ PNG_HW=no ++ fi ++else ++ PNG_HW=no ++fi ++ + AM_CONDITIONAL(PNG_PROVIDER, test "$PNG" = "yes") ++AM_CONDITIONAL(PNG_PROVIDER_HW, test "$PNG_HW" = "yes") + AM_CONDITIONAL(BUILD_DIRECTFB_CSOURCE, test "$PNG" = "yes") + +-if test "$enable_png" != "no" && test "$PNG" != "yes"; then +- png_warning=" ++if test "$PNG" != "yes"; then ++ if test "$enable_png" != "no" || "$enable_hwpng" != "no" ; then ++ png_warning=" + PNG support is missing - many applications won't work correctly!" ++ fi + fi + + +@@ -1080,6 +1221,18 @@ AC_ARG_ENABLE(gif, + + AM_CONDITIONAL(GIF_PROVIDER, test "$enable_gif" = "yes") + ++tiff="no" ++AC_ARG_ENABLE(tiff, ++ AC_HELP_STRING([--enable-tiff], ++ [build TIFF image provider, @<:@default=auto@:>@]), ++ [], [enable_tiff=yes]) ++if test "$enable_tiff" = "yes"; then ++ PKG_CHECK_MODULES([LIBTIFF], [libtiff-4], [tiff=yes], [tiff=no ++ AC_MSG_WARN([*** TIFF library not found. TIFF image provider will not be built.])]) ++fi ++ ++AM_CONDITIONAL(TIFF_PROVIDER, test "$tiff" = "yes") ++ + + + dnl Imlib2 check +@@ -1247,6 +1400,21 @@ if test "$V4L" = "yes"; then + fi + fi + ++dnl Test for libwebp ++webp=no ++ ++AC_ARG_ENABLE(webp, ++ AC_HELP_STRING([--enable-webp], ++ [build WebP image provider, @<:@default=auto@:>@]), ++ [], [enable_webp="yes"]) ++if test "$enable_webp" = "yes"; then ++ PKG_CHECK_MODULES([LIBWEBP], [libwebp >= 0.2.1], [webp=yes], [webp=no ++ AC_MSG_WARN([*** WebP library not found. WEBP image provider will not be built.])]) ++fi ++ ++AM_CONDITIONAL(WEBP_PROVIDER, test "$webp" = "yes") ++ ++ + + dnl check which gfxdrivers to build + ati128=no +@@ -2087,11 +2255,13 @@ AC_SUBST(ZLIB_LIBS) + AC_SUBST(GIF_PROVIDER) + AC_SUBST(JPEG_PROVIDER) + AC_SUBST(LIBJPEG) ++AC_SUBST(JPEG_LIBMME) + AC_SUBST(MNG_PROVIDER) + AC_SUBST(LIBMNG) + AC_SUBST(PNG_PROVIDER) + AC_SUBST(LIBPNG_CFLAGS) + AC_SUBST(LIBPNG_LIBS) ++AC_SUBST(PNG_LIBMME) + AC_SUBST(FREETYPE_PROVIDER) + AC_SUBST(FREETYPE_CFLAGS) + AC_SUBST(FREETYPE_LIBS) +@@ -2186,6 +2356,7 @@ systems/x11vdpau/Makefile + systems/osx/Makefile + systems/sdl/Makefile + systems/vnc/Makefile ++systems/stmfbdev/Makefile + + wm/Makefile + wm/default/Makefile +@@ -2323,6 +2494,7 @@ Building System Modules: + OSX support $enable_osx $OSX_CFLAGS $OSX_LIBS + SDL support $enable_sdl $SDL_CFLAGS $SDL_LIBS + VNC support $enable_vnc $VNC_CFLAGS $VNC_LIBS ++ STM stmfb support $enable_stmfbdev + + Building Window Manager Modules: + Default yes +@@ -2331,13 +2503,19 @@ Building Window Manager Modules: + Building Image Provider Modules: + GIF $enable_gif + JPEG $JPEG $LIBJPEG ++ - hardware $JPEG_HW $JPEG_LIBMME ++ - hardware via v4l2 $JPEG_HW_V4L2 + PNG $PNG $LIBPNG_CFLAGS $LIBPNG_LIBS ++ - hardware $PNG_HW $PNG_LIBMME + Imlib2 $imlib2 $IMLIB2_CFLAGS $IMLIB2_LIBS + PNM $pnm + SVG $svg $LIBSVG_CFLAGS $LIBSVG_LIBS + BMP $bmp ++ WEBP $webp $LIBWEBP_CFLAGS $LIBWEBP_LIBS + JPEG2000 $jpeg2000 $JASPER_LIBS + MPEG2 $mpeg2 ++ TIFF $tiff $LIBTIFF_CFLAGS $LIBTIFF_LIBS ++ + + + Building Video Provider Modules: +diff --git a/gfxdrivers/davinci/davinci_osd.c b/gfxdrivers/davinci/davinci_osd.c +index 2effb2e..4c4d4f1 100644 +--- a/gfxdrivers/davinci/davinci_osd.c ++++ b/gfxdrivers/davinci/davinci_osd.c +@@ -565,6 +565,7 @@ update_rgb( DavinciDriverData *ddrv, + dfb_convert_to_rgb16( buffer->format, + lock->addr + rect.y * lock->pitch + DFB_BYTES_PER_LINE( buffer->format, rect.x ), + lock->pitch, ++ NULL, 0, NULL, 0, + surface->config.size.h, + ddrv->fb[OSD0].mem + rect.y * ddev->fix[OSD0].line_length + rect.x * 2, + ddev->fix[OSD0].line_length, +diff --git a/include/directfb.h b/include/directfb.h +index dc7448c..db116b2 100644 +--- a/include/directfb.h ++++ b/include/directfb.h +@@ -599,7 +599,8 @@ typedef enum { + typedef enum { + DIRENDER_NONE = 0x00000000, + DIRENDER_FAST = 0x00000001, /* Select fast rendering method */ +- DIRENDER_ALL = 0x00000001 ++ DIRENDER_BACKGROUND = 0x00000002, /* Async rendering */ ++ DIRENDER_ALL = 0x00000003 + } DIRenderFlags; + + /* +@@ -914,8 +915,9 @@ typedef enum { + DIDTF_JOYSTICK = 0x00000004, /* Can be used as a joystick. */ + DIDTF_REMOTE = 0x00000008, /* Is a remote control. */ + DIDTF_VIRTUAL = 0x00000010, /* Is a virtual input device. */ ++ DIDTF_SENSOR = 0x00000020, /* Is a motion sensing input device. */ + +- DIDTF_ALL = 0x0000001F /* All type flags set. */ ++ DIDTF_ALL = 0x0000003F /* All type flags set. */ + } DFBInputDeviceTypeFlags; + + /* +@@ -926,8 +928,9 @@ typedef enum { + DICAPS_KEYS = 0x00000001, /* device supports key events */ + DICAPS_AXES = 0x00000002, /* device supports axis events */ + DICAPS_BUTTONS = 0x00000004, /* device supports button events */ ++ DICAPS_SENSORS = 0x00000008, /* device supports sensor events */ + +- DICAPS_ALL = 0x00000007 /* all capabilities */ ++ DICAPS_ALL = 0x0000000F /* all capabilities */ + #else + DIDCAPS_NONE = 0x00000000, /* device supports no events */ + DIDCAPS_KEYS = 0x00000001, /* device supports key events */ +@@ -968,6 +971,26 @@ typedef enum { + DIAI_LAST = 0x0000001F /* 32 axes maximum */ + } DFBInputDeviceAxisIdentifier; + ++ ++/* ++ * Sensors identifiers for sensors-equipped input devices ++ * ++ * Only motion generating sensors are defined here. Depending on its type as ++ * specified by DFBInputDeviceSensorIdentifier, the actual sensor data is ++ * stored in the sensor_data field of the DFBInputEvent structure and ++ * is expressed in a common referential (unit) across devices. ++ */ ++typedef enum { ++ DISI_ACCELEROMETER = 0x00000001, /* Accelerometer sensor type */ ++ DISI_GYROSCOPE = 0x00000002, /* Device rotation around ++ X, Y and Z axes */ ++ DISI_LINEAR_ACCELERATION = 0x00000010, /* Acceleration along each device ++ axis (without gravity value) */ ++ DISI_ORIENTATION = 0x00000020, /* Yaw, pitch and roll */ ++ DISI_ALL = 0x0000003F /* All sensors mask */ ++} DFBInputDeviceSensorIdentifier; ++ ++ + /* + * Flags defining which fields of a DFBWindowDescription are valid. + */ +@@ -1362,12 +1385,27 @@ typedef enum { + DSPF_LUT4 = DFB_SURFACE_PIXELFORMAT( 39, 4, 0, 1, 4, 0, 1, 0, 0, 1, 0 ), + + /* 16 bit LUT (1 byte alpha and 8 bit color lookup from palette) */ +- DSPF_ALUT8 = DFB_SURFACE_PIXELFORMAT( 40, 8, 8, 1, 0, 2, 0, 0, 0, 1, 0 ) ++ DSPF_ALUT8 = DFB_SURFACE_PIXELFORMAT( 40, 8, 8, 1, 0, 2, 0, 0, 0, 1, 0 ), ++ ++ /* 24 bit RGB (3 byte, blue 8@16, green 8@8, red 8@0) */ ++ DSPF_BGR24 = DFB_SURFACE_PIXELFORMAT( 41, 24, 0, 0, 0, 3, 0, 0, 0, 0, 0 ), ++ ++ /* 12 bit YUV (8 bit Y plane followed by one 16 bit quarter size Cb|Cr [7:0|7:0] plane) in Omega2 macroblock format */ ++ DSPF_NV12MB = DFB_SURFACE_PIXELFORMAT( 42, 12, 0, 0, 0, 1, 0, 2, 0, 0, 0 ), ++ ++ /* 16 bit YUV (8 bit Y plane followed by one 16 bit half width Cb|Cr [7:0|7:0] plane) in Omega2 macroblock format */ ++ DSPF_NV16MB = DFB_SURFACE_PIXELFORMAT( 43, 24, 0, 0, 0, 1, 0, 0, 1, 0, 0 ), ++ ++ /* 8 bit (1 byte w/ no pixel-padding, opaque buffer for carrying arbitray data) */ ++ DSPF_BYTE = DFB_SURFACE_PIXELFORMAT( 44, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0 ), ++ ++ /* 24 bit YUV (8 bit Y plane followed by one 16 bit full width Cb|Cr [7:0|7:0] plane) */ ++ DSPF_NV24 = DFB_SURFACE_PIXELFORMAT( 45, 24, 0, 0, 0, 1, 0, 0, 2, 0, 0 ) + + } DFBSurfacePixelFormat; + + /* Number of pixelformats defined */ +-#define DFB_NUM_PIXELFORMATS 41 ++#define DFB_NUM_PIXELFORMATS 46 + + /* These macros extract information about the pixel format. */ + #define DFB_PIXELFORMAT_INDEX(fmt) (((fmt) & 0x0000007F) ) +@@ -1420,7 +1458,10 @@ typedef enum { + ((fmt) == DSPF_YV12) || \ + ((fmt) == DSPF_NV12) || \ + ((fmt) == DSPF_NV16) || \ ++ ((fmt) == DSPF_NV12MB) || \ ++ ((fmt) == DSPF_NV16MB) || \ + ((fmt) == DSPF_NV21) || \ ++ ((fmt) == DSPF_NV24) || \ + ((fmt) == DSPF_AYUV) || \ + ((fmt) == DSPF_YUV444P) || \ + ((fmt) == DSPF_AVYU) || \ +@@ -1600,6 +1641,8 @@ typedef struct { + identifier */ + DFBInputDeviceButtonIdentifier max_button; /* highest button + identifier */ ++ DFBInputDeviceSensorIdentifier sensors; /* supported sensors ++ identifier */ + + char name[DFB_INPUT_DEVICE_DESC_NAME_LENGTH]; /* Device name */ + +@@ -1791,12 +1834,25 @@ typedef enum { + typedef enum { + DVPLAY_NOFX = 0x00000000, /* normal playback */ + DVPLAY_REWIND = 0x00000001, /* reverse playback */ +- DVPLAY_LOOPING = 0x00000002 /* automatically restart ++ DVPLAY_LOOPING = 0x00000002, /* automatically restart + playback when end-of-stream + is reached (gapless). */ ++ DVPLAY_PACED = 0x00000004, /* decoding pace is controlled ++ by the caller, the decoder ++ won't wait on its own while ++ decoding frames. */ + } DFBVideoProviderPlaybackFlags; + + /* ++ * Playback context passed to IDirectFBVideoProvider::PlayTo() ++ * when decoding in DVPLAY_PACED mode. ++ */ ++typedef struct { ++ unsigned int num_frame; ++ void *ctx; ++} DFBVideoProviderPacedPlaybackCtx; ++ ++/* + * Flags to allow Audio Unit selection. + */ + typedef enum { +@@ -5217,7 +5273,8 @@ typedef enum { + DIET_KEYRELEASE, /* a key is been released */ + DIET_BUTTONPRESS, /* a (mouse) button is been pressed */ + DIET_BUTTONRELEASE, /* a (mouse) button is been released */ +- DIET_AXISMOTION /* mouse/joystick movement */ ++ DIET_AXISMOTION, /* mouse/joystick movement */ ++ DIET_SENSOR /* sensor event */ + } DFBInputEventType; + + /* +@@ -5251,7 +5308,10 @@ typedef enum { + DIEF_FOLLOW = 0x0800, /* another event will follow immediately, e.g. x/y axis */ + + DIEF_MIN = 0x1000, /* minimum value is set, e.g. for absolute axis motion */ +- DIEF_MAX = 0x2000 /* maximum value is set, e.g. for absolute axis motion */ ++ DIEF_MAX = 0x2000, /* maximum value is set, e.g. for absolute axis motion */ ++ ++ DIEF_SENSOR = 0x4000 /* sensor type and data are valid, contents ++ depend on sensor type */ + } DFBInputEventFlags; + + /* +@@ -5302,6 +5362,11 @@ typedef struct { + /* general information */ + int min; /* minimum possible value */ + int max; /* maximum possible value */ ++ ++/* DIET_SENSOR */ ++ DFBInputDeviceSensorIdentifier sensor; /* in case of a sensor event */ ++ float sensor_data[3]; /* sensor data, depending ++ on DFBInputDeviceSensorIdentifier */ + } DFBInputEvent; + + /* +@@ -5550,6 +5615,7 @@ typedef struct { + unsigned int DIET_BUTTONPRESS; + unsigned int DIET_BUTTONRELEASE; + unsigned int DIET_AXISMOTION; ++ unsigned int DIET_SENSOR; + + unsigned int DWET_POSITION; + unsigned int DWET_SIZE; +@@ -6712,6 +6778,14 @@ D_DEFINE_INTERFACE( IDirectFBFont, + ) + + /* ++ * Flags for image providers. ++ */ ++typedef enum { ++ DIPSYNCFLAGS_SYNC, /* sync, i.e. wait for the image provider to finish */ ++ DIPSYNCFLAGS_TRYSYNC /* figure out if image provider is finished or still busy */ ++} DFBImageProviderSyncFlags; ++ ++/* + * Capabilities of an image. + */ + typedef enum { +@@ -6808,6 +6882,10 @@ D_DEFINE_INTERFACE( IDirectFBImageProvider, + * Registers a callback for progressive image loading. + * + * The function is called each time a chunk of the image is decoded. ++ * ++ * In case of an image provider working in the background, the ++ * callback could be called in a different thread context! So you ++ * might have to take appropriate actions to handle this. + */ + DFBResult (*SetRenderCallback) ( + IDirectFBImageProvider *thiz, +@@ -6820,6 +6898,30 @@ D_DEFINE_INTERFACE( IDirectFBImageProvider, + * + * This is optional and might be unsupported by some image providers + */ ++ /* ++ * Set image provider flags. ++ * ++ * This allows one to switch an image provider's mode of ++ * operation, between default and background. ++ * ++ * In default (which is also the traditional) mode, a call to ++ * RenderTo() will block until the image provider has finished ++ * decoding the image. This is also the behaviour if this API ++ * is not used at all. ++ * ++ * In background mode, the image is being decoded in the background, ++ * i.e. the call to RenderTo() will return almost immediately. The ++ * application may do other useful processing while the image is being ++ * decoded. In most implementations, background decode will just use ++ * a worker thread. ++ * ++ * Not all image providers support background mode and will return ++ * DFB_UNSUPPORTED in that case. ++ * ++ * Calling SetFlags() after RenderTo() makes no sense and is ++ * unsupported. ++ * ++ */ + DFBResult (*SetRenderFlags) ( + IDirectFBImageProvider *thiz, + DIRenderFlags flags +@@ -6836,6 +6938,25 @@ D_DEFINE_INTERFACE( IDirectFBImageProvider, + const DFBRectangle *src_rect, + const char *filename + ); ++ ++ ++ /** Rendering **/ ++ ++ /* ++ * For a background image provider, waits for it to finish ++ * decoding the image. ++ * ++ * For a default image provider, does nothing. ++ * ++ * This needs to be called for background image providers ++ * before accessing the destination surface (using either the ++ * software or the hardware), to make sure that the image has been ++ * completely decoded. ++ */ ++ DFBResult (*Sync) ( ++ IDirectFBImageProvider *thiz, ++ DFBImageProviderSyncFlags flags ++ ); + ) + + /* +diff --git a/inputdrivers/linux_input/linux_input.c b/inputdrivers/linux_input/linux_input.c +index a715c7a..b5a2b06 100644 +--- a/inputdrivers/linux_input/linux_input.c ++++ b/inputdrivers/linux_input/linux_input.c +@@ -112,6 +112,7 @@ typedef unsigned long kernel_ulong_t; + #define DISABLE_INPUT_HOTPLUG_FUNCTION_STUB + + #include ++#include + + #include + +@@ -1063,12 +1064,6 @@ get_device_info( int fd, + if (test_bit( EV_KEY, evbit )) { + int i; + +-#ifndef DIRECTFB_DISABLE_DEPRECATED +- info->desc.caps |= DICAPS_KEYS; +-#else +- info->desc.caps |= DIDCAPS_KEYS; +-#endif +- + /* get keyboard bits */ + ioctl( fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit ); + +@@ -1092,6 +1087,14 @@ get_device_info( int fd, + for (i=BTN_MOUSE; idesc.caps |= DICAPS_KEYS; ++#else ++ info->desc.caps |= DIDCAPS_KEYS; ++#endif ++ + } + + if (test_bit( EV_REL, evbit )) { +@@ -1252,7 +1255,7 @@ driver_get_available( void ) + int i; + char *tsdev; + +- if (!(dfb_config->linux_input_force || (dfb_system_type() == CORE_FBDEV) || (dfb_system_type() == CORE_MESA) )) ++ if (!(dfb_config->linux_input_force || (dfb_system_type() == CORE_FBDEV) || (dfb_system_type() == CORE_MESA) || (dfb_system_type() == CORE_STMFBDEV) )) + return 0; + + if (dfb_system_type() == CORE_FBDEV && !dfb_config->linux_input_force) { +@@ -1265,6 +1268,16 @@ driver_get_available( void ) + if (!dfb_fbdev->vt || dfb_fbdev->vt->fd < 0) + return 0; + } ++ else if (dfb_system_type() == CORE_STMFBDEV) { ++ const STMfbdev * const dfb_stm_fbdev = dfb_system_data(); ++ D_ASSERT( dfb_stm_fbdev ); ++ ++ // Only allow USB keyboard and mouse support if the systems driver has ++ // the Virtual Terminal file ("/dev/tty0") open and available for use. ++ // FIXME: Additional logic needed for system drivers not similar to fbdev? ++ if (!dfb_stm_fbdev->vt || dfb_stm_fbdev->vt->fd < 0) ++ return 0; ++ } + + /* Use the devices specified in the configuration. */ + if (fusion_vector_has_elements( &dfb_config->linux_input_devices )) { +@@ -1469,7 +1482,7 @@ get_capability( void ) + + InputDriverCapability capabilities = IDC_NONE; + +- if (!(dfb_config->linux_input_force || (dfb_system_type() == CORE_FBDEV) || (dfb_system_type() == CORE_MESA) )) ++ if (!(dfb_config->linux_input_force || (dfb_system_type() == CORE_FBDEV) || (dfb_system_type() == CORE_MESA) || (dfb_system_type() == CORE_STMFBDEV) )) + goto exit; + + if (dfb_system_type() == CORE_FBDEV) { +@@ -1484,6 +1497,16 @@ get_capability( void ) + goto exit; + } + } ++ else if (dfb_system_type() == CORE_STMFBDEV) { ++ const STMfbdev * const dfb_stm_fbdev = dfb_system_data(); ++ D_ASSERT( dfb_stm_fbdev ); ++ ++ // Only allow USB keyboard and mouse support if the systems driver has ++ // the Virtual Terminal file ("/dev/tty0") open and available for use. ++ // FIXME: Additional logic needed for system drivers not similar to fbdev? ++ if (!dfb_stm_fbdev->vt || dfb_stm_fbdev->vt->fd < 0) ++ goto exit; ++ } + + D_DEBUG_AT( Debug_LinuxInput, " -> returning HOTPLUG\n" ); + +@@ -1857,6 +1880,11 @@ driver_open_device( CoreInputDevice *device, + + if (dfb_fbdev->vt) + data->vt_fd = dup( dfb_fbdev->vt->fd ); ++ } else if (dfb_system_type() == CORE_STMFBDEV) { ++ const STMfbdev * const dfb_stm_fbdev = dfb_system_data(); ++ ++ if (dfb_stm_fbdev->vt) ++ data->vt_fd = dup( dfb_stm_fbdev->vt->fd ); + } + if (data->vt_fd < 0) + data->vt_fd = open( "/dev/tty0", O_RDWR | O_NOCTTY ); +diff --git a/interfaces/IDirectFBImageProvider/Makefile.am b/interfaces/IDirectFBImageProvider/Makefile.am +index 4b733aa..deab8da 100644 +--- a/interfaces/IDirectFBImageProvider/Makefile.am ++++ b/interfaces/IDirectFBImageProvider/Makefile.am +@@ -59,13 +59,46 @@ else + MPEG2_PROVIDER = + endif + ++if JPEG_PROVIDER_HW_V4L2 ++JPEG_PROVIDER_HW_V4L2_PROVIDER = libidirectfbimageprovider_hwjpeg_v4l2.la ++else ++JPEG_PROVIDER_HW_V4L2_PROVIDER = ++endif ++ ++if MME_USE_OWN_HEADERS ++MME_INCLUDE_PATH = -I$(top_srcdir)/interfaces/IDirectFBImageProvider/mme ++else ++MME_INCLUDE_PATH = ++endif ++if MME_USE_OWN_TRANSFORMERS ++TRANSFORMER_INCLUDE_PATH = -I$(srcdir)/mme/transform ++else ++TRANSFORMER_INCLUDE_PATH = ++endif ++ ++if WEBP_PROVIDER ++WEBP_PROVIDER = libidirectfbimageprovider_webp.la ++else ++WEBP_PROVIDER = ++endif ++ ++if TIFF_PROVIDER ++TIFF_PROVIDER = libidirectfbimageprovider_tiff.la ++else ++TIFF_PROVIDER = ++endif ++ ++ + INCLUDES = \ + -I$(top_builddir)/include \ + -I$(top_builddir)/lib \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/lib \ +- -I$(top_srcdir)/src ++ -I$(top_srcdir)/src \ ++ -I$(top_srcdir)/systems \ ++ $(MME_INCLUDE_PATH) \ ++ $(TRANSFORMER_INCLUDE_PATH) + + AM_CPPFLAGS = -DDATADIR=\"${RUNTIME_SYSROOT}@DATADIR@\" $(LIBJPEG_CFLAGS) $(LIBPNG_CFLAGS) + +@@ -79,8 +112,11 @@ idirectfbimageprovider_LTLIBRARIES = \ + $(SVG_PROVIDER) \ + $(BMP_PROVIDER) \ + $(JPEG2000_PROVIDER) \ +- $(MPEG2_PROVIDER) +- ++ $(MPEG2_PROVIDER) \ ++ $(JPEG_PROVIDER_HW_V4L2_PROVIDER) \ ++ $(WEBP_PROVIDER) \ ++ $(TIFF_PROVIDER) ++ + if BUILD_STATIC + idirectfbimageprovider_DATA = $(idirectfbimageprovider_LTLIBRARIES:.la=.o) + endif +@@ -89,9 +125,16 @@ endif + libdirect = $(top_builddir)/lib/direct/libdirect.la + libdirectfb = $(top_builddir)/src/libdirectfb.la + ++libidirectfbimageprovider_tiff_la_SOURCES = idirectfbimageprovider_tiff.c ++libidirectfbimageprovider_tiff_la_LIBADD = $(libdirect) $(libdirectfb) $(LIBTIFF_LIBS) ++libidirectfbimageprovider_tiff_la_LDFLAGS = -avoid-version -module ++ ++libidirectfbimageprovider_webp_la_SOURCES = idirectfbimageprovider_webp.c ++libidirectfbimageprovider_webp_la_LIBADD = $(libdirect) $(libdirectfb) $(LIBWEBP_LIBS) ++libidirectfbimageprovider_webp_la_LDFLAGS = -avoid-version -module + + libidirectfbimageprovider_png_la_SOURCES = idirectfbimageprovider_png.c +-libidirectfbimageprovider_png_la_LIBADD = $(libdirect) $(libdirectfb) $(LIBPNG_LIBS) ++libidirectfbimageprovider_png_la_LIBADD = $(libdirect) $(libdirectfb) $(LIBPNG_LIBS) $(PNG_LIBMME) + libidirectfbimageprovider_png_la_LDFLAGS = -avoid-version -module + + libidirectfbimageprovider_dfiff_la_SOURCES = idirectfbimageprovider_dfiff.c +@@ -103,7 +146,7 @@ libidirectfbimageprovider_gif_la_LIBADD = $(libdirect) $(libdirectfb) + libidirectfbimageprovider_gif_la_LDFLAGS = -avoid-version -module + + libidirectfbimageprovider_jpeg_la_SOURCES = idirectfbimageprovider_jpeg.c +-libidirectfbimageprovider_jpeg_la_LIBADD = $(libdirect) $(libdirectfb) $(LIBJPEG) ++libidirectfbimageprovider_jpeg_la_LIBADD = $(libdirect) $(libdirectfb) $(LIBJPEG) $(JPEG_LIBMME) + libidirectfbimageprovider_jpeg_la_LDFLAGS = -avoid-version -module + + libidirectfbimageprovider_imlib2_la_SOURCES = idirectfbimageprovider_imlib2.c +@@ -130,5 +173,8 @@ libidirectfbimageprovider_mpeg2_la_SOURCES = idirectfbimageprovider_mpeg2.c + libidirectfbimageprovider_mpeg2_la_LIBADD = $(libdirect) $(libdirectfb) mpeg2/libmpeg2decode.la + libidirectfbimageprovider_mpeg2_la_LDFLAGS = -avoid-version -module + ++libidirectfbimageprovider_hwjpeg_v4l2_la_SOURCES = idirectfbimageprovider_hwjpeg_v4l2.c ++libidirectfbimageprovider_hwjpeg_v4l2_la_LIBADD = $(libdirect) $(libdirectfb) ++libidirectfbimageprovider_hwjpeg_v4l2_la_LDFLAGS = -avoid-version -module + + include $(top_srcdir)/rules/libobject.make +diff --git a/interfaces/IDirectFBImageProvider/debug_helper.h b/interfaces/IDirectFBImageProvider/debug_helper.h +new file mode 100644 +index 0000000..f3062c2 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/debug_helper.h +@@ -0,0 +1,53 @@ ++#ifndef __DEBUG_HELPER_H__ ++#define __DEBUG_HELPER_H__ ++ ++ ++/* Some colour for debug */ ++#define BLACK "\033[22;30m" ++#define RED "\033[22;31m" ++#define GREEN "\033[22;32m" ++#define BROWN "\033[22;33m" ++ ++ ++ ++/* These messages should be provided through DirectFB's error and warning */ ++#define DEBUG_ERROR(x) D_ERROR x ++#define DEBUG_WARNING(x) D_WARN x ++ ++ ++#ifdef DEBUG ++/* *Very* Verbose */ ++# define DEBUG_INFO(x) D_PRINTF x ++/* Outputs various Buffer and surface sizes */ ++# define DEBUG_SCALE(x) D_PRINTF x ++/* Outputs Timing Information */ ++# define DEBUG_PERFORMANCE(x) D_PRINTF x ++ ++#else ++ ++# define DEBUG_INFO(x) __debug_msg x ++# define DEBUG_SCALE(x) __debug_msg x ++static inline int __attribute__ ((format (printf, 1, 2))) ++__debug_msg (const char *format, ...) ++{ ++ return 0; ++} ++ ++#endif ++ ++ ++#ifdef DIRECT_BUILD_DEBUG ++ ++# define deb_gettimeofday(tv,tz) gettimeofday(tv, tz) ++# define deb_timersub(a,b,res) timersub(a, b, res) ++ ++#else ++ ++# define deb_gettimeofday(tv,tz) ( { } ) ++# define deb_timersub(a,b,res) ( { } ) ++ ++#endif ++ ++ ++ ++#endif /* __DEBUG_HELPER_H__ */ +diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_hwjpeg_v4l2.c b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_hwjpeg_v4l2.c +new file mode 100644 +index 0000000..f5c9d0f +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_hwjpeg_v4l2.c +@@ -0,0 +1,753 @@ ++/* ++ (c) Copyright 2012 STMicroelectronics R&D ++ ++based on code: ++ (c) Copyright 2001-2010 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by Ilyes Gouta ++ Based on code by: ++ Andre' Draszik , ++ Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include "idirectfbimageprovider_hwjpeg_v4l2.h" ++ ++D_DEBUG_DOMAIN (HWJPEG_V4L2, "HWJPEG_V4L2", "STM h/w JPEG V4L2 decoder"); ++ ++static DFBResult ++Probe( IDirectFBImageProvider_ProbeContext *ctx ); ++ ++static DFBResult ++Construct( IDirectFBImageProvider *thiz, ++ ... ); ++ ++#include ++ ++DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, hwJPEG ) ++ ++static DFBResult ++IDirectFBImageProvider_hwJPEG_RenderTo( IDirectFBImageProvider *thiz, ++ IDirectFBSurface *destination, ++ const DFBRectangle *destination_rect ); ++ ++static DFBResult ++IDirectFBImageProvider_hwJPEG_GetSurfaceDescription( IDirectFBImageProvider *thiz, ++ DFBSurfaceDescription *dsc ); ++ ++static DFBResult ++IDirectFBImageProvider_hwJPEG_GetImageDescription( IDirectFBImageProvider *thiz, ++ DFBImageDescription *dsc ); ++ ++static DFBResult ++IDirectFBImageProvider_hwJPEG_SetRenderFlags( IDirectFBImageProvider *thiz, ++ DIRenderFlags flags ); ++ ++static DFBResult ++JPEG_hwRenderTo( IDirectFBImageProvider_hwJPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBRectangle *rect, ++ const DFBRegion *clip ); ++ ++static void ++IDirectFBImageProvider_hwJPEG_Destruct( IDirectFBImageProvider *thiz ) ++{ ++ IDirectFBImageProvider_hwJPEG_data *data = ++ (IDirectFBImageProvider_hwJPEG_data*)thiz->priv; ++ ++ if (data->decode_surface) { ++ dfb_gfxcard_wait_serial( &data->serial ); ++ dfb_surface_unref( data->decode_surface ); ++ data->decode_surface = NULL; ++ } ++} ++ ++static DFBResult ++Probe( IDirectFBImageProvider_ProbeContext *ctx ) ++{ ++ /* Look of the Jpeg SOI marker */ ++ if (ctx->header[0] == 0xff && ctx->header[1] == 0xd8) { ++ /* Look for JFIF or Exif strings, also could look at header[3:2] for APP0(0xFFE0), ++ * APP1(0xFFE1) or even other APPx markers. ++ */ ++ if (strncmp ((char*) ctx->header + 6, "JFIF", 4) == 0 || ++ strncmp ((char*) ctx->header + 6, "Exif", 4) == 0 || ++ strncmp ((char*) ctx->header + 6, "VVL", 3) == 0 || ++ strncmp ((char*) ctx->header + 6, "WANG", 4) == 0) ++ return DFB_OK; ++ ++ /* Else look for Quantization table marker or Define Huffman table marker, ++ * useful for EXIF thumbnails that have no APPx markers. ++ */ ++ if (ctx->header[2] == 0xff && (ctx->header[3] == 0xdb || ctx->header[3] == 0xc4)) ++ return DFB_OK; ++ ++ if (ctx->filename && strchr (ctx->filename, '.' ) && ++ (strcasecmp ( strchr (ctx->filename, '.' ), ".jpg" ) == 0 || ++ strcasecmp ( strchr (ctx->filename, '.' ), ".jpeg") == 0)) ++ return DFB_OK; ++ } ++ ++ return DFB_UNSUPPORTED; ++} ++ ++static DFBResult ++Construct( IDirectFBImageProvider *thiz, ++ ... ) ++{ ++ IDirectFBDataBuffer *buffer; ++ CoreDFB *core; ++ va_list tag; ++ struct v4l2_fmtdesc fmtdesc; ++ ++ DFBRegion region = { ++ .x1 = 0, ++ .y1 = 0, ++ .x2 = 255, ++ .y2 = 255 ++ }; ++ ++ DIRECT_ALLOCATE_INTERFACE_DATA( thiz, IDirectFBImageProvider_hwJPEG ) ++ ++ va_start( tag, thiz ); ++ buffer = va_arg( tag, IDirectFBDataBuffer * ); ++ core = va_arg( tag, CoreDFB * ); ++ va_end( tag ); ++ ++ D_ASSERT( core != NULL ); ++ ++ data->fd = open( "/dev/video0", O_RDWR ); ++ ++ if (data->fd < 0) { ++ D_DEBUG_AT( HWJPEG_V4L2, ++ "%s: couldn't open /dev/video0\n", ++ __FUNCTION__ ); ++ DIRECT_DEALLOCATE_INTERFACE( thiz ); ++ return DFB_FAILURE; ++ } ++ ++ memset( &fmtdesc, 0, sizeof(fmtdesc) ); ++ ++ fmtdesc.index = 0; ++ fmtdesc.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ ++ if (ioctl( data->fd, VIDIOC_ENUM_FMT, &fmtdesc ) < 0) { ++ D_DEBUG_AT( HWJPEG_V4L2, ++ "%s: couldn't enumerate output formats on /dev/video0\n", ++ __FUNCTION__ ); ++ close( data->fd ); ++ DIRECT_DEALLOCATE_INTERFACE( thiz ); ++ return DFB_FAILURE; ++ } ++ ++ close( data->fd ); ++ ++ if (fmtdesc.pixelformat != V4L2_PIX_FMT_JPEG) { ++ D_DEBUG_AT( HWJPEG_V4L2, ++ "%s: /dev/video0 doesn't accept JPEG streams\n", ++ __FUNCTION__ ); ++ DIRECT_DEALLOCATE_INTERFACE( thiz ); ++ return DFB_FAILURE; ++ } ++ ++ data->base.ref = 1; ++ data->base.buffer = buffer; ++ data->base.core = core; ++ ++ /* check if the h/w decoder can really decode the JPEG. ++ It will return the recommended destination buffer width, height ++ and pixel format on success. */ ++ if (JPEG_hwRenderTo( data, NULL, NULL, ®ion ) != DFB_OK) { ++ D_DEBUG_AT( HWJPEG_V4L2, ++ "%s: /dev/video0 can't decode the JPEG picture\n", ++ __FUNCTION__ ); ++ DIRECT_DEALLOCATE_INTERFACE( thiz ); ++ return DFB_FAILURE; ++ } ++ ++ buffer->AddRef( buffer ); ++ ++ data->base.Destruct = IDirectFBImageProvider_hwJPEG_Destruct; ++ ++ thiz->RenderTo = IDirectFBImageProvider_hwJPEG_RenderTo; ++ thiz->Sync = NULL; ++ thiz->GetImageDescription = ++ IDirectFBImageProvider_hwJPEG_GetImageDescription; ++ thiz->SetRenderFlags = IDirectFBImageProvider_hwJPEG_SetRenderFlags; ++ thiz->GetSurfaceDescription = ++ IDirectFBImageProvider_hwJPEG_GetSurfaceDescription; ++ ++ return DFB_OK; ++} ++ ++static void ++JPEG_stretchblit( IDirectFBImageProvider_hwJPEG_data *data, ++ CardState *state, ++ DFBRectangle *src_rect, ++ DFBRectangle *dst_rect ) ++{ ++ D_DEBUG_AT( HWJPEG_V4L2, "StretchBlit %dx%d -> %dx%d (%s -> %s)\n", ++ src_rect->w, src_rect->h, dst_rect->w, dst_rect->h, ++ dfb_pixelformat_name( state->source->config.format), ++ dfb_pixelformat_name( state->destination->config.format ) ); ++ ++ /* thankfully this is intelligent enough to do a simple blit if ++ possible */ ++ dfb_gfxcard_stretchblit( src_rect, dst_rect, state ); ++ /* we need to remember the serial in case a new surface is created ++ (and written to) at the same address as the decode_surface before the ++ blit operation is finished. This can happen if we get into the ++ destructor before the blit operation is finished, which can happen on ++ fast CPUs. */ ++ data->serial = state->serial; ++} ++ ++DFBResult ++JPEG_hwRenderTo( IDirectFBImageProvider_hwJPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBRectangle *rect, ++ const DFBRegion *clip ) ++{ ++ DFBResult ret = DFB_OK; ++ unsigned int length; ++ unsigned int ret_read; ++ int type; ++ int size = 0; ++ ++ CoreSurfaceConfig config; ++ ++ IDirectFBDataBuffer *buffer; ++ ++ struct v4l2_requestbuffers reqbufs; ++ ++ struct v4l2_format src_format; ++ struct v4l2_format dst_format; ++ ++ struct v4l2_buffer srcbuf; ++ struct v4l2_buffer dstbuf; ++ ++ CoreSurfaceBufferLock src_lock = { .pitch = 0 }; ++ CoreSurfaceBufferLock dst_lock = { .pitch = 0 }; ++ ++ D_ASSERT( data != NULL ); ++ D_ASSERT( clip != NULL ); ++ ++ D_ASSERT( data->base.core != NULL ); ++ ++ if (!data->base.core) ++ return DFB_FAILURE; ++ ++ if (data->decode_surface) { ++ dfb_gfxcard_wait_serial( &data->serial ); ++ dfb_surface_unref( data->decode_surface ); ++ data->decode_surface = NULL; ++ } ++ ++ D_ASSERT( data->source_surface == NULL ); ++ D_ASSERT( data->decode_surface == NULL ); ++ ++ data->fd = open( "/dev/video0", O_RDWR ); ++ ++ if (data->fd < 0) { ++ D_DEBUG_AT( HWJPEG_V4L2, ++ "%s: couldn't open /dev/video0\n", ++ __FUNCTION__ ); ++ return DFB_FAILURE; ++ } ++ ++ data->source_surface = NULL; ++ ++ data->width = -1; ++ data->height = -1; ++ ++ buffer = data->base.buffer; ++ ++ if (buffer->GetLength( buffer, &length )) { ++ D_ERROR( "%s: failed getting source length\n", ++ __FUNCTION__ ); ++ close( data->fd ); ++ return DFB_UNSUPPORTED; ++ } ++ ++ config.size.w = 4 * sysconf(_SC_PAGESIZE); ++ config.size.h = length / config.size.w + 1; ++ ++ if ((ret = dfb_surface_create_simple( data->base.core, ++ config.size.w, ++ config.size.h, ++ DSPF_BYTE, ++ DSCS_BT601, ++ DSCAPS_VIDEOONLY, ++ CSTF_EXTERNAL, ++ 0, ++ NULL, ++ &data->source_surface ))) { ++ D_ERROR( "%s: failed to create the source surface\n", ++ __FUNCTION__ ); ++ ++ close( data->fd ); ++ return ret; ++ } ++ ++ D_DEBUG_AT( HWJPEG_V4L2, "allocated a %s surface (%dx%d) for JPEG data\n", ++ dfb_pixelformat_name( data->source_surface->config.format ), ++ config.size.w, config.size.h ); ++ ++ if ((ret = dfb_surface_lock_buffer( data->source_surface, ++ CSBR_BACK, CSAID_CPU, ++ CSAF_WRITE, &src_lock ))) { ++ D_ERROR( "%s: couldn't lock source buffer\n", ++ __FUNCTION__ ); ++ ++ dfb_surface_unref( data->source_surface ); ++ data->source_surface = NULL; ++ ++ close( data->fd ); ++ return ret; ++ } ++ ++ buffer->SeekTo( buffer, 0 ); ++ ++ if ((ret = buffer->GetData( buffer, length, src_lock.addr, &ret_read ))) { ++ D_ERROR( "%s: couldn't upload source data to video memory\n", ++ __FUNCTION__ ); ++ goto fini; ++ } ++ ++ ++ memset( &reqbufs, 0, sizeof( reqbufs ) ); ++ ++ reqbufs.count = 1; ++ reqbufs.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ reqbufs.memory = V4L2_MEMORY_USERPTR; ++ ++ if (ioctl( data->fd, VIDIOC_REQBUFS, &reqbufs ) < 0) { ++ D_ERROR( "%s: couldn't request capture buffers\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ reqbufs.count = 1; ++ reqbufs.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ reqbufs.memory = V4L2_MEMORY_USERPTR; ++ ++ if (ioctl( data->fd, VIDIOC_REQBUFS, &reqbufs ) < 0) { ++ D_ERROR( "%s: couldn't request output buffers\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ ++ if (ioctl( data->fd, VIDIOC_STREAMON, &type ) < 0) { ++ D_ERROR( "%s: couldn't toggle streaming on\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ ++ if (ioctl( data->fd, VIDIOC_STREAMON, &type ) < 0) { ++ D_ERROR( "%s: couldn't toggle streaming on\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ memset( &src_format, 0, sizeof( src_format ) ); ++ ++ src_format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ src_format.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG; ++ ++ if (ioctl( data->fd, VIDIOC_S_FMT, &src_format ) < 0) { ++ D_ERROR( "%s: couldn't set output format\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ memset( &srcbuf, 0, sizeof( srcbuf ) ); ++ ++ srcbuf.index = 0; ++ srcbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ srcbuf.memory = V4L2_MEMORY_USERPTR; ++ srcbuf.m.userptr = (unsigned long)src_lock.addr; ++ srcbuf.length = length; ++ ++ if (ioctl( data->fd, VIDIOC_QBUF, &srcbuf ) < 0) { ++ D_ERROR( "%s: couldn't queue source buffer\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ memset( &src_format, 0, sizeof( src_format ) ); ++ ++ src_format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ ++ if (ioctl( data->fd, VIDIOC_G_FMT, &src_format ) < 0) { ++ D_ERROR( "%s: couldn't get source format\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ D_DEBUG_AT( HWJPEG_V4L2, "JPEG picture is a %dx%d w/ fourcc 0x%08x\n", ++ src_format.fmt.pix.width, src_format.fmt.pix.height, ++ src_format.fmt.pix.pixelformat ); ++ ++ src_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ src_format.fmt.pix.width = rect ? rect->w : src_format.fmt.pix.width; ++ src_format.fmt.pix.height = rect ? rect->h : src_format.fmt.pix.height; ++ ++ dst_format = src_format; ++ ++ if (ioctl( data->fd, VIDIOC_TRY_FMT, &dst_format ) < 0) { ++ D_ERROR( "%s: couldn't get suggested capture format\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ if (dst_format.fmt.pix.pixelformat != V4L2_PIX_FMT_NV12 ++ && dst_format.fmt.pix.pixelformat != V4L2_PIX_FMT_NV16 ++ && dst_format.fmt.pix.pixelformat != V4L2_PIX_FMT_NV24) { ++ D_ERROR( "%s: capture format isn't a valid NV fourcc\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ config.flags = CSCONF_SIZE | CSCONF_FORMAT; ++ ++ switch (dst_format.fmt.pix.pixelformat) { ++ case V4L2_PIX_FMT_NV12: ++ config.format = DSPF_NV12; ++ break; ++ case V4L2_PIX_FMT_NV16: ++ config.format = DSPF_NV16; ++ break; ++ case V4L2_PIX_FMT_NV24: ++ config.format = DSPF_NV24; ++ break; ++ default: ++ D_DEBUG_AT( HWJPEG_V4L2, "invalid pixelformat!\n" ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ D_DEBUG_AT( HWJPEG_V4L2, "h/w decoder suggested %dx%d %s buffer " ++ "(%dx%d requested)\n", ++ dst_format.fmt.pix.width, ++ dst_format.fmt.pix.height, ++ dfb_pixelformat_name( config.format ), ++ src_format.fmt.pix.width, ++ src_format.fmt.pix.height ); ++ ++ /* Construct() will provide a dst_surface == NULL so once we're here ++ the JPEG header has been parsed and the recommended width, height and ++ pixel format have been retrieved. */ ++ if (!dst_surface) { ++ data->width = dst_format.fmt.pix.width; ++ data->height = dst_format.fmt.pix.height; ++ data->pixelformat = config.format; ++ ret = DFB_OK; ++ goto fini; ++ } ++ ++ /* specify the pitch returned by VIDIOC_TRY_FMT as a width */ ++ config.size.w = dst_format.fmt.pix.bytesperline; ++ config.size.h = dst_format.fmt.pix.height; ++ ++ if ((ret = dfb_surface_create_simple( data->base.core, ++ config.size.w, ++ config.size.h, ++ config.format, ++ DSCS_BT601, ++ DSCAPS_VIDEOONLY, ++ CSTF_EXTERNAL, ++ 0, ++ NULL, ++ &data->decode_surface ))) { ++ D_ERROR( "%s: failed to create the nv1x decode surface\n", ++ __FUNCTION__ ); ++ goto fini; ++ } ++ ++ D_DEBUG_AT( HWJPEG_V4L2, "allocated a %s surface (%dx%d) for decode\n", ++ dfb_pixelformat_name( data->decode_surface->config.format ), ++ config.size.w, config.size.h ); ++ ++ dfb_surface_calc_buffer_size( data->decode_surface, 1, 1, NULL, &size ); ++ ++ src_format.fmt.pix.sizeimage = size; ++ src_format.fmt.pix.pixelformat = dst_format.fmt.pix.pixelformat; ++ ++ /* VIDIOC_S_FMT takes the original requested dimensions */ ++ if (ioctl( data->fd, VIDIOC_S_FMT, &src_format ) < 0) { ++ D_ERROR( "%s: couldn't set capture format\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ if ((ret = dfb_surface_lock_buffer( data->decode_surface, ++ CSBR_BACK, CSAID_GPU, ++ CSAF_WRITE, &dst_lock ))) { ++ D_ERROR( "%s: couldn't lock source buffer\n", ++ __FUNCTION__ ); ++ goto fini; ++ } ++ ++ D_DEBUG_AT( HWJPEG_V4L2, "locked h/w decode buffer @ 0x%08x, pitch: %d\n", ++ (unsigned int)dst_lock.addr, dst_lock.pitch ); ++ ++ if (dst_lock.pitch != dst_format.fmt.pix.bytesperline) { ++ D_ERROR( "%s: unaligned decode surface pitch!\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ memset( &dstbuf, 0, sizeof( dstbuf ) ); ++ ++ /* planar capture */ ++ dstbuf.index = 0; ++ dstbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ dstbuf.memory = V4L2_MEMORY_USERPTR; ++ dstbuf.m.userptr = (unsigned long)dst_lock.addr; ++ dstbuf.length = dst_format.fmt.pix.sizeimage; ++ ++ if (ioctl( data->fd, VIDIOC_QBUF, &dstbuf ) < 0) { ++ D_ERROR( "%s: couldn't queue capture buffer\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ if (ioctl( data->fd, VIDIOC_DQBUF, &dstbuf ) < 0) { ++ D_ERROR( "%s: couldn't dequeue capture buffer\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ memset( &dst_format, 0, sizeof( dst_format ) ); ++ ++ dst_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ ++ if (ioctl( data->fd, VIDIOC_G_FMT, &dst_format ) < 0) { ++ D_ERROR( "%s: couldn't get capture final format\n", ++ __FUNCTION__ ); ++ ret = DFB_FAILURE; ++ goto fini; ++ } ++ ++ D_DEBUG_AT( HWJPEG_V4L2, "decoded picture is a %dx%d %s buffer " ++ "(pitch: %d)\n", dst_format.fmt.pix.width, ++ dst_format.fmt.pix.height, ++ (dst_format.fmt.pix.pixelformat == V4L2_PIX_FMT_NV12) ? "NV12" ++ : ((dst_format.fmt.pix.pixelformat == V4L2_PIX_FMT_NV16) ++ ? "NV16" : "NV24"), ++ dst_format.fmt.pix.bytesperline ); ++ ++fini: ++ if (data->decode_surface && dst_lock.pitch) ++ dfb_surface_unlock_buffer( data->decode_surface, &dst_lock ); ++ ++ type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ ++ if (ioctl( data->fd, VIDIOC_STREAMOFF, &type ) < 0) ++ D_ERROR( "%s: couldn't turn streaming off\n", ++ __FUNCTION__ ); ++ ++ type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ ++ if (ioctl( data->fd, VIDIOC_STREAMOFF, &type ) < 0) ++ D_ERROR( "%s: couldn't turn streaming off\n", ++ __FUNCTION__ ); ++ ++ if (data->source_surface) { ++ if (src_lock.pitch) ++ dfb_surface_unlock_buffer( data->source_surface, &src_lock ); ++ ++ dfb_surface_unref( data->source_surface ); ++ data->source_surface = NULL; ++ } ++ ++ close( data->fd ); ++ ++ /* don't blit to destination if something went wrong */ ++ if (data->decode_surface && ret == DFB_OK) { ++ CardState state; ++ DFBRectangle src_rect = { ++ .x = 0, ++ .y = 0, ++ .w = dst_format.fmt.pix.width, ++ .h = dst_format.fmt.pix.height ++ }; ++ ++ /* use DFB to convert the intermediary NV format to the ++ final destination format, applying any necessary additional ++ clip/stretch */ ++ dfb_state_init( &state, data->base.core ); ++ dfb_state_set_source( &state, data->decode_surface ); ++ dfb_state_set_destination( &state, dst_surface ); ++ dfb_state_set_clip( &state, clip ); ++ ++ JPEG_stretchblit( data, &state, &src_rect, rect ); ++ ++ /* remove the state */ ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, NULL ); ++ dfb_state_destroy( &state ); ++ ++ if (data->base.render_callback) { ++ DFBRectangle r = { 0, 0, ++ dst_format.fmt.pix.width, ++ dst_format.fmt.pix.height }; ++ data->base.render_callback( &r, ++ data->base.render_callback_context ); ++ } ++ } ++ ++ return ret; ++} ++ ++static DFBResult ++IDirectFBImageProvider_hwJPEG_RenderTo( IDirectFBImageProvider *thiz, ++ IDirectFBSurface *destination, ++ const DFBRectangle *dest_rect ) ++{ ++ IDirectFBSurface_data *dst_data; ++ CoreSurface *dst_surface; ++ ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_hwJPEG) ++ ++ dst_data = (IDirectFBSurface_data*) destination->priv; ++ if (!dst_data) ++ return DFB_DEAD; ++ ++ dst_surface = dst_data->surface; ++ if (!dst_surface) ++ return DFB_DESTROYED; ++ ++ dfb_region_from_rectangle( &data->clip, &dst_data->area.current ); ++ ++ if (dest_rect) { ++ if (dest_rect->w < 1 || dest_rect->h < 1) ++ return DFB_INVARG; ++ ++ data->rect = *dest_rect; ++ data->rect.x += dst_data->area.wanted.x; ++ data->rect.y += dst_data->area.wanted.y; ++ ++ if (!dfb_rectangle_region_intersects( &data->rect, &data->clip )) ++ return DFB_OK; ++ } ++ else { ++ data->rect = dst_data->area.wanted; ++ } ++ ++ return JPEG_hwRenderTo( data, dst_surface, &data->rect, &data->clip ); ++} ++ ++static DFBResult ++IDirectFBImageProvider_hwJPEG_GetSurfaceDescription( IDirectFBImageProvider *thiz, ++ DFBSurfaceDescription *dsc ) ++{ ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_hwJPEG) ++ ++ if (!dsc) ++ return DFB_INVARG; ++ ++ if (data->width < 0 ++ || data->height < 0) ++ return DFB_INVARG; ++ ++ dsc->flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; ++ dsc->width = data->width; ++ dsc->height = data->height; ++ dsc->pixelformat = data->pixelformat; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++IDirectFBImageProvider_hwJPEG_SetRenderFlags( IDirectFBImageProvider *thiz, ++ DIRenderFlags flags ) ++{ ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_hwJPEG) ++ ++ return DFB_UNSUPPORTED; ++} ++ ++static DFBResult ++IDirectFBImageProvider_hwJPEG_GetImageDescription( IDirectFBImageProvider *thiz, ++ DFBImageDescription *dsc ) ++{ ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_hwJPEG) ++ ++ if (!dsc) ++ return DFB_INVARG; ++ ++ dsc->caps = DICAPS_NONE; ++ ++ return DFB_OK; ++} +diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_hwjpeg_v4l2.h b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_hwjpeg_v4l2.h +new file mode 100644 +index 0000000..c997182 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_hwjpeg_v4l2.h +@@ -0,0 +1,59 @@ ++/* ++ (c) Copyright 2012 STMicroelectronics R&D ++ ++based on code: ++ (c) Copyright 2001-2010 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by Ilyes Gouta ++ Based on code by: ++ Andre' Draszik , ++ Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#ifndef __IDIRECTFBIMAGEPROVIDER_HWJPEG_H__ ++#define __IDIRECTFBIMAGEPROVIDER_HWJPEG_H__ ++ ++/* private data struct of IDirectFBImageProvider_hwJPEG */ ++typedef struct ++{ ++ IDirectFBImageProvider_data base; ++ ++ int fd; ++ ++ unsigned int width; ++ unsigned int height; ++ ++ DFBSurfacePixelFormat pixelformat; ++ ++ CoreSurface *source_surface; ++ CoreSurface *decode_surface; ++ ++ CoreGraphicsSerial serial; ++ ++ DFBRectangle rect; ++ DFBRegion clip; ++} IDirectFBImageProvider_hwJPEG_data; ++ ++#endif /* __IDIRECTFBIMAGEPROVIDER_HWJPEG_H__ */ +diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_jpeg.c b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_jpeg.c +index a7430f7..5aa1e30 100644 +--- a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_jpeg.c ++++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_jpeg.c +@@ -1,4 +1,7 @@ + /* ++ (c) Copyright 2006-2010 ST Microelectronics R&D ++ ++based on code: + (c) Copyright 2001-2010 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + +@@ -44,12 +47,14 @@ + #include + + #include ++#include + + #include + #include + #include + #include + #include ++#include + #include + + #include +@@ -58,6 +63,36 @@ + #undef HAVE_STDLIB_H + #include + ++#if !defined(JPEG_PROVIDER_USE_MME) ++#undef USE_MME ++#endif ++ ++ ++#include "debug_helper.h" ++ ++D_DEBUG_DOMAIN (JPEG, "JPEG", "STM JPEG decoder"); ++D_DEBUG_DOMAIN (JPEG_RAW, "JPEG/raw", "STM JPEG decoder (raw decode)"); ++D_DEBUG_DOMAIN (JPEG_MME, "JPEG/MME", "STM JPEG decoder (MME)"); ++D_DEBUG_DOMAIN (JPEG_SEMA, "JPEG/SEMA", "STM JPEG decoder (semaphores"); ++D_DEBUG_DOMAIN (JPEG_TIME, "JPEG/Time", "STM JPEG decoder (timing"); ++#define MME_DEBUG_DOMAIN JPEG_MME ++#define SEMA_DEBUG_DOMAIN JPEG_SEMA ++#define MME_TEXT_DOMAIN "JPEG" ++ ++#include "mme_helper.h" ++#include "idirectfbimageprovider_jpeg.h" ++#if defined(JPEG_PROVIDER_USE_MME) ++#include "sema_helper.h" ++static DFBResult JPEG_HardwareRenderTo( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBSurfacePixelFormat format, ++ DFBRectangle *rect, ++ const DFBRegion *clip ); ++#else /* JPEG_PROVIDER_USE_MME */ ++#define JPEG_HardwareRenderTo(data,dst_surface, \ ++ format,rect,clip) DFB_NOSUCHINSTANCE ++#endif /* JPEG_PROVIDER_USE_MME */ ++ + + static DFBResult + Probe( IDirectFBImageProvider_ProbeContext *ctx ); +@@ -68,23 +103,11 @@ Construct( IDirectFBImageProvider *thiz, + + #include + +-DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, JPEG ) +- +-/* +- * private data struct of IDirectFBImageProvider_JPEG +- */ +-typedef struct { +- IDirectFBImageProvider_data base; +- +- int width; /* width of the JPEG image */ +- int height; /* height of the JPEG image */ +- +- u32 *image; /* decoded image data */ +- int image_width; /* width of image data */ +- int image_height; /* height of image data */ +- +- DIRenderFlags flags; /* selected idct method */ +-} IDirectFBImageProvider_JPEG_data; ++#if defined(JPEG_PROVIDER_USE_MME) ++DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, hwJPEG ) ++#else /* JPEG_PROVIDER_USE_MME */ ++DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, swJPEG ) ++#endif /* JPEG_PROVIDER_USE_MME */ + + + static DFBResult +@@ -93,6 +116,10 @@ IDirectFBImageProvider_JPEG_RenderTo( IDirectFBImageProvider *thiz, + const DFBRectangle *destination_rect ); + + static DFBResult ++IDirectFBImageProvider_JPEG_Sync( IDirectFBImageProvider *thiz, ++ DFBImageProviderSyncFlags flags ); ++ ++static DFBResult + IDirectFBImageProvider_JPEG_GetSurfaceDescription( IDirectFBImageProvider *thiz, + DFBSurfaceDescription *dsc ); + +@@ -104,6 +131,10 @@ static DFBResult + IDirectFBImageProvider_JPEG_SetRenderFlags( IDirectFBImageProvider *thiz, + DIRenderFlags flags ); + ++static void * ++JPEGrenderThread( DirectThread *thread, void *driver_data ); ++ ++ + #define JPEG_PROG_BUF_SIZE 0x10000 + + typedef struct { +@@ -224,74 +255,6 @@ jpeglib_panic(j_common_ptr cinfo) + longjmp(myerr->setjmp_buffer, 1); + } + +-static inline void +-copy_line32( u32 *argb, const u8 *rgb, int width ) +-{ +- while (width--) { +- *argb++ = 0xFF000000 | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; +- +- rgb += 3; +- } +-} +- +-static inline void +-copy_line_nv16( u16 *yy, u16 *cbcr, const u8 *src_ycbcr, int width ) +-{ +- int x; +- +- for (x=0; x> 1); +-#else +- yy[x] = (src_ycbcr[3] << 8) | src_ycbcr[0]; +- +- cbcr[x] = (((src_ycbcr[2] + src_ycbcr[5]) << 7) & 0xff00) | +- ((src_ycbcr[1] + src_ycbcr[4]) >> 1); +-#endif +- +- src_ycbcr += 6; +- } +- +- if (width & 1) { +- u8 *y = (u8*) yy; +- +- y[width-1] = src_ycbcr[0]; +- +-#ifdef WORDS_BIGENDIAN +- cbcr[x] = (src_ycbcr[1] << 8) | src_ycbcr[2]; +-#else +- cbcr[x] = (src_ycbcr[2] << 8) | src_ycbcr[1]; +-#endif +- } +-} +- +-static inline void +-copy_line_uyvy( u32 *uyvy, const u8 *src_ycbcr, int width ) +-{ +- int x; +- +- for (x=0; xpriv; + +- if (data->image) +- D_FREE( data->image ); ++ if (data->thread) { ++ /* terminate the decoding thread, if necessary... */ ++ direct_thread_cancel( data->thread ); ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ ++ pthread_mutex_destroy( &data->lock ); ++ pthread_cond_destroy( &data->cond ); ++ } ++ ++ if (data->common.decode_surface) { ++ dfb_gfxcard_wait_serial( &data->common.serial ); ++ dfb_surface_unref( data->common.decode_surface ); ++ } + } + + static DFBResult +@@ -350,9 +325,9 @@ Construct( IDirectFBImageProvider *thiz, + core = va_arg( tag, CoreDFB * ); + va_end( tag ); + +- data->base.ref = 1; +- data->base.buffer = buffer; +- data->base.core = core; ++ data->common.base.ref = 1; ++ data->common.base.buffer = buffer; ++ data->common.base.core = core; + + buffer->AddRef( buffer ); + +@@ -373,8 +348,13 @@ Construct( IDirectFBImageProvider *thiz, + jpeg_read_header(&cinfo, TRUE); + jpeg_start_decompress(&cinfo); + +- data->width = cinfo.output_width; +- data->height = cinfo.output_height; ++ data->common.width = cinfo.output_width; ++ data->common.height = cinfo.output_height; ++ ++#if defined(JPEG_PROVIDER_USE_MME) ++ data->num_components = cinfo.num_components; ++ data->progressive_mode = cinfo.progressive_mode; ++#endif + + data->flags = DIRENDER_NONE; + +@@ -387,9 +367,10 @@ Construct( IDirectFBImageProvider *thiz, + return DFB_FAILURE; + } + +- data->base.Destruct = IDirectFBImageProvider_JPEG_Destruct; ++ data->common.base.Destruct = IDirectFBImageProvider_JPEG_Destruct; + + thiz->RenderTo = IDirectFBImageProvider_JPEG_RenderTo; ++ thiz->Sync = IDirectFBImageProvider_JPEG_Sync; + thiz->GetImageDescription =IDirectFBImageProvider_JPEG_GetImageDescription; + thiz->SetRenderFlags = IDirectFBImageProvider_JPEG_SetRenderFlags; + thiz->GetSurfaceDescription = +@@ -407,73 +388,597 @@ wrap_setjmp( struct my_error_mgr *jerr ) + return 0; + } + ++static void ++JPEG_stretchblit( IDirectFBImageProvider_JPEG_data *data, ++ CardState *state, ++ DFBRectangle *src_rect, ++ DFBRectangle *dst_rect ) ++{ ++ D_DEBUG_AT( JPEG, "StretchBlit %dx%d -> %dx%d (%s -> %s)\n", ++ src_rect->w, src_rect->h, dst_rect->w, dst_rect->h, ++ dfb_pixelformat_name( state->source->config.format), ++ dfb_pixelformat_name( state->destination->config.format ) ); ++ ++ /* thankfully this is intelligent enough to do a simple blit if ++ possible */ ++ dfb_gfxcard_stretchblit( src_rect, dst_rect, state ); ++ /* we need to remember the serial in case a new surface is created ++ (and written to) at the same address as the decode_surface before the ++ blit operation is finished. This can happen if we get into the ++ destructor before the blit operation is finished, which can happen on ++ fast CPUs. */ ++ data->common.serial = state->serial; ++} ++ ++#define _ROUND_UP_8(x) (((x)+ 7) & ~ 7) ++#define _ROUND_UP_16(x) (((x)+15) & ~15) ++static void ++JPEG_setup_yuv444p( const struct jpeg_decompress_struct *cinfo, ++ CoreSurfaceConfig *config, ++ int *pitch_y, ++ int *pitch_cb, ++ int *pitch_cr, ++ int *offset_cb, ++ int *offset_cr ) ++{ ++ config->format = DSPF_YUV444P; ++ ++ config->size.w = _ROUND_UP_8( cinfo->cur_comp_info[0] ++ ->downsampled_width ); ++ config->size.h = _ROUND_UP_8( cinfo->cur_comp_info[0] ++ ->downsampled_height ); ++ ++ /* pad an extra (decimated) MCU row for the iDCT write-out */ ++#if JPEG_LIB_VERSION >= 70 ++ config->size.h += cinfo->max_v_samp_factor * ++ cinfo->min_DCT_v_scaled_size; ++#else ++ config->size.h += cinfo->max_v_samp_factor * ++ cinfo->min_DCT_scaled_size; ++#endif ++ ++ *pitch_y = config->size.w; ++ if (cinfo->num_components == 3) { ++ *pitch_cb = _ROUND_UP_8( cinfo->cur_comp_info[1]->downsampled_width ); ++ *pitch_cr = _ROUND_UP_8( cinfo->cur_comp_info[2]->downsampled_width ); ++ } ++ ++ *offset_cb ++ = *offset_cr ++ = *pitch_y * config->size.h; ++} ++ + static DFBResult +-IDirectFBImageProvider_JPEG_RenderTo( IDirectFBImageProvider *thiz, +- IDirectFBSurface *destination, +- const DFBRectangle *dest_rect ) ++JPEG_raw_decode_common( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBRectangle *rect, ++ struct jpeg_decompress_struct *cinfo, ++ CardState *state, ++ CoreSurfaceBufferLock *lock, ++ CoreSurfaceConfig *config, ++ CorePalette *palette, ++ int pitch_y, ++ int pitch_cb, ++ int pitch_cr, ++ int offset_cb, ++ int offset_cr, ++ int y_v_sampl, ++ int cb_v_sampl, ++ int cr_v_sampl) + { +- DFBResult ret; +- bool direct = false; +- DFBRegion clip; +- DFBRectangle rect; +- DFBSurfacePixelFormat format; +- IDirectFBSurface_data *dst_data; +- CoreSurface *dst_surface; +- CoreSurfaceBufferLock lock; ++ DFBResult res; + DIRenderCallbackResult cb_result = DIRCR_OK; ++ DFBRectangle src_rect; + +- DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_JPEG) ++ int i; + +- dst_data = (IDirectFBSurface_data*) destination->priv; +- if (!dst_data) +- return DFB_DEAD; ++ /* Worst case, is 4x4 chroma subsampling where an MCU is 32 lines. libjpeg ++ won't decode more than one MCU in any one go. */ ++#if JPEG_LIB_VERSION >= 70 ++ const int idct_window_size = (cinfo->max_v_samp_factor ++ * cinfo->min_DCT_v_scaled_size); ++#else ++ const int idct_window_size = (cinfo->max_v_samp_factor ++ * cinfo->min_DCT_scaled_size); ++#endif + +- dst_surface = dst_data->surface; +- if (!dst_surface) +- return DFB_DESTROYED; ++#undef _NO_STACK ++#ifndef _NO_STACK ++ JSAMPROW Yrows[idct_window_size]; ++ JSAMPROW Cbrows[idct_window_size]; ++ JSAMPROW Crrows[idct_window_size]; ++ JSAMPARRAY jpeg_buffer[3] = { ++ [0] = Yrows ++ }; ++#else ++ /* valgrind can't check stack variables */ ++#warning this is not for production use, as we do not clean up on errors ++ JSAMPROW *Yrows, *Cbrows, *Crrows; ++ JSAMPARRAY *jpeg_buffer; ++ ++ /* over allocate, least trouble */ ++ Yrows = malloc( sizeof(JSAMPROW) * idct_window_size) ; ++ Cbrows = malloc( sizeof(JSAMPROW) * idct_window_size ); ++ Crrows = malloc( sizeof(JSAMPROW) * idct_window_size ); ++ ++ jpeg_buffer = malloc( 3 * sizeof(JSAMPARRAY) ); ++ jpeg_buffer[0] = Yrows; ++#endif + +- ret = destination->GetPixelFormat( destination, &format ); +- if (ret) +- return ret; + +- dfb_region_from_rectangle( &clip, &dst_data->area.current ); ++ if (cb_v_sampl) { ++ jpeg_buffer[1] = Cbrows; ++ jpeg_buffer[2] = Crrows; ++ } + +- if (dest_rect) { +- if (dest_rect->w < 1 || dest_rect->h < 1) +- return DFB_INVARG; ++ config->flags = CSCONF_SIZE | CSCONF_FORMAT | CSCONF_COLORSPACE | CSCONF_CAPS; ++ #ifdef __SH4__ ++ config->caps = DSCAPS_VIDEOONLY; ++ #else ++ config->caps = 0; ++ #endif ++ #ifdef DIRECT_BUILD_DEBUG ++ config->caps |= DSCAPS_SHARED; ++ #endif ++ ++ res = dfb_surface_create( data->common.base.core, config, CSTF_NONE, 0, ++ palette, ++ &data->common.decode_surface ); ++ if (palette) ++ /* decode_surface holds a reference to the palette now */ ++ dfb_palette_unref( palette ); ++ ++ if (res != DFB_OK) { ++ D_ERROR( "failed to create temporary decode surface\n" ); ++ return DFB_UNSUPPORTED; ++ } + +- rect = *dest_rect; +- rect.x += dst_data->area.wanted.x; +- rect.y += dst_data->area.wanted.y; ++ if (dfb_surface_lock_buffer( data->common.decode_surface, ++ CSBR_BACK, CSAID_CPU, CSAF_WRITE, lock )) { ++ dfb_surface_unref( data->common.decode_surface ); ++ data->common.decode_surface = NULL; ++ return DFB_UNSUPPORTED; ++ } + +- if (!dfb_rectangle_region_intersects( &rect, &clip )) +- return DFB_OK; ++ cinfo->raw_data_out = true; ++ jpeg_start_decompress( cinfo ); ++ ++ dfb_state_set_source( state, data->common.decode_surface ); ++ ++ /* Initialize the various pointers to build a planar YUV buffer. */ ++ for (i = 0; i < idct_window_size; ++i) ++ Yrows[i] = lock->addr + i * pitch_y; ++ if (cb_v_sampl) { ++ void *cbaddr = lock->addr + offset_cb; ++ void *craddr = cbaddr + offset_cr; ++ for (i = 0; i < idct_window_size; ++i) { ++ Cbrows[i] = cbaddr + i * pitch_cb; ++ Crrows[i] = craddr + i * pitch_cr; ++ } ++ } ++ ++ while (cinfo->output_scanline < data->common.decoded_height ++ && cb_result == DIRCR_OK) { ++ int x = jpeg_read_raw_data( cinfo, jpeg_buffer, ++ idct_window_size ); ++ if (x <= 0) ++ /* Actually, x == 0 means that we don't have enough data to ++ continue decoding the picture. */ ++ break; ++ ++ D_DEBUG_AT( JPEG_RAW, ++ " -> decoded %d scanlines (out of %d (%d))\n", ++ cinfo->output_scanline, data->common.decoded_height, ++ config->size.h ); ++ ++ /* increment the pointers by the number of decoded (luma) ++ scanlines. */ ++ for (i = 0; i < idct_window_size; ++i) ++ Yrows[i] += (x * pitch_y) / y_v_sampl; ++ if (cb_v_sampl) { ++ for (i = 0; i < idct_window_size; ++i) { ++ Cbrows[i] += (x * pitch_cb) / cb_v_sampl; ++ Crrows[i] += (x * pitch_cr) / cr_v_sampl; ++ } ++ } ++ ++ if (data->common.base.render_callback) { ++ DFBRectangle r; ++ DFBRectangle dst_rect; ++ float factor; ++ ++ src_rect = (DFBRectangle) { ++ .x = 0, ++ .y = cinfo->output_scanline - x, ++ .w = data->common.decoded_width, ++ .h = x, ++ }; ++ r = src_rect; ++ factor = (rect->h / (float) data->common.decoded_height); ++ dst_rect = (DFBRectangle) { ++ .x = rect->x, ++ .y = (int) (src_rect.y * factor), ++ .w = rect->w, ++ .h = (int) (src_rect.h * factor), ++ }; ++ ++ D_DEBUG_AT( JPEG_RAW, ++ " -> render callback %d,%d %dx%d -> %d,%d %dx%d\n", ++ src_rect.x, src_rect.y, src_rect.w, ++ src_rect.h, dst_rect.x, dst_rect.y, ++ dst_rect.w, dst_rect.h ); ++ ++ JPEG_stretchblit( data, state, &src_rect, &dst_rect ); ++ ++ cb_result = data->common.base.render_callback( &r, ++ data->common.base.render_callback_context ); ++ } ++ } ++ ++ D_DEBUG_AT( JPEG_RAW, " -> decoded %d scanlines (out of %d)\n", ++ cinfo->output_scanline, data->common.decoded_height ); ++ ++ if (cinfo->output_scanline < data->common.decoded_height ++ || cb_result != DIRCR_OK) { ++ if (cb_result != DIRCR_OK) ++ D_ERROR( "raw decode failed after %d of %d scanlines, " ++ "trying pure software\n", ++ cinfo->output_scanline, cinfo->output_height ); ++ jpeg_abort_decompress( cinfo ); ++ jpeg_destroy_decompress( cinfo ); ++ dfb_surface_unlock_buffer( data->common.decode_surface, lock ); ++ lock->pitch = 0; ++ dfb_surface_unref( data->common.decode_surface ); ++ data->common.decode_surface = NULL; ++ ++ if (cb_result != DIRCR_OK) ++ return DFB_INTERRUPTED; ++ ++ return DFB_FAILURE; /* restart */ ++ } ++ ++ jpeg_finish_decompress( cinfo ); ++ jpeg_destroy_decompress( cinfo ); ++ ++ dfb_surface_unlock_buffer( data->common.decode_surface, lock ); ++ lock->pitch = 0; ++ ++ /* use DFB to convert raw YCbCr to destination format, and apply any ++ necessary additional clip/stretch */ ++ src_rect = (DFBRectangle) { ++ .x = 0, ++ .y = 0, ++ .w = data->common.decoded_width, ++ .h = data->common.decoded_height ++ }; ++ ++ JPEG_stretchblit( data, state, &src_rect, rect ); ++ ++ if (data->common.base.render_callback) ++ data->common.base.render_callback( &src_rect, ++ data->common.base.render_callback_context ); ++ ++#ifdef _NO_STACK ++ free( Yrows ); ++ if (cb_v_sampl) { ++ free( Cbrows ); ++ free( Crrows ); ++ } ++ free( jpeg_buffer ); ++#endif ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++JPEG_raw_decode_YCbCr( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBRectangle *rect, ++ struct jpeg_decompress_struct *cinfo, ++ CardState *state, ++ CoreSurfaceBufferLock *lock ) ++{ ++ CoreSurfaceConfig config; ++ int pitch_y, pitch_cb, pitch_cr; ++ int offset_cb; /* cb from y */ ++ int offset_cr; /* cr from cb */ ++ int y_v_sampl = 1; ++ int cb_v_sampl = 1; ++ int cr_v_sampl = 1; ++ ++ const int v_samp[3] = { cinfo->cur_comp_info[0]->v_samp_factor, ++ cinfo->cur_comp_info[1]->v_samp_factor, ++ cinfo->cur_comp_info[2]->v_samp_factor }; ++ ++#if JPEG_LIB_VERSION >= 70 ++ const int idct_window_size = (cinfo->max_v_samp_factor ++ * cinfo->min_DCT_v_scaled_size); ++#else ++ const int idct_window_size = (cinfo->max_v_samp_factor ++ * cinfo->min_DCT_scaled_size); ++#endif ++ ++ D_DEBUG_AT( JPEG_RAW, "trying YCbCr raw decode\n" ); ++ ++ if (cinfo->max_h_samp_factor == 1 ++ && cinfo->max_v_samp_factor == 1 ++ && cinfo->cur_comp_info[0]->h_samp_factor == 1 ++ && v_samp[0] == 1 ++ && cinfo->cur_comp_info[1]->h_samp_factor == 1 ++ && v_samp[1] == 1 ++ && cinfo->cur_comp_info[2]->h_samp_factor == 1 ++ && v_samp[2] == 1) { ++ /* The image is YCbCr 4:4:4 */ ++ D_DEBUG_AT( JPEG_RAW, " -> 4:4:4 image\n" ); ++ ++ JPEG_setup_yuv444p( cinfo, &config, ++ &pitch_y, &pitch_cb, &pitch_cr, ++ &offset_cb, &offset_cr ); ++ } ++ else if (cinfo->max_h_samp_factor == 2 ++ && cinfo->max_v_samp_factor == 2 ++ && cinfo->cur_comp_info[0]->h_samp_factor == 2 ++ && v_samp[0] == 2 ++ && cinfo->cur_comp_info[1]->h_samp_factor == 1 ++ && v_samp[1] == 1 ++ && cinfo->cur_comp_info[2]->h_samp_factor == 1 ++ && v_samp[2] == 1) { ++ /* The image is YCbCr 4:2:0 ... */ ++ D_DEBUG_AT( JPEG_RAW, " -> 4:2:0 (I420) image\n" ); ++ ++ if ((cinfo->scale_num != cinfo->scale_denom) ++ && ((((float)cinfo->scale_denom / cinfo->scale_num) ++ == (float)(cinfo->scale_denom / cinfo->scale_num)) ++ || (cinfo->scale_num < 4 && cinfo->scale_num != 1)) /* only when JPEG_LIB_VERSION >= 70 */ ++ && (cinfo->cur_comp_info[1]->downsampled_width ++ == cinfo->cur_comp_info[0]->downsampled_width) ++ && (cinfo->cur_comp_info[2]->downsampled_width ++ == cinfo->cur_comp_info[0]->downsampled_width)) { ++ /* ... but because we are iDCT scaling during decompression it ++ might end up scaled to 4:4:4, as libjpeg can (and will) apply ++ different scaling factors for the three components. */ ++ D_DEBUG_AT( JPEG_RAW, " -> iDCT %u/%u scaled to 4:4:4\n", ++ cinfo->scale_num, cinfo->scale_denom ); ++ ++ JPEG_setup_yuv444p( cinfo, &config, ++ &pitch_y, &pitch_cb, &pitch_cr, ++ &offset_cb, &offset_cr ); ++ } ++ else if ((cinfo->scale_num == cinfo->scale_denom) ++ || (((float)cinfo->scale_denom / cinfo->scale_num) ++ != (float)(cinfo->scale_denom / cinfo->scale_num)) ++ || ((cinfo->cur_comp_info[1]->downsampled_width ++ == ((cinfo->cur_comp_info[0]->downsampled_width + 1) ++ / 2)) ++ && (cinfo->cur_comp_info[2]->downsampled_width ++ == ((cinfo->cur_comp_info[0]->downsampled_width + 1) ++ / 2)))) { ++ /* ... no iDCT scaling, which means it really ends up ++ as 4:2:0. */ ++ config.format = DSPF_I420; ++ ++ config.size.w = _ROUND_UP_16( cinfo->cur_comp_info[0] ++ ->downsampled_width ); ++ config.size.h = _ROUND_UP_16( cinfo->cur_comp_info[0] ++ ->downsampled_height ); ++ ++ /* pad an extra (decimated) MCU row for the iDCT write-out */ ++ config.size.h += idct_window_size; ++ ++ pitch_y = config.size.w; ++ pitch_cb ++ = pitch_cr ++ = pitch_y / 2; ++ ++ offset_cb = pitch_y * config.size.h; ++ offset_cr = pitch_cb * config.size.h / 2; ++ ++ cb_v_sampl ++ = cr_v_sampl ++ = 2; ++ } ++ else { ++ /* shouldn't happen, really */ ++ D_DEBUG_AT( JPEG_RAW, " -> unsupported (unexpected)!\n" ); ++ return DFB_UNSUPPORTED; ++ } ++ } ++ else if (cinfo->max_h_samp_factor == 2 ++ && cinfo->max_v_samp_factor == 1 ++ && cinfo->cur_comp_info[0]->h_samp_factor == 2 ++ && v_samp[0] == 1 ++ && cinfo->cur_comp_info[1]->h_samp_factor == 1 ++ && v_samp[1] == 1 ++ && cinfo->cur_comp_info[2]->h_samp_factor == 1 ++ && v_samp[2] == 1) { ++ /* The image is YCbCr 4:2:2 ... */ ++ D_DEBUG_AT( JPEG_RAW, " -> 4:2:2 (YV16) image\n" ); ++ ++ if ((cinfo->scale_num != cinfo->scale_denom) ++ && ((((float)cinfo->scale_denom / cinfo->scale_num) ++ == (float)(cinfo->scale_denom / cinfo->scale_num)) ++ || (cinfo->scale_num < 4 && cinfo->scale_num != 1)) /* only when JPEG_LIB_VERSION >= 70 */ ++ && (cinfo->cur_comp_info[1]->downsampled_width ++ == cinfo->cur_comp_info[0]->downsampled_width) ++ && (cinfo->cur_comp_info[2]->downsampled_width ++ == cinfo->cur_comp_info[0]->downsampled_width)) { ++ /* ... iDCT scaling again, as above. */ ++ D_DEBUG_AT( JPEG_RAW, " -> iDCT %u/%u scaled to 4:4:4\n", ++ cinfo->scale_num, cinfo->scale_denom ); ++ ++ JPEG_setup_yuv444p( cinfo, &config, ++ &pitch_y, &pitch_cb, &pitch_cr, ++ &offset_cb, &offset_cr ); ++ } ++ else if ((cinfo->scale_num == cinfo->scale_denom) ++ || (((float)cinfo->scale_denom / cinfo->scale_num) ++ != (float)(cinfo->scale_denom / cinfo->scale_num)) ++ || ((cinfo->cur_comp_info[1]->downsampled_width ++ == ((cinfo->cur_comp_info[0]->downsampled_width + 1) ++ / 2)) ++ && (cinfo->cur_comp_info[2]->downsampled_width ++ == ((cinfo->cur_comp_info[0]->downsampled_width + 1) ++ / 2)))) { ++ /* ... no iDCT scaling, as above. */ ++ config.format = DSPF_YV16; ++ ++ config.size.w = _ROUND_UP_16( cinfo->cur_comp_info[0] ++ ->downsampled_width ); ++ config.size.h = _ROUND_UP_16( cinfo->cur_comp_info[0] ++ ->downsampled_height ); ++ ++ /* pad an extra (decimated) MCU row for the iDCT write-out */ ++ config.size.h += idct_window_size; ++ ++ pitch_y = config.size.w; ++ pitch_cb ++ = pitch_cr ++ = pitch_y / 2; ++ ++ /* YV16 has Cr/Cb planes not Cb/Cr */ ++ offset_cb = (pitch_y + pitch_cr) * config.size.h; ++ offset_cr = -pitch_cr * config.size.h; ++ } ++ else { ++ /* shouldn't happen, really */ ++ D_DEBUG_AT( JPEG_RAW, " -> unsupported (unexpected)!\n" ); ++ return DFB_UNSUPPORTED; ++ } + } + else { +- rect = dst_data->area.wanted; ++ D_DEBUG_AT( JPEG_RAW, " -> unsupported!\n" ); ++ return DFB_UNSUPPORTED; + } + +- ret = dfb_surface_lock_buffer( dst_surface, CSBR_BACK, CSAID_CPU, CSAF_WRITE, &lock ); +- if (ret) +- return ret; ++ /* FIXME: is this correct for all JPEG images? */ ++ config.colorspace = DSCS_BT601_FULLRANGE; ++ ++ /* We can handle this raw format! */ ++ return JPEG_raw_decode_common( data, dst_surface, rect, ++ cinfo, state, lock, ++ &config, NULL, ++ pitch_y, pitch_cb, pitch_cr, ++ offset_cb, offset_cr, ++ y_v_sampl, cb_v_sampl, cr_v_sampl ); ++} ++ ++static DFBResult ++JPEG_raw_decode_Grayscale( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBRectangle *rect, ++ struct jpeg_decompress_struct *cinfo, ++ CardState *state, ++ CoreSurfaceBufferLock *lock ) ++{ ++ CoreSurfaceConfig config; ++ CorePalette *lut8_palette; ++ int pitch_y; ++ ++ unsigned int i; ++ ++ D_DEBUG_AT( JPEG_RAW, "trying grayscale raw decode\n" ); + +- if (data->image && +- (rect.x || rect.y || rect.w != data->image_width || rect.h != data->image_height)) { +- D_FREE( data->image ); +- data->image = NULL; +- data->image_width = 0; +- data->image_height = 0; ++ if (cinfo->max_h_samp_factor == 1 ++ && cinfo->max_v_samp_factor == 1 ++ && cinfo->cur_comp_info[0]->h_samp_factor == 1 ++ && cinfo->cur_comp_info[0]->v_samp_factor == 1) { ++ int dummy; ++ ++ /* The image is grayscale 4:4:4 */ ++ D_DEBUG_AT( JPEG_RAW, " -> 4:4:4 grayscale image\n" ); ++ ++ JPEG_setup_yuv444p( cinfo, &config, &pitch_y, &dummy, &dummy, ++ &dummy, &dummy ); ++ ++ /* Override the YUV444P format set by JPEG_setup_yuv444p() */ ++ config.format = DSPF_LUT8; ++ } ++ else { ++ D_DEBUG_AT( JPEG_RAW, " -> unsupported grayscale image!\n" ); ++ return DFB_UNSUPPORTED; ++ } ++ ++ /* We can handle this raw format! */ ++ if (dfb_palette_create( data->common.base.core, 256, &lut8_palette )) { ++ D_ERROR( "failed to create a palette for the decode surface\n" ); ++ return DFB_UNSUPPORTED; ++ } ++ ++ for (i = 0; i < lut8_palette->num_entries; i++) { ++ lut8_palette->entries[i].a = 255; ++ lut8_palette->entries[i].r = i; ++ lut8_palette->entries[i].g = i; ++ lut8_palette->entries[i].b = i; ++ } ++ ++ config.colorspace = DSCS_RGB; ++ ++ return JPEG_raw_decode_common( data, dst_surface, rect, ++ cinfo, state, lock, ++ &config, lut8_palette, ++ pitch_y, 0, 0, ++ 0, 0, ++ 1, 0, 0 ); ++} ++ ++static DFBResult ++JPEG_raw_decode( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBRectangle *rect, ++ struct jpeg_decompress_struct *cinfo, ++ CardState *state, ++ CoreSurfaceBufferLock *lock ) ++{ ++ if (cinfo->data_precision != 8) ++ return DFB_UNSUPPORTED; ++ ++ if (cinfo->num_components == 3 ++ && cinfo->jpeg_color_space == JCS_YCbCr) ++ return JPEG_raw_decode_YCbCr( data, dst_surface, rect, ++ cinfo, state, lock ); ++ ++ if (cinfo->num_components == 1 ++ && cinfo->jpeg_color_space == JCS_GRAYSCALE) ++ return JPEG_raw_decode_Grayscale( data, dst_surface, rect, ++ cinfo, state, lock ); ++ ++ return DFB_UNSUPPORTED; ++} ++ ++static DFBResult ++JPEG_SoftwareRenderTo( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBSurfacePixelFormat format, ++ DFBRectangle *rect, ++ const DFBRegion *clip ) ++{ ++ DFBResult ret; ++ DIRenderCallbackResult cb_result = DIRCR_OK; ++ bool try_raw = true; ++ ++ D_ASSERT( data != NULL ); ++ D_ASSERT( dst_surface != NULL ); ++ D_ASSERT( clip != NULL ); ++ D_ASSERT( rect != NULL ); ++ ++ if (data->common.decode_surface && ++ (rect->x || rect->y || rect->w != data->common.decoded_width || rect->h != data->common.decoded_height)) { ++ dfb_gfxcard_wait_serial( &data->common.serial ); ++ dfb_surface_unref( data->common.decode_surface ); ++ data->common.decode_surface = NULL; ++ data->common.decoded_width = 0; ++ data->common.decoded_height = 0; + } + + /* actual loading and rendering */ +- if (!data->image) { ++ if (!data->common.decode_surface) { + struct jpeg_decompress_struct cinfo; + struct my_error_mgr jerr; + JSAMPARRAY buffer; /* Output row buffer */ +- int row_stride; /* physical row width in output buffer */ +- u32 *row_ptr; ++ JSAMPLE *row_ptr; + int y = 0; +- int uv_offset = 0; ++ CardState state; ++ CoreSurfaceBufferLock lock_raw = { .pitch = 0 }; + + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = jpeglib_panic; +@@ -483,28 +988,59 @@ IDirectFBImageProvider_JPEG_RenderTo( IDirectFBImageProvider *thiz, + + jpeg_destroy_decompress( &cinfo ); + +- if (data->image) { +- dfb_scale_linear_32( data->image, data->image_width, data->image_height, +- lock.addr, lock.pitch, &rect, dst_surface, &clip ); +- dfb_surface_unlock_buffer( dst_surface, &lock ); +- if (data->base.render_callback) { +- DFBRectangle r = { 0, 0, data->image_width, data->image_height }; +- +- if (data->base.render_callback( &r, +- data->base.render_callback_context ) != DIRCR_OK) ++ if (try_raw) { ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, NULL ); ++ dfb_state_destroy( &state); ++ } ++ if (data->common.decode_surface) { ++ CardState state; ++ DFBRectangle src_rect = { ++ .x = 0, ++ .y = 0, ++ .w = data->common.decoded_width, ++ .h = data->common.decoded_height ++ }; ++ ++ if (lock_raw.pitch) ++ dfb_surface_unlock_buffer( data->common.decode_surface, ++ &lock_raw ); ++ ++ /* use DFB to convert the raw or BGR24 to destination ++ format, and apply any necessary additional ++ clip/stretch */ ++ dfb_state_init( &state, data->common.base.core ); ++ dfb_state_set_source( &state, data->common.decode_surface ); ++ dfb_state_set_destination( &state, dst_surface ); ++ dfb_state_set_clip( &state, clip ); ++ ++ JPEG_stretchblit( data, &state, &src_rect, rect ); ++ ++ /* remove the state */ ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, NULL ); ++ dfb_state_destroy( &state ); ++ ++ dfb_gfxcard_wait_serial( &data->common.serial ); ++ dfb_surface_unref( data->common.decode_surface ); ++ data->common.decode_surface = NULL; ++ ++ if (data->common.base.render_callback) { ++ DFBRectangle r = { 0, 0, data->common.decoded_width, data->common.decoded_height }; ++ ++ if (data->common.base.render_callback( &r, data->common.base.render_callback_context ) != DIRCR_OK) + return DFB_INTERRUPTED; + } + + return DFB_INCOMPLETE; + } + else +- dfb_surface_unlock_buffer( dst_surface, &lock ); +- +- return DFB_FAILURE; ++ return DFB_FAILURE; + } + ++restart: + jpeg_create_decompress( &cinfo ); +- jpeg_buffer_src( &cinfo, data->base.buffer, 0 ); ++ jpeg_buffer_src( &cinfo, data->common.base.buffer, 0 ); + jpeg_read_header( &cinfo, TRUE ); + + #if JPEG_LIB_VERSION >= 70 +@@ -516,19 +1052,16 @@ IDirectFBImageProvider_JPEG_RenderTo( IDirectFBImageProvider *thiz, + #endif + jpeg_calc_output_dimensions( &cinfo ); + +- if (cinfo.output_width == (unsigned)rect.w && cinfo.output_height == (unsigned)rect.h) { +- direct = true; +- } +- else if (rect.x == 0 && rect.y == 0) { ++ if (rect->x == 0 && rect->y == 0) { + #if JPEG_LIB_VERSION >= 70 + /* The supported scaling ratios in libjpeg 7 and 8 + * are N/8 with all N from 1 to 16. + */ + cinfo.scale_num = 1; + jpeg_calc_output_dimensions( &cinfo ); +- while (cinfo.scale_num < 16 +- && cinfo.output_width < (unsigned)rect.w +- && cinfo.output_height < (unsigned)rect.h) { ++ while (cinfo.scale_num < 8 ++ && cinfo.output_width < (unsigned)rect->w ++ && cinfo.output_height < (unsigned)rect->h) { + ++cinfo.scale_num; + jpeg_calc_output_dimensions( &cinfo ); + } +@@ -537,8 +1070,8 @@ IDirectFBImageProvider_JPEG_RenderTo( IDirectFBImageProvider *thiz, + * are 1/1, 1/2, 1/4, and 1/8. + */ + while (cinfo.scale_denom < 8 +- && ((cinfo.output_width >> 1) >= (unsigned)rect.w) +- && ((cinfo.output_height >> 1) >= (unsigned)rect.h)) { ++ && ((cinfo.output_width >> 1) >= (unsigned)rect->w) ++ && ((cinfo.output_height >> 1) >= (unsigned)rect->h)) { + cinfo.scale_denom <<= 1; + jpeg_calc_output_dimensions( &cinfo ); + } +@@ -547,138 +1080,147 @@ IDirectFBImageProvider_JPEG_RenderTo( IDirectFBImageProvider *thiz, + + cinfo.output_components = 3; + +- switch (dst_surface->config.format) { +- case DSPF_NV16: +- uv_offset = dst_surface->config.size.h * lock.pitch; +- +- if (direct && !rect.x && !rect.y) { +- D_INFO( "JPEG: Using YCbCr color space directly! (%dx%d)\n", +- cinfo.output_width, cinfo.output_height ); +- cinfo.out_color_space = JCS_YCbCr; +- break; +- } +- D_INFO( "JPEG: Going through RGB color space! (%dx%d -> %dx%d @%d,%d)\n", +- cinfo.output_width, cinfo.output_height, rect.w, rect.h, rect.x, rect.y ); +- cinfo.out_color_space = JCS_RGB; +- break; +- +- case DSPF_UYVY: +- if (direct && !rect.x && !rect.y) { +- cinfo.out_color_space = JCS_YCbCr; ++ data->common.decoded_width = cinfo.output_width; ++ data->common.decoded_height = cinfo.output_height; ++ ++ cinfo.do_fancy_upsampling = FALSE; ++ cinfo.do_block_smoothing = FALSE; ++ ++ if (try_raw) { ++ /* init a state, so that we can use gfxcard/blit to convert ++ YCbCr to requested destination format */ ++ dfb_state_init( &state, data->common.base.core ); ++ dfb_state_set_destination( &state, dst_surface ); ++ dfb_state_set_clip( &state, clip ); ++ ++ ret = JPEG_raw_decode( data, dst_surface, rect, &cinfo, ++ &state, &lock_raw ); ++ ++ /* remove the state */ ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, NULL ); ++ dfb_state_destroy( &state ); ++ ++ switch (ret) { ++ case DFB_OK: ++ case DFB_INTERRUPTED: ++ /* All ok, or callback signalled abort. */ ++ return ret; ++ ++ case DFB_UNSUPPORTED: ++ /* Not enough video memory or source image format not ++ supported. jpeg_start_decompress() was not yet ++ called, so we can just break. ++ We have to reset try_raw, in case the software ++ decode throws an exception, though. */ ++ try_raw = false; + break; +- } +- D_INFO( "JPEG: Going through RGB color space! (%dx%d -> %dx%d @%d,%d)\n", +- cinfo.output_width, cinfo.output_height, rect.w, rect.h, rect.x, rect.y ); +- cinfo.out_color_space = JCS_RGB; +- break; +- +- default: +- cinfo.out_color_space = JCS_RGB; +- break; +- } +- +- if (data->flags & DIRENDER_FAST) +- cinfo.dct_method = JDCT_IFAST; + +- jpeg_start_decompress( &cinfo ); +- +- data->image_width = cinfo.output_width; +- data->image_height = cinfo.output_height; ++ default: ++ D_BUG( "JPEG_raw_decode() returned unknown " ++ "result %d\n", ret ); ++ case DFB_FAILURE: ++ /* General failure during compression, we restart ++ trying a software decoding and in for that have to ++ reinitialise cinfo. */ ++ try_raw = false; ++ goto restart; ++ } ++ } + +- row_stride = cinfo.output_width * 3; + +- buffer = (*cinfo.mem->alloc_sarray)( (j_common_ptr) &cinfo, +- JPOOL_IMAGE, row_stride, 1 ); ++ /* start using the full software decode path */ ++ cinfo.out_color_space = JCS_RGB; + +- data->image = D_CALLOC( data->image_height, data->image_width * 4 ); +- if (!data->image) { +- dfb_surface_unlock_buffer( dst_surface, &lock ); +- return D_OOM(); ++ if (data->flags & DIRENDER_FAST) ++ cinfo.dct_method = JDCT_FASTEST; ++ ++ CoreSurfaceConfig config = { .flags = (CSCONF_SIZE ++ | CSCONF_FORMAT ++ | CSCONF_COLORSPACE), ++ .format = DSPF_BGR24, ++ .colorspace = DSCS_RGB, ++ .size.w = data->common.decoded_width, ++ .size.h = data->common.decoded_height }; ++ if (dfb_surface_create( data->common.base.core, &config, CSTF_NONE, ++ 0, NULL, &data->common.decode_surface )) { ++ D_ERROR( "failed to create temporary decode surface\n" ); ++ return DFB_UNSUPPORTED; + } +- row_ptr = data->image; +- +- while (cinfo.output_scanline < cinfo.output_height && cb_result == DIRCR_OK) { +- jpeg_read_scanlines( &cinfo, buffer, 1 ); + +- switch (dst_surface->config.format) { +- case DSPF_NV16: +- case DSPF_UYVY: +- if (direct) { +- switch (dst_surface->config.format) { +- case DSPF_NV16: +- copy_line_nv16( lock.addr, (u16*)lock.addr + uv_offset, *buffer, rect.w ); +- break; ++ if ((ret = dfb_surface_lock_buffer( data->common.decode_surface, ++ CSBR_BACK, CSAID_CPU, ++ CSAF_WRITE, &lock_raw ))) { ++ dfb_surface_unref( data->common.decode_surface ); ++ data->common.decode_surface = NULL; + +- case DSPF_UYVY: +- copy_line_uyvy( lock.addr, *buffer, rect.w ); +- break; ++ jpeg_abort_decompress( &cinfo ); ++ jpeg_destroy_decompress( &cinfo ); + +- default: +- break; +- } ++ return ret; ++ } + +- lock.addr = (u8*)lock.addr + lock.pitch; ++ jpeg_start_decompress( &cinfo ); + +- if (data->base.render_callback) { +- DFBRectangle r = { 0, y, data->image_width, 1 }; ++ row_ptr = lock_raw.addr; ++ buffer = &row_ptr; + +- cb_result = data->base.render_callback( &r, +- data->base.render_callback_context ); +- } +- break; +- } ++ while (cinfo.output_scanline < cinfo.output_height && cb_result == DIRCR_OK) { ++ jpeg_read_scanlines( &cinfo, buffer, 1 ); + +- default: +- copy_line32( row_ptr, *buffer, data->image_width ); +- +- if (direct) { +- DFBRectangle r = { rect.x, rect.y+y, rect.w, 1 }; +- dfb_copy_buffer_32( row_ptr, lock.addr, lock.pitch, +- &r, dst_surface, &clip ); +- if (data->base.render_callback) { +- r = (DFBRectangle){ 0, y, data->image_width, 1 }; +- cb_result = data->base.render_callback( &r, +- data->base.render_callback_context ); +- } +- } +- break; ++ if (data->common.base.render_callback) { ++ DFBRectangle r = ++ (DFBRectangle){ 0, y, data->common.decoded_width, 1 }; ++ cb_result = data->common.base.render_callback( &r, ++ data->common.base.render_callback_context ); + } + +- row_ptr += data->image_width; ++ row_ptr += lock_raw.pitch; + y++; + } + +- if (!direct) { +- dfb_scale_linear_32( data->image, data->image_width, data->image_height, +- lock.addr, lock.pitch, &rect, dst_surface, &clip ); +- if (data->base.render_callback) { +- DFBRectangle r = { 0, 0, data->image_width, data->image_height }; +- cb_result = data->base.render_callback( &r, +- data->base.render_callback_context ); +- } +- } ++ dfb_surface_unlock_buffer( data->common.decode_surface, &lock_raw ); + + if (cb_result != DIRCR_OK) { + jpeg_abort_decompress( &cinfo ); +- D_FREE( data->image ); +- data->image = NULL; + } + else { + jpeg_finish_decompress( &cinfo ); + } + jpeg_destroy_decompress( &cinfo ); + } +- else { +- dfb_scale_linear_32( data->image, data->image_width, data->image_height, +- lock.addr, lock.pitch, &rect, dst_surface, &clip ); +- if (data->base.render_callback) { +- DFBRectangle r = { 0, 0, data->image_width, data->image_height }; +- data->base.render_callback( &r, +- data->base.render_callback_context ); ++ ++ if (data->common.decode_surface) { ++ CardState state; ++ DFBRectangle src_rect = { ++ .x = 0, ++ .y = 0, ++ .w = data->common.decoded_width, ++ .h = data->common.decoded_height ++ }; ++ ++ /* use DFB to convert the YCbCr or BGR24 to destination format and ++ apply any necessary additional clip/stretch */ ++ dfb_state_init( &state, data->common.base.core ); ++ dfb_state_set_source( &state, data->common.decode_surface ); ++ dfb_state_set_destination( &state, dst_surface ); ++ dfb_state_set_clip( &state, clip ); ++ ++ JPEG_stretchblit( data, &state, &src_rect, rect ); ++ ++ /* remove the state */ ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, NULL ); ++ dfb_state_destroy( &state ); ++ ++ if (data->common.base.render_callback) { ++ DFBRectangle r = { 0, 0, data->common.decoded_width, data->common.decoded_height }; ++ data->common.base.render_callback( &r, ++ data->common.base.render_callback_context ); + } + } + +- dfb_surface_unlock_buffer( dst_surface, &lock ); ++ D_DEBUG_AT( JPEG, "software decoding finished\n" ); + + if (cb_result != DIRCR_OK) + return DFB_INTERRUPTED; +@@ -686,6 +1228,167 @@ IDirectFBImageProvider_JPEG_RenderTo( IDirectFBImageProvider *thiz, + return DFB_OK; + } + ++ ++ ++static DFBResult ++JPEG_RenderTo( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBSurfacePixelFormat format, ++ DFBRectangle *rect, ++ const DFBRegion *clip ) ++{ ++ DFBResult res; ++ ++ D_ASSERT( data != NULL ); ++ D_ASSERT( dst_surface != NULL ); ++ D_ASSERT( clip != NULL ); ++ D_ASSERT( rect != NULL ); ++ ++ res = JPEG_HardwareRenderTo( data, dst_surface, format, rect, clip ); ++ if (res != DFB_OK) { ++ if (res == DFB_IO) { ++ /* IO error - there's no point in retrying */ ++ D_DEBUG_AT( JPEG, "hardware decode failed: %d (%s)\n", ++ res, DirectFBErrorString( res ) ); ++ return res; ++ } ++ ++ D_DEBUG_AT( JPEG, "hardware decode failed: %d (%s) - " ++ "attempting software fallback\n", ++ res, DirectFBErrorString( res ) ); ++ ++ res = JPEG_SoftwareRenderTo( data, dst_surface, format, rect, clip ); ++ if (unlikely (res != DFB_OK)) ++ D_DEBUG_AT( JPEG, "software decode failed: %d (%s)\n", ++ res, DirectFBErrorString( res ) ); ++ } ++ ++ return res; ++} ++ ++static DFBResult ++IDirectFBImageProvider_JPEG_RenderTo( IDirectFBImageProvider *thiz, ++ IDirectFBSurface *destination, ++ const DFBRectangle *dest_rect ) ++{ ++ IDirectFBSurface_data *dst_data; ++ CoreSurface *dst_surface; ++ DFBSurfacePixelFormat format; ++ DFBResult ret; ++ ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_JPEG) ++ ++ dst_data = (IDirectFBSurface_data*) destination->priv; ++ if (!dst_data) ++ return DFB_DEAD; ++ ++ dst_surface = dst_data->surface; ++ if (!dst_surface) ++ return DFB_DESTROYED; ++ ++ ret = destination->GetPixelFormat( destination, &format ); ++ if (ret) ++ return ret; ++ ++ if (data->thread) ++ pthread_mutex_lock( &data->lock ); ++ ++ dfb_region_from_rectangle( &data->clip, &dst_data->area.current ); ++ ++ if (dest_rect) { ++ if (dest_rect->w < 1 || dest_rect->h < 1) { ++ if (data->thread) ++ pthread_mutex_unlock( &data->lock ); ++ return DFB_INVARG; ++ } ++ ++ data->rect = *dest_rect; ++ data->rect.x += dst_data->area.wanted.x; ++ data->rect.y += dst_data->area.wanted.y; ++ ++ if (!dfb_rectangle_region_intersects( &data->rect, &data->clip )) { ++ if (data->thread) ++ pthread_mutex_unlock( &data->lock ); ++ return DFB_OK; ++ } ++ } ++ else { ++ data->rect = dst_data->area.wanted; ++ } ++ ++ if (!D_FLAGS_IS_SET (data->flags, DIRENDER_BACKGROUND)) { ++ /* threaded operation was not requested */ ++ data->thread_res = JPEG_RenderTo( data, dst_surface, format, ++ &data->rect, &data->clip ); ++ if (data->thread) ++ pthread_mutex_unlock( &data->lock ); ++ return data->thread_res; ++ } ++ ++ if (!data->thread) { ++ /* for the case that somebody does a RenderTo() twice on us, we ++ have to create new thread, because the initial thread will have ++ finished already */ ++ ++ D_ASSERT( data->destination == NULL ); ++ ++ /* as long as we haven't even started yet, we are in INIT state */ ++ data->thread_res = DFB_INIT; ++ data->thread = direct_thread_create( DTT_DEFAULT, JPEGrenderThread, ++ thiz, "JPEG" ); ++ } ++ ++ D_ASSERT( data->destination == NULL ); ++ ++ destination->AddRef( destination ); ++ data->destination = destination; ++ ++ pthread_cond_signal( &data->cond ); ++ pthread_mutex_unlock( &data->lock ); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++IDirectFBImageProvider_JPEG_Sync( IDirectFBImageProvider *thiz, ++ DFBImageProviderSyncFlags flags ) ++{ ++ DFBResult res; ++ ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_JPEG) ++ ++ switch (flags) ++ { ++ case DIPSYNCFLAGS_TRYSYNC: ++ if (data->thread) { ++ if (data->thread_res == DFB_INIT ++ || data->thread_res == DFB_BUSY) { ++ /* DFB_INIT (user didn't call RenderTo() yet) ++ DFB_BUSY (still busy decoding) */ ++ return data->thread_res; ++ } ++ /* else we are done, either because of some error or because ++ we have processed all the data already */ ++ } ++ /* fall through */ ++ ++ case DIPSYNCFLAGS_SYNC: ++ if (data->thread) { ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ data->thread = NULL; ++ } ++ break; ++ ++ default: ++ return DFB_OK; ++ } ++ ++ res = data->thread_res; ++ data->thread_res = DFB_OK; ++ return res; ++} ++ + static DFBResult + IDirectFBImageProvider_JPEG_GetSurfaceDescription( IDirectFBImageProvider *thiz, + DFBSurfaceDescription *dsc ) +@@ -696,8 +1399,8 @@ IDirectFBImageProvider_JPEG_GetSurfaceDescription( IDirectFBImageProvider *thiz, + return DFB_INVARG; + + dsc->flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; +- dsc->height = data->height; +- dsc->width = data->width; ++ dsc->width = data->common.width; ++ dsc->height = data->common.height; + dsc->pixelformat = dfb_primary_layer_pixelformat(); + + return DFB_OK; +@@ -708,6 +1411,30 @@ IDirectFBImageProvider_JPEG_SetRenderFlags( IDirectFBImageProvider *thiz, + { + DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_JPEG) + ++ /* if we have decoded the image already, don't do anything... */ ++ if (data->common.decode_surface) ++ return DFB_UNSUPPORTED; ++ ++ if (!(flags & DIRENDER_BACKGROUND) && data->thread) { ++ /* terminate the decoding thread, if necessary... */ ++ direct_thread_cancel( data->thread ); ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ data->thread = NULL; ++ ++ pthread_cond_destroy( &data->cond ); ++ pthread_mutex_destroy( &data->lock ); ++ } ++ else if (flags & DIRENDER_BACKGROUND && !data->thread) { ++ /* or create it */ ++ pthread_cond_init( &data->cond, NULL ); ++ pthread_mutex_init( &data->lock, NULL ); ++ /* as long as we haven't even started yet, we are in INIT state */ ++ data->thread_res = DFB_INIT; ++ data->thread = direct_thread_create( DTT_DEFAULT, JPEGrenderThread, ++ thiz, "JPEG_DECODER?" ); ++ } ++ + data->flags = flags; + + return DFB_OK; +@@ -726,3 +1453,1147 @@ IDirectFBImageProvider_JPEG_GetImageDescription( IDirectFBImageProvider *thiz, + + return DFB_OK; + } ++ ++static void ++render_cleanup( void *cleanup_data ) ++{ ++ IDirectFBImageProvider *thiz = cleanup_data; ++ IDirectFBImageProvider_JPEG_data *data; ++ ++ D_MAGIC_ASSERT( (IAny*)thiz, DirectInterface ); ++ data = (IDirectFBImageProvider_JPEG_data *) thiz->priv; ++ D_ASSERT( data != NULL ); ++ ++ if (data->destination) { ++ data->destination->Release( data->destination ); ++ data->destination = NULL; ++ } ++ ++ /* in case we get terminated from outside, set the state to DFB_DEAD */ ++ data->thread_res = DFB_DEAD; ++ ++ pthread_mutex_unlock( &data->lock ); ++} ++ ++static void * ++JPEGrenderThread( DirectThread *thread, void *driver_data ) ++{ ++ IDirectFBImageProvider *thiz = driver_data; ++ IDirectFBImageProvider_JPEG_data *data; ++ IDirectFBSurface_data *dst_data; ++ CoreSurface *dst_surface; ++ DFBSurfacePixelFormat format; ++ DFBResult res; ++ ++ D_MAGIC_ASSERT( (IAny*)thiz, DirectInterface ); ++ data = (IDirectFBImageProvider_JPEG_data *) thiz->priv; ++ D_ASSERT( data != NULL ); ++ ++ pthread_mutex_lock( &data->lock ); ++ ++ pthread_cleanup_push( render_cleanup, thiz ); ++ ++ while (!data->destination) { ++ pthread_cond_wait( &data->cond, &data->lock ); ++ } ++ ++ dst_data = (IDirectFBSurface_data*) data->destination->priv; ++ D_ASSERT( dst_data != NULL ); ++ ++ dst_surface = dst_data->surface; ++ D_ASSERT( dst_surface != NULL ); ++ ++ res = data->destination->GetPixelFormat( data->destination, &format ); ++ D_ASSERT( res == DFB_OK ); ++ ++ /* as long as we haven't finished decoding we are busy */ ++ data->thread_res = DFB_BUSY; ++ ++ res = JPEG_RenderTo( data, dst_surface, format, &data->rect, &data->clip ); ++ ++ pthread_cleanup_pop( 1 ); ++ ++ /* in case we exit normally, apply the real return value */ ++ data->thread_res = res; ++ ++ return NULL; ++} ++ ++ ++#if defined(JPEG_PROVIDER_USE_MME) ++static DFBResult ++fetch_data( IDirectFBDataBuffer *buffer, ++ MME_DataBuffer_t *dbuf, ++ int len ) ++{ ++ dbuf->ScatterPages_p[0].BytesUsed = 0; ++ dbuf->ScatterPages_p[0].FlagsIn = 0; ++ dbuf->ScatterPages_p[0].FlagsOut = 0; ++ ++ return buffer_to_ptr_copy( buffer, dbuf->ScatterPages_p[0].Page_p, len ); ++} ++ ++ ++static void ++TransformerCallback( MME_Event_t Event, ++ MME_Command_t *CallbackData, ++ void *UserData ) ++{ ++ const JPEGDEC_TransformReturnParams_t *transform_result = ++ CallbackData->CmdStatus.AdditionalInfo_p; ++// const JPEGDECHW_VideoDecodeReturnParams_t *transform_result_hw = ++// CallbackData->CmdStatus.AdditionalInfo_p; ++ struct _MMECommon * const mme = (struct _MMECommon *) UserData; ++ IDirectFBImageProvider_JPEG_data * const jpeg = ++ container_of( mme, IDirectFBImageProvider_JPEG_data, common ); ++ ++/* if (CallbackData->CmdStatus.AdditionalInfo_p == &jpeg->hw_return_params) { ++ transform_result_hw = CallbackData->CmdStatus.AdditionalInfo_p; ++ transform_result = NULL; ++ } else */ { ++ transform_result = CallbackData->CmdStatus.AdditionalInfo_p; ++// transform_result_hw = NULL; ++ } ++ ++ if (!mme->name_set) { ++ char name[25]; ++ snprintf( name, sizeof(name), ++ "MME (%s)", mme->transformer_name ); ++ direct_thread_set_name( name ); ++ mme->name_set = true; ++ } ++ ++ D_DEBUG_AT( JPEG_MME, ++ "%sTransformerCallback: Event: %d: (%s)%s\n", ++ RED, Event, get_mme_event_string( Event ), BLACK ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> CallbackData->CmdStatus.State: %d (%s)\n", ++ CallbackData->CmdStatus.State, ++ get_mme_state_string( CallbackData->CmdStatus.State ) ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> CallbackData->CmdStatus.CmdId: %u (%.8x)\n", ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> CallbackData->CmdStatus.AdditionalInfoSize: %u\n", ++ CallbackData->CmdStatus.AdditionalInfoSize ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> mme->decode_success: %d\n", ++ mme->decode_success ); ++ ++ switch (Event) { ++ case MME_COMMAND_COMPLETED_EVT: ++ pthread_mutex_lock( &mme->pending_commands_lock ); ++ direct_hash_remove( mme->pending_commands, ++ CallbackData->CmdStatus.CmdId ); ++ if (likely (CallbackData->CmdStatus.CmdId != mme->TransformCommand.CmdStatus.CmdId)) ++ --mme->n_pending_buffers; ++ pthread_mutex_unlock( &mme->pending_commands_lock ); ++ ++ switch (CallbackData->CmdStatus.State) { ++ case MME_COMMAND_COMPLETED: ++ if (unlikely (CallbackData->CmdStatus.CmdId ++ == mme->TransformCommand.CmdStatus.CmdId)) { ++ deb_gettimeofday( &mme->endtime, NULL ); ++ deb_timersub( &mme->endtime, &mme->starttime, ++ &mme->endtime ); ++ D_DEBUG_AT( JPEG_TIME, " -> total time %lu.%06lu\n", ++ mme->endtime.tv_sec, mme->endtime.tv_usec ); ++ ++ /* This info is available as data->ReturnParams. too! ++ mme->decoded_bytes = (unsigned int) transform_result->bytes_written; ++ mme->decoded_height = (int) transform_result->decodedImageHeight; ++ mme->decoded_width = (int) transform_result->decodedImageWidth; ++ */ ++ ++ if (transform_result) { ++ D_DEBUG_AT( JPEG_MME, " -> expanded bytes: %u\n", ++ transform_result->bytes_written ); ++ D_DEBUG_AT( JPEG_MME, " -> decoded w/h: %dx%d\n", ++ transform_result->decodedImageWidth, ++ transform_result->decodedImageHeight ); ++ ++ if (jpeg->progressive_mode) { ++ mme->width = transform_result->decodedImageWidth; ++ mme->height = transform_result->decodedImageHeight; ++ } ++ ++ if (transform_result->Total_cycle) ++ D_DEBUG_AT( JPEG_MME, ++ " -> cycles: total/dmiss/imiss: %u/%u/%u\n", ++ transform_result->Total_cycle, ++ transform_result->DMiss_Cycle, ++ transform_result->IMiss_Cycle ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> JPEG result code: %d (%s)\n", ++ transform_result->ErrorType, ++ get_jpeg_error_string( transform_result->ErrorType ) ); ++ } /* else { ++ D_DEBUG_AT( JPEG_MME, ++ " -> cycles/dmiss/imiss: %u/%u/%u\n", ++ transform_result_hw->pm_cycles, ++ transform_result_hw->pm_dmiss, ++ transform_result_hw->pm_imiss ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> bundles/prefetches: %u/%u\n", ++ transform_result_hw->pm_bundles, ++ transform_result_hw->pm_pft ); ++ ++ D_DEBUG_AT( JPEG_MME, ++ " -> JPEGHW result code: %d (%s)\n", ++ transform_result_hw->ErrorCode, ++ get_jpeghw_error_string( transform_result_hw->ErrorCode ) ); ++ } ++*/ ++ mme->decode_success = 1; ++ sema_signal_event( &mme->decode_event ); ++ ++ /* in case of bogus data (too much), abort pending data ++ buffers */ ++ abort_transformer( mme ); ++ } else { ++ /* buffer completed */ ++ struct _MMEHelper_buffer *buf = ++ container_of( CallbackData->DataBuffers_p, ++ struct _MMEHelper_buffer, buffer ); ++ ++ D_DEBUG_AT( JPEG_MME, ++ " -> buffer %p completed (container @ %p)\n", ++ CallbackData->DataBuffers_p[0], buf ); ++ ++ sema_signal_event( &buf->sema ); ++ } ++ break; /* MME_COMMAND_COMPLETED */ ++ ++ case MME_COMMAND_FAILED: ++ D_WARN( "(%5d) %s: command %u (%.8x) failed: error %d (%s)", ++ direct_gettid(), mme->name, ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.Error, ++ get_mme_error_string( CallbackData->CmdStatus.Error ) ); ++ ++ if (likely (CallbackData->CmdStatus.CmdId ++ == mme->TransformCommand.CmdStatus.CmdId)) { ++ /* transform command failed */ ++ D_WARN( "(%5d) %s: jpeg failure code: %d (%s)", ++ direct_gettid(), mme->name, ++ transform_result->ErrorType, ++ get_jpeg_error_string( transform_result->ErrorType ) ); ++ switch (transform_result->ErrorType) { ++ case UNSUPPORTED_COLORSPACE: ++ case UNABLE_ALLOCATE_MEMORY: ++ case UNSUPPORTED_SCALING: ++ case INSUFFICIENT_OUTPUTBUFFER_SIZE: ++ /* the transformer doesn't support this, but pure ++ libjpeg should. */ ++ mme->decode_success = -1; ++ break; ++ ++ case UNSUPPORTED_ROTATION_ANGLE: ++ default: ++ /* fake a success, there's no point in retrying ++ libjpeg, as it already failed via MME. */ ++ mme->decode_success = 1; ++ D_DEBUG_AT( JPEG_MME, " -> faking success\n" ); ++ break; ++ } ++ ++ sema_signal_event( &mme->decode_event ); ++ } else { ++ /* buffer failed */ ++ struct _MMEHelper_buffer *buf = ++ container_of( CallbackData->DataBuffers_p, ++ struct _MMEHelper_buffer, buffer ); ++ if (mme->decode_success == 0) ++ /* only if we didn't succeed yet */ ++ mme->decode_success = -1; ++ sema_signal_event( &buf->sema ); ++ } ++ break; /* MME_COMMAND_FAILED */ ++ ++ case MME_COMMAND_IDLE: ++ case MME_COMMAND_PENDING: ++ case MME_COMMAND_EXECUTING: ++ default: ++ D_WARN( "(%5d) %s: command %u (%.8x) completed in unknown state: %d (%s)", ++ direct_gettid(), mme->name, ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.State, ++ get_mme_state_string( CallbackData->CmdStatus.State ) ); ++ break; ++ } ++ break; /* MME_COMMAND_COMPLETED_EVT */ ++ ++ case MME_DATA_UNDERFLOW_EVT: ++ /* because of the way the transformer works (and how we communicate ++ with it), we get exactly one underflow event on startup */ ++ D_DEBUG_AT( JPEG_MME, ++ " -> %sdata underflow on command %u (%.8x)\n", ++ (mme->n_underflows == 0) ? "(anticipated) " : "", ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId); ++ if (++mme->n_underflows > 1) { ++ /* check if the IDirectFBDataBuffer definitely(!) hit an EOF ++ and we have no buffers queued */ ++ bool end_of_data; ++ char tmp; ++ pthread_mutex_lock( &mme->pending_commands_lock ); ++ DFBResult has_data = mme->base.buffer->PeekData( mme->base.buffer, ++ 1, 0, ++ &tmp, NULL ); ++ /* n_pending_buffers is checked to be == 0 because the ++ TransformCommand itself is not stored in there. */ ++ end_of_data = (has_data == DFB_EOF ++ && mme->n_pending_buffers == 0); ++ pthread_mutex_unlock( &mme->pending_commands_lock ); ++ ++ /* if so, signal completion */ ++ if (end_of_data) { ++ D_DEBUG_AT( JPEG_MME, ++ " -> no more data available, signalling fail\n" ); ++ mme->decode_success = -2; ++ sema_signal_event( &mme->decode_event ); ++ } ++ } ++ break; /* MME_DATA_UNDERFLOW_EVT */ ++ ++ case MME_NOT_ENOUGH_MEMORY_EVT: ++ case MME_NEW_COMMAND_EVT: ++ default: ++ D_WARN( "(%5d) %s: unhandled event %d (%s) occured on command %u (%.8x)", ++ direct_gettid(), mme->name, Event, ++ get_mme_event_string( Event ), ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId ); ++ ++ D_WARN( "(%5d) %s: CallbackData->CmdStatus.AdditionalInfoSize: %u", ++ direct_gettid(), mme->name, ++ CallbackData->CmdStatus.AdditionalInfoSize ); ++ ++ if (CallbackData->CmdStatus.CmdId == mme->TransformCommand.CmdStatus.CmdId) { ++ if (transform_result) { ++ D_WARN( "(%5d) %s: transform_result->bytes_written: %u", ++ direct_gettid(), mme->name, ++ transform_result->bytes_written ); ++ D_WARN( "(%5d) %s: transform_result->decodedImageHeight: %d", ++ direct_gettid(), mme->name, ++ transform_result->decodedImageHeight ); ++ D_WARN( "(%5d) %s: transform_result->decodedImageWidth: %d", ++ direct_gettid(), mme->name, ++ transform_result->decodedImageWidth ); ++ if (transform_result->Total_cycle) ++ D_WARN( "(%5d) %s: transform_result->cycles: total/dmiss/imiss: %u/%u/%u\n", ++ direct_gettid(), mme->name, ++ transform_result->Total_cycle, ++ transform_result->DMiss_Cycle, ++ transform_result->IMiss_Cycle ); ++ D_WARN( "(%5d) %s: result code: %d (%s)\n", ++ direct_gettid(), mme->name, ++ transform_result->ErrorType, ++ get_jpeg_error_string( transform_result->ErrorType ) ); ++ } /* else if (transform_result_hw) { ++ D_WARN( "(%5d) %s: transform_result->cycles/dmiss/imiss: %u/%u/%u\n", ++ direct_gettid(), mme->name, ++ transform_result_hw->pm_cycles, ++ transform_result_hw->pm_dmiss, ++ transform_result_hw->pm_imiss ); ++ D_WARN( "(%5d) %s: transform_result->bundles/prefetches: %u/%u\n", ++ direct_gettid(), mme->name, ++ transform_result_hw->pm_bundles, ++ transform_result_hw->pm_pft ); ++ ++ D_WARN( "(%5d) %s: transform_result->JPEGHW result code: %d (%s)\n", ++ direct_gettid(), mme->name, ++ transform_result_hw->ErrorCode, ++ get_jpeghw_error_string( transform_result_hw->ErrorCode ) ); ++ } ++*/ ++ } ++ break; ++ } ++} ++ ++#if 0 ++static void ++TransformerCallback2( MME_Event_t Event, ++ MME_Command_t *CallbackData, ++ void *UserData ) ++{ ++ const JPEGDECHW_VideoDecodeReturnParams_t * const transform_result_hw = ++ CallbackData->CmdStatus.AdditionalInfo_p; ++ struct _MMECommon * const mme = (struct _MMECommon *) UserData; ++ ++ if (!mme->name_set) { ++ direct_thread_set_name( "MME (hwjpeg)" ); ++ mme->name_set = true; ++ } ++ ++ D_DEBUG_AT( JPEG_MME, ++ "%sTransformerCallback2: Event: %d: (%s)%s\n", ++ RED, Event, get_mme_event_string( Event ), BLACK ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> CallbackData->CmdStatus.State: %d (%s)\n", ++ CallbackData->CmdStatus.State, ++ get_mme_state_string( CallbackData->CmdStatus.State ) ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> CallbackData->CmdStatus.CmdId: %u (%.8x)\n", ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> CallbackData->CmdStatus.AdditionalInfoSize: %u\n", ++ CallbackData->CmdStatus.AdditionalInfoSize ); ++ D_DEBUG_AT( JPEG_MME, ++ " -> mme->decode_success: %d\n", mme->decode_success ); ++} ++#endif ++ ++ ++/* Pre-Scaling Calculations for JPEG Hardware Scaling ++ * These functions should be used anywhere where SOURCE width and height are ++ referenced */ ++static unsigned int ++pre_scale_value( const IDirectFBImageProvider_JPEG_data *data, ++ const DFBRectangle *dest_rect ) ++{ ++ unsigned int scale; ++ ++ D_ASSERT( data != NULL ); ++ ++#ifdef PRE_SCALE_SPEED_SPACE_OPTIMISED ++ /* Speed and Space */ ++ if (data->common.width <= dest_rect->w || data->common.height <= dest_rect->h) ++ scale = 1; ++ else if ((data->common.width / 2 <= dest_rect->w) && (data->common.height / 2 <= dest_rect->h)) ++ scale = 2; ++ else if ((data->common.width / 4 <= dest_rect->w) && (data->common.height / 4 <= dest_rect->h)) ++ scale = 4; ++ else if ((data->common.width / 8 <= dest_rect->w) && (data->common.height / 8 <= dest_rect->h)) ++ scale = 8; ++ else ++ scale = 1; ++#endif ++ ++#ifdef PRE_SCALE_QUALITY_OPTIMISED ++ /* Quality */ ++ if ((data->common.width / 8 >= dest_rect->w) && (data->common.height / 8 >= dest_rect->h)) ++ scale = 8; ++ else if ((data->common.width / 4 >= dest_rect->w) && (data->common.height / 4 >= dest_rect->h)) ++ scale = 4; ++ else if ((data->common.width / 2 >= dest_rect->w) && (data->common.height / 2 >= dest_rect->h)) ++ scale = 2; ++ else ++ scale = 1; ++#endif ++ ++#if !defined(PRE_SCALE_SPEED_SPACE_OPTIMISED) && !defined(PRE_SCALE_QUALITY_OPTIMISED) ++ scale = 1; ++#endif ++ ++ return scale; ++} ++ ++static inline unsigned int ++pre_scaled_width( const IDirectFBImageProvider_JPEG_data *data, ++ const DFBRectangle *dest_rect ) ++{ ++ D_ASSERT( data != NULL ); ++ ++ unsigned int w = (data->common.width + 15) & ~15; /* Macro Block Rounding */ ++ return w / pre_scale_value( data, dest_rect ); ++} ++ ++static inline unsigned int ++pre_scaled_height( const IDirectFBImageProvider_JPEG_data *data, ++ const DFBRectangle *dest_rect ) ++{ ++ D_ASSERT( data != NULL ); ++ ++ unsigned int h = (data->common.height + 15) & ~15; /* Macro Block Rounding */ ++ return h / pre_scale_value( data, dest_rect ); ++} ++ ++/* warning: MME_AbortCommand() works only for the MME_TRANSFORM command; ++ individual buffers can be aborted, too, but MME_TermTransformer() will ++ not work afterwards anymore! */ ++static bool ++pending_fe_func( DirectHash *hash, ++ unsigned long key, ++ void *value, ++ void *ctx ) ++{ ++ struct _MMECommon * const mme = ctx; ++ MME_CommandId_t CmdId = key; ++ ++ if (key != mme->TransformCommand.CmdStatus.CmdId) { ++ if (direct_hash_lookup( hash, ++ mme->TransformCommand.CmdStatus.CmdId )) ++ D_WARN( "(%5d) aborting MME command %u (%.8x) can lead to a " ++ "crash somewhere in the JPEG transformer!", ++ direct_gettid(), CmdId, CmdId ); ++ } else ++ D_DEBUG_AT( JPEG_MME, ++ "aborting (main transform) command %u (%.8x)\n", ++ CmdId, CmdId ); ++ ++ MME_ERROR res = MME_AbortCommand( mme->Handle, CmdId ); ++ if (res != MME_SUCCESS) ++ D_WARN( "(%5d) MME_AbortCommand(%x, %.8x) for %s failed: %d (%s)\n", ++ direct_gettid(), mme->Handle, CmdId, ++ mme->name, res, get_mme_error_string( res ) ); ++ ++ /* continue iterating */ ++ return true; ++} ++ ++static DFBResult ++abort_transformer( struct _MMECommon * const mme ) ++{ ++ if (!mme) ++ return DFB_THIZNULL; ++ ++ /* FIXME: what about locking? */ ++ direct_hash_iterate( mme->pending_commands, ++ pending_fe_func, ++ mme ); ++ ++ return DFB_OK; ++} ++ ++ ++static void ++_imageprovider_update_transform_params( struct _MMECommon * const mme, ++ void * const params, ++ const CoreSurfaceBufferLock * const lock ) ++{ ++ IDirectFBImageProvider_JPEG_data * const data = ++ container_of( mme, IDirectFBImageProvider_JPEG_data, common ); ++ ++ data->OutputParams.outputSettings.Pitch = lock->pitch; ++ data->OutputParams.outputSettings.ROTATEFLAG |= 0x80000000; ++} ++ ++/* ++ * Set up JPEG transform command ++ * Establish Decode Parameters, ++ * and prepare destination surface ++ * ++ */ ++static DFBResult ++jpeg_start_transformer( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ CoreSurfaceBufferLock *lock ) ++{ ++ DFBResult res; ++ MME_ERROR mme_res; ++ ++ /* If height and width are NOT values divisible by 16 - then decode will ++ not work as expected. */ ++ data->OutputParams.outputSettings.xvalue0 = 0; ++ data->OutputParams.outputSettings.xvalue1 = 0; ++ data->OutputParams.outputSettings.yvalue0 = 0; ++ data->OutputParams.outputSettings.yvalue1 = 0; ++ ++ data->OutputParams.outputSettings.outputWidth = 0; //Buffersize used to prevent bufferoverflows; ++ data->OutputParams.outputSettings.outputHeight = 0; //Buffersize used to prevent bufferoverflows; ++ data->OutputParams.outputSettings.ROTATEFLAG = 0; ++ data->OutputParams.outputSettings.Rotatedegree = 0; ++ data->OutputParams.outputSettings.HorizantalFlip = 0; ++ data->OutputParams.outputSettings.VerticalFlip = 0; ++ ++ res = _mme_helper_start_transformer_core( &data->common, ++ sizeof(data->ReturnParams), ++ &data->ReturnParams, ++ sizeof(data->OutputParams), ++ &data->OutputParams, ++ dst_surface, lock ); ++ if (res != DFB_OK) ++ return res; ++ ++ _imageprovider_update_transform_params( &data->common, ++ &data->OutputParams, lock ); ++ ++ /* if pitch != width - we'll have issues with the hardware decode */ ++ /* FIXME: the comment makes no sense. And the D_ASSUME() does sth ++ different... */ ++ D_ASSUME( lock->pitch != dst_surface->config.size.w ); ++ ++ D_DEBUG_AT( MME_DEBUG_DOMAIN, "issuing MME_TRANSFORM\n" ); ++ ++ /* lock access to hash, because otherwise the callback could be called ++ before we've had a chance to put the command id into the hash */ ++ D_ASSERT( &data->common.pending_commands != NULL ); ++ pthread_mutex_lock( &data->common.pending_commands_lock ); ++ ++ mme_res = MME_SendCommand( data->common.Handle, ++ &data->common.TransformCommand ); ++ if (mme_res != MME_SUCCESS) { ++ pthread_mutex_unlock( &data->common.pending_commands_lock ); ++ ++ D_WARN( "(%5d) %s: starting transformer failed: %d (%s)", ++ direct_gettid(), data->common.name, ++ mme_res, get_mme_error_string( mme_res ) ); ++ ++ dfb_surface_unlock_buffer( dst_surface, lock ); ++ ++ D_FREE( data->common.OutDataBuffers ); ++ data->common.OutDataBuffers = NULL; ++ ++ return DFB_FAILURE; ++ } ++ ++ direct_hash_insert( data->common.pending_commands, ++ data->common.TransformCommand.CmdStatus.CmdId, ++ (void *) 1 ); ++ D_DEBUG_AT( JPEG_MME, "sent packet's CmdId is %u (%.8x)\n", ++ data->common.TransformCommand.CmdStatus.CmdId, ++ data->common.TransformCommand.CmdStatus.CmdId ); ++ ++ deb_gettimeofday( &data->common.starttime, NULL ); ++ ++ pthread_mutex_unlock( &data->common.pending_commands_lock ); ++ ++ return DFB_OK; ++} ++ ++#if 0 ++#include <../gfxdrivers/stgfx/stgfx.h> ++#include <../gfxdrivers/stgfx2/stm_gfxdriver.h> ++static STMFB_GFXMEMORY_PARTITION ++bdisp_surface_pool_get_partition( const CoreSurfacePool * const pool ) ++{ ++ unsigned i; ++ ++ switch (dfb_system_get_accelerator()) { ++ case FB_ACCEL_ST_GAMMA: ++ case FB_ACCEL_ST_BDISP: ++ { ++ const STGFXDeviceData * const stdev = dfb_gfxcard_get_device_data(); ++ for (i = 0; i < D_ARRAY_SIZE(stdev->aux_pools); ++i) ++ if (stdev->aux_pools[i] == pool) ++ return STMFBGP_GFX0 + i; ++ } ++ break; ++ ++ case FB_ACCEL_ST_BDISP_USER: ++ { ++ const STGFX2DeviceData * const stdev = dfb_gfxcard_get_device_data(); ++ for (i = 0; i < D_ARRAY_SIZE(stdev->aux_pools); ++i) ++ if (stdev->aux_pools[i] == pool) ++ return STMFBGP_GFX0 + i; ++ } ++ break; ++ ++ default: ++ return STMFBGP_FRAMEBUFFER; ++ } ++ ++ return STMFBGP_FRAMEBUFFER; ++} ++#endif ++ ++#if 0 ++static DFBResult ++jpeg_start_transformer2( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ CoreSurfaceBufferLock *lock ) ++{ ++ DFBResult res; ++ CoreSurfaceBufferLock raw_lock; ++ CoreSurfaceBufferLock chr_lock; ++ ++ ++ /* src surface */ ++ CoreSurface *raw_surface; ++ ++ /* FIXME: this is BAD (tm) -> think streaming media! */ ++ data->common.buffer->SeekTo( data->common.buffer, 0 ); ++ /* find out the length of the buffer */ ++ unsigned int src_bytes; ++ data->common.buffer->GetLength( data->common.buffer, &src_bytes ); ++ ++ { ++ CoreSurfaceConfig config = { .size.w = src_bytes, ++ .size.h = 1 }; ++ /* create temporary surface to store the compressed data in. */ ++ config.flags = CSCONF_SIZE | CSCONF_FORMAT | CSCONF_CAPS; ++ config.format = DSPF_LUT8; ++ config.caps = DSCAPS_VIDEOONLY; ++ #ifdef DIRECT_BUILD_DEBUG ++ config.caps |= DSCAPS_SHARED; ++ #endif ++ if ((res = dfb_surface_create( data->common.core, ++ &config, ++ CSTF_NONE, ++ 0, ++ NULL, ++ &raw_surface )) != DFB_OK) ++ goto out1; ++ if ((res = dfb_surface_lock_buffer( raw_surface, CSBR_BACK, CSAID_CPU, ++ CSAF_WRITE, &raw_lock )) != DFB_OK) ++ goto out2; ++ } ++ ++ { ++ unsigned int sz; ++ u8 *addr = raw_lock.addr; ++ res = data->common.buffer->GetData( data->common.buffer, ++ src_bytes, addr, &sz ); ++ if (sz != src_bytes) ++ goto out3; ++ printf( "src data @ %.8lx\n", lock->phys ); ++ } ++ /* FIXME: this is BAD (tm) -> think streaming media! */ ++ data->common.buffer->SeekTo( data->common.buffer, 0 ); ++ res = dfb_surface_unlock_buffer( raw_surface, &raw_lock ); ++ ++ ++ CoreSurface *chr_surface; ++ { ++ CoreSurfaceConfig config = { .size.w = data->common.width, ++ .size.h = data->common.height }; ++ config.size.h += 2; ++ /* create temporary surface to store the compressed data in. */ ++ config.flags = CSCONF_SIZE | CSCONF_FORMAT | CSCONF_COLORSPACE | CSCONF_CAPS; ++ config.format = DSPF_ARGB; ++ config.caps = DSCAPS_VIDEOONLY; ++ #ifdef DIRECT_BUILD_DEBUG ++ config.caps |= DSCAPS_SHARED; ++ #endif ++ config.colorspace = DSCS_RGB; ++ if ((res = dfb_surface_create( data->common.core, ++ &config, ++ CSTF_NONE, ++ 0, ++ NULL, ++ &chr_surface )) != DFB_OK) ++ goto out4; ++ } ++ ++ ++ res = dfb_surface_lock_buffer( raw_surface, ++ CSBR_FRONT, CSAID_ACCEL0, CSAF_READ, ++ &raw_lock ); ++ res = dfb_surface_lock_buffer( data->common.decode_surface, ++ CSBR_BACK, CSAID_ACCEL0, CSAF_WRITE, ++ lock ); ++ res = dfb_surface_lock_buffer( chr_surface, ++ CSBR_BACK, CSAID_ACCEL0, CSAF_WRITE, ++ &chr_lock ); ++ ++ /* should be aligned on 256byte boundary */ ++ D_ASSUME( (chr_lock.phys & 0xff) == 0 ); ++ D_ASSUME( (lock->phys & 0xff) == 0 ); ++ printf( "raw/dst/chr phys: 0x%.8lx 0x%.8lx 0x%.8lx\n", ++ raw_lock.phys, lock->phys, chr_lock.phys ); ++ ++ u32 raw_phys = raw_lock.phys; ++ u32 dst_phys = (lock->phys + 255) & 0xffffff00; ++ printf( "dst_phys %.8x\n", dst_phys ); ++ u32 chr_phys = (chr_lock.phys + 255) & 0xffffff00; ++ printf( "chr_phys %.8x\n", chr_phys ); ++ ++ raw_phys += 0x10000000; ++ dst_phys += 0x10000000; ++ chr_phys += 0x10000000; ++ ++ /* If height and width are NOT values divisible by 16 - then decode will ++ not work as expected. */ ++ data->hw_decode_params.PictureStartAddr_p = (void *) raw_phys; ++ data->hw_decode_params.PictureEndAddr_p = (void *) (raw_phys + src_bytes); ++ data->hw_decode_params.DecodedBufferAddr.Luma_p = (void *) dst_phys; ++ data->hw_decode_params.DecodedBufferAddr.Chroma_p = (void *) chr_phys; ++ data->hw_decode_params.DecodedBufferAddr.LumaDecimated_p = (void *) (dst_phys + 512); ++ data->hw_decode_params.DecodedBufferAddr.ChromaDecimated_p = (void *) (chr_phys + 512); ++ data->hw_decode_params.MainAuxEnable = JPEGDECHW_MAINOUT_EN; ++ data->hw_decode_params.HorizontalDecimationFactor = JPEGDECHW_HDEC_1; ++ data->hw_decode_params.VerticalDecimationFactor = JPEGDECHW_VDEC_1; ++ data->hw_decode_params.xvalue0 = 0; ++ data->hw_decode_params.yvalue0 = 0; ++ data->hw_decode_params.xvalue1 = 0; ++ data->hw_decode_params.yvalue1 = 0; ++ data->hw_decode_params.DecodingMode = JPEGDECHW_NORMAL_DECODE; ++ data->hw_decode_params.AdditionalFlags = JPEGDECHW_ADDITIONAL_FLAG_NONE; ++ ++ data->hw_decode_params.MainAuxEnable = JPEGDECHW_AUXOUT_EN; ++ data->hw_decode_params.AdditionalFlags = 64; /* raster */ ++ ++ /* set up the transform command */ ++ data->common.TransformCommand.StructSize = sizeof(MME_Command_t); ++ data->common.TransformCommand.CmdCode = MME_TRANSFORM; ++ data->common.TransformCommand.CmdEnd = MME_COMMAND_END_RETURN_NOTIFY; ++ data->common.TransformCommand.DueTime = (MME_Time_t) 0; ++ data->common.TransformCommand.NumberInputBuffers = 0; ++ data->common.TransformCommand.NumberOutputBuffers = 0; ++ data->common.TransformCommand.DataBuffers_p = NULL; ++ data->common.TransformCommand.ParamSize = sizeof(data->hw_decode_params); ++ data->common.TransformCommand.Param_p = &data->hw_decode_params; ++ ++ /* init the transform command */ ++ memset( &(data->common.TransformCommand.CmdStatus), 0, sizeof(MME_CommandStatus_t) ); ++ data->common.TransformCommand.CmdStatus.AdditionalInfoSize = sizeof(data->hw_return_params); ++ data->common.TransformCommand.CmdStatus.AdditionalInfo_p = &data->hw_return_params; ++ ++ D_DEBUG_AT( MME_DEBUG_DOMAIN, "issuing MME_TRANSFORM\n" ); ++ ++ /* lock access to hash, because otherwise the callback could be called ++ before we've had a chance to put the command id into the hash */ ++ D_ASSERT( &data->common.pending_commands != NULL ); ++ pthread_mutex_lock( &data->common.pending_commands_lock ); ++ ++ res = MME_SendCommand( data->common.Handle, ++ &data->common.TransformCommand ); ++ if (res != MME_SUCCESS) { ++ pthread_mutex_unlock( &data->common.pending_commands_lock ); ++ ++ D_WARN( "(%5d) %s: starting transformer failed: %d (%s)", ++ direct_gettid(), data->common.name, ++ res, get_mme_error_string( res ) ); ++ ++ res = DFB_FAILURE; ++ ++ goto out5; ++ } ++ ++ direct_hash_insert( data->common.pending_commands, ++ data->common.TransformCommand.CmdStatus.CmdId, ++ (void *) 1 ); ++ D_DEBUG_AT( JPEG_MME, "sent packet's CmdId is %u (%.8x)\n", ++ data->common.TransformCommand.CmdStatus.CmdId, ++ data->common.TransformCommand.CmdStatus.CmdId ); ++ ++ deb_gettimeofday( &data->common.starttime, NULL ); ++ ++ pthread_mutex_unlock( &data->common.pending_commands_lock ); ++ ++ ++ /* wait until the decode is complete (or until the abort was ++ acknowledged) */ ++ D_DEBUG_AT( JPEG_MME, "waiting for completion\n" ); ++ while ((sema_wait_event( &data->common.decode_event ) == -1) ++ && errno == EINTR) ++ ; ++ if (data->common.decode_success != 1) ++ res = DFB_FAILURE; ++ ++ ++ mme_helper_deinit_transformer( &data->common ); ++ ++ ++out5: ++ dfb_surface_unlock_buffer( chr_surface, &chr_lock ); ++ dfb_surface_unref( chr_surface ); ++ dfb_surface_unlock_buffer( data->common.decode_surface, lock ); ++ ++ ++out4: ++out3: ++ dfb_surface_unlock_buffer( raw_surface, &raw_lock ); ++out2: ++ dfb_surface_unref( raw_surface ); ++out1: ++ return res; ++} ++#endif ++ ++ ++static DFBResult ++JPEG_HardwareRenderTo( IDirectFBImageProvider_JPEG_data *data, ++ CoreSurface *dst_surface, ++ DFBSurfacePixelFormat format, ++ DFBRectangle *rect, ++ const DFBRegion *clip ) ++{ ++ DFBResult dfbret = dfbret; ++ CoreSurfaceBufferLock lock; ++ ++ D_ASSERT( data != NULL ); ++ D_ASSERT( dst_surface != NULL ); ++ D_ASSERT( rect != NULL ); ++ D_ASSERT( clip != NULL ); ++ ++ CoreSurfaceConfig config; ++ ++ config.size.w = pre_scaled_width( data, rect ); ++ config.size.h = pre_scaled_height( data, rect ); ++ ++ if (unlikely (data->progressive_mode)) { ++ int src_width = (data->common.width + 15) & ~15; ++ int src_height = (data->common.height + 15) & ~15; ++ int totalsize = data->num_components * src_width * src_height; ++ int scale; ++ ++#define MAX_MEMORY_FOR_PROGRESSIVE_IMAGE (1 * 1024 * 1024) ++ if (totalsize < MAX_MEMORY_FOR_PROGRESSIVE_IMAGE) ++ scale = 1; ++ else if (totalsize/4 < MAX_MEMORY_FOR_PROGRESSIVE_IMAGE) ++ scale = 2; ++ else if (totalsize/16 < MAX_MEMORY_FOR_PROGRESSIVE_IMAGE) ++ scale = 4; ++ else if (totalsize/64 < MAX_MEMORY_FOR_PROGRESSIVE_IMAGE) ++ scale = 8; ++ else ++ return DFB_UNSUPPORTED; ++ ++ data->common.width /= scale; ++ data->common.height /= scale; ++// data->common.width = src_width / scale; ++// data->common.height = src_height / scale; ++ ++ config.size.w = src_width / scale; ++ config.size.h = src_height / scale; ++ } else { ++ int pre_scale = pre_scale_value( data, rect ); ++ ++ config.size.w = pre_scaled_width( data, rect ); ++ config.size.h = pre_scaled_height( data, rect ); ++ data->common.width /= pre_scale; ++ data->common.height /= pre_scale; ++ } ++ ++ /* FIXME: check if the image is big enough to warrant a HW decode */ ++ if (!data->common.decode_surface ++ || config.size.w != data->common.decode_surface->config.size.w ++ || config.size.h != data->common.decode_surface->config.size.h) { ++ /* create destination surface to MME-decode the image onto before ++ stretchblit ... and if we can't create a surface in video memory ++ then we can't blit */ ++ /* Also, decide on the decode size. ++ Limitations are: ++ - closest match to a 1/1 1/2 1/4 1/8 reduction ++ - AND a 16 pixel macroblock size. */ ++ config.flags = CSCONF_SIZE | CSCONF_FORMAT | CSCONF_COLORSPACE | CSCONF_CAPS; ++ config.format = DSPF_UYVY; ++ config.colorspace = DSCS_BT601_FULLRANGE; ++#ifdef __SH4__ ++ config.caps = DSCAPS_VIDEOONLY; ++#else ++ config.caps = 0; ++#endif ++ #ifdef DIRECT_BUILD_DEBUG ++ config.caps |= DSCAPS_SHARED; ++ #endif ++ ++ D_DEBUG_AT( JPEG_MME, "%dx%d prescaled to %dx%d\n", ++ rect->w, rect->h, config.size.w, config.size.h ); ++ ++ if (data->common.decode_surface) ++ dfb_surface_unref( data->common.decode_surface ); ++ ++ if (dfb_surface_create( data->common.base.core, ++ &config, ++ CSTF_NONE, ++ 0, ++ NULL, ++ &data->common.decode_surface )) { ++ data->common.decode_surface = NULL; ++ return DFB_NOVIDEOMEMORY; ++ } ++ ++ data->common.decode_success = 0; ++ } ++ ++ if (data->common.decode_success <= 0) { ++ data->common.name = "hwJPEG"; ++ data->common.decode_success = 0; ++ ++#if 0 ++ data->common.name = "hwJPEGHW"; ++ { ++ static const char * const transformers[] = { ++ "JPEG_DECODER_HW1", ++ "JPEG_DECODER_HW0", ++ "JPEG_DECODER_HW4", ++ "JPEG_DECODER_HW3", ++ "JPEG_DECODER_HW2", ++ "JPEG_DECODER_HW", ++ NULL ++ }; ++ unsigned int index; ++ JPEGDECHW_VideoDecodeInitParams_t init; ++ /* we should probably allocate some mme memory 2048*2048 */ ++ init.CircularBufferBeginAddr_p = (JPEGDECHW_CompressedData_t) 0x00000000; ++ init.CircularBufferEndAddr_p = (JPEGDECHW_CompressedData_t) 0xfffffff8; ++// init.CircularBufferBeginAddr_p = 0; ++// init.CircularBufferEndAddr_p = 0; ++ dfbret = mme_helper_init_transformer2( &data->common, transformers, ++ sizeof(init), &init, &index, ++ &TransformerCallback ); ++ if (dfbret != DFB_OK) ++ goto cont; ++ ++ MME_TransformerCapability_t cap; ++ _mme_helper_get_capability( &data->common, ++ transformers[index], &cap ); ++ ++ if (data->flags & DIPFLAGS_BACKGROUND_DECODE) ++ direct_thread_set_name( transformers[index] ); ++ ++ /* store the current data buffer position for software fallback ++ should we not succeed */ ++ unsigned int bufpos; ++ data->common.buffer->GetPosition( data->common.buffer, &bufpos ); ++ ++ sema_init_event( &data->common.decode_event, 0 ); ++ ++ /* Tell the transformer what to do and where to put result. ++ Depending on dst - may need to consider pitch! */ ++ dfbret = jpeg_start_transformer2( data, data->common.decode_surface, ++ &lock ); ++ goto stretch; ++ } ++ ++cont: ; ++#endif ++ ++ static const char * const transformers[] = { ++ JPEGDEC_MME_TRANSFORMER_NAME"0", ++ JPEGDEC_MME_TRANSFORMER_NAME"1", ++ JPEGDEC_MME_TRANSFORMER_NAME"2", ++ JPEGDEC_MME_TRANSFORMER_NAME"3", ++ JPEGDEC_MME_TRANSFORMER_NAME"4", ++ JPEGDEC_MME_TRANSFORMER_NAME, ++ NULL ++ }; ++ unsigned int index; ++ dfbret = mme_helper_init_transformer( &data->common, transformers, ++ 0, NULL, &index ); ++ if (dfbret == DFB_OK) { ++ MME_TransformerCapability_t cap; ++ _mme_helper_get_capability( &data->common, ++ transformers[index], &cap ); ++ ++#if 0 ++ if (cap.Version != 2) { ++ /* incompatible with old transformer, it has just way too ++ many bugs! */ ++ mme_helper_deinit_transformer( &data->common ); ++ dfbret = DFB_FAILURE; ++ continue; ++ } ++ ++ data->common.transformer_name = *transformers[transformer_index]; ++ if (data->flags & DIPFLAGS_BACKGROUND_DECODE) ++ direct_thread_set_name( *transformers[transformer_index] ); ++ ++ break; ++#endif ++ } ++ ++ if (dfbret == DFB_OK) { ++ bool locked = false; ++ ++ data->common.transformer_name = transformers[index]; ++ if (data->flags & DIRENDER_BACKGROUND) ++ direct_thread_set_name( transformers[index] ); ++ ++ /* store the current data buffer position for software ++ fallback should we not succeed */ ++ unsigned int bufpos; ++ data->common.base.buffer->GetPosition( data->common.base.buffer, ++ &bufpos ); ++ ++ sema_init_event( &data->common.decode_event, 0 ); ++ ++ /* Tell the transformer what to do and where to put result. ++ Depending on dst - may need to consider pitch! */ ++ dfbret = jpeg_start_transformer( data, ++ data->common.decode_surface, ++ &lock ); ++ if (dfbret == DFB_OK) { ++ locked = true; ++ ++ D_DEBUG_AT( JPEG_MME, ++ "Transform sent, sending data buffers now\n" ); ++ ++ mme_helper_calculate_packets( &data->common ); ++ dfbret = mme_helper_send_packets( &data->common, -1 ); ++ if (dfbret != DFB_OK) { ++ D_DEBUG_AT( JPEG_MME, ++ "aborting (main) transform command %u (%.8x)\n", ++ data->common.TransformCommand.CmdStatus.CmdId, ++ data->common.TransformCommand.CmdStatus.CmdId ); ++ MME_ERROR res = MME_AbortCommand( data->common.Handle, ++ data->common.TransformCommand.CmdStatus.CmdId ); ++ if (res != MME_SUCCESS) ++ D_WARN( "(%5d) MME_AbortCommand(%x, %.8x) for %s failed: %d (%s)\n", ++ direct_gettid(), data->common.Handle, ++ data->common.TransformCommand.CmdStatus.CmdId, ++ data->common.name, ++ res, get_mme_error_string( res ) ); ++ } ++ ++ /* wait until the decode is complete (or until the abort ++ was acknowledged) */ ++ D_DEBUG_AT( JPEG_MME, "waiting for completion\n" ); ++ while ((sema_wait_event( &data->common.decode_event ) == -1) ++ && errno == EINTR) ++ ; ++ if (data->common.decode_success != 1) ++ dfbret = DFB_FAILURE; ++ } else { ++ if (data->common.decode_success < 0) ++ dfbret = DFB_FAILURE; ++ D_DEBUG_AT( JPEG_MME, "couldn't start transformer\n" ); ++ } ++ ++ /* we always get an underflow on startup at the moment - update ++ the value so only interesting underflow get printed ... */ ++ if (data->common.n_underflows) ++ --data->common.n_underflows; ++ ++ abort_transformer( &data->common ); ++ /* wait till all commands are aborted and acknowledged */ ++ while (data->common.n_pending_buffers ++ || direct_hash_lookup( data->common.pending_commands, ++ data->common.TransformCommand.CmdStatus.CmdId )) ++ usleep( 1 ); ++ ++ mme_helper_deinit_transformer( &data->common ); ++ ++ if (likely (locked)) ++ dfb_surface_unlock_buffer( data->common.decode_surface, ++ &lock ); ++ ++ if (data->common.OutDataBuffers) { ++ D_FREE( data->common.OutDataBuffers ); ++ data->common.OutDataBuffers = NULL; ++ } ++ ++ unsigned int i; ++ for (i = 0; i < D_ARRAY_SIZE(data->common.SendDataBuffers); ++i) { ++ if (data->common.SendDataBuffers[i].buffer) { ++ MME_FreeDataBuffer( data->common.SendDataBuffers[i].buffer ); ++ data->common.SendDataBuffers[i].buffer = NULL; ++ ++ sema_close_event( &data->common.SendDataBuffers[i].sema ); ++ } ++ } ++ ++ sema_close_event( &data->common.decode_event ); ++ ++ data->common.base.buffer->SeekTo( data->common.base.buffer, ++ bufpos ); ++ } else { ++ D_ASSUME( data->common.decode_surface != NULL ); ++ dfb_surface_unref( data->common.decode_surface ); ++ data->common.decode_surface = NULL; ++ } ++ } ++ ++ if (data->common.decode_success == 1) { ++ /* stretch blit the decoded image to the destination surface and ++ size */ ++ mme_helper_stretch_blit( &data->common, data->common.decode_surface, ++ dst_surface, rect ); ++ dfbret = DFB_OK; ++ } else { ++ if (data->common.decode_surface) ++ dfb_surface_unref( data->common.decode_surface ); ++ data->common.decode_surface = NULL; ++ } ++ ++ return dfbret; ++} ++#endif /* JPEG_PROVIDER_USE_MME */ +diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_jpeg.h b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_jpeg.h +new file mode 100644 +index 0000000..19514d9 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_jpeg.h +@@ -0,0 +1,113 @@ ++#ifndef __IDIRECTFBIMAGEPROVIDER_JPEG_H__ ++#define __IDIRECTFBIMAGEPROVIDER_JPEG_H__ ++ ++#if defined(JPEG_PROVIDER_USE_MME) ++/* HW Decode Requirements */ ++#include ++#include ++ ++#include ++//#include ++#endif /* JPEG_PROVIDER_USE_MME */ ++ ++/* The following define controls prescaling ++ * ++ * PRE_SCALE_QUALITY_OPTIMISED : Better Quality ++ * When defined pre-scale will scale to larger than the requested ++ * size and use the blitter to reduce down. ++ * - This option will take precedence if both options are defined. ++ * ++ * PRE_SCALE_SPACE_OPTIMISED : Faster and Less Memory ++ * When defined pre-scale will scale below requested size, and ++ * use the blitter to enlarge ++ * ++ * Removing both defines will safely disable the pre-scaler ++ */ ++#define PRE_SCALE_QUALITY_OPTIMISED ++//#define PRE_SCALE_SPEED_SPACE_OPTIMISED ++ ++ ++ ++/* private data struct of IDirectFBImageProvider_JPEG */ ++typedef struct ++{ ++ /* hardware decode specifics */ ++ struct _MMECommon common; ++ ++ DFBRectangle rect; ++ DFBRegion clip; ++ ++ /* thread stuff */ ++ DIRenderFlags flags; ++ pthread_mutex_t lock; ++ pthread_cond_t cond; ++ DirectThread *thread; ++ IDirectFBSurface *destination; ++ DFBResult thread_res; ++ ++#if defined(JPEG_PROVIDER_USE_MME) ++ int num_components; ++ bool progressive_mode; ++ ++ JPEGDEC_TransformParams_t OutputParams; ++ JPEGDEC_TransformReturnParams_t ReturnParams; ++ ++// JPEGDECHW_VideoDecodeParams_t hw_decode_params; ++// JPEGDECHW_VideoDecodeReturnParams_t hw_return_params; ++#endif /* JPEG_PROVIDER_USE_MME */ ++} IDirectFBImageProvider_JPEG_data; ++ ++ ++#if defined(JPEG_PROVIDER_USE_MME) ++static inline const char * ++get_jpeg_error_string (unsigned int e) ++{ ++ static const char *JpegErrorType_strings[] = { ++ "Successfully Decoded", /* JPEG_NO_ERROR */ ++ "UNDEFINED_HUFF_TABLE", ++ "UNSUPPORTED_MARKER", ++ "UNABLE_ALLOCATE_MEMORY", ++ "NON_SUPPORTED_SAMP_FACTORS", ++ "BAD_PARAMETER", ++ "DECODE_ERROR", ++ "BAD_RESTART_MARKER", ++ "UNSUPPORTED_COLORSPACE", ++ "BAD_SOS_SPECTRAL", ++ "BAD_SOS_SUCCESSIVE", ++ "BAD_HEADER_LENGTH", ++ "BAD_COUNT_VALUE", ++ "BAD_DHT_MARKER", ++ "BAD_INDEX_VALUE", ++ "BAD_NUMBER_HUFFMAN_TABLES", ++ "BAD_QUANT_TABLE_LENGHT", ++ "BAD_NUMBER_QUANT_TABLES", ++ "BAD_COMPONENT_COUNT", ++ "DIVIDE_BY_ZERO_ERROR", ++ "NOT_JPG_IMAGE", ++ "UNSUPPORTED_ROTATION_ANGLE", ++ "UNSUPPORTED_SCALING", ++ "INSUFFICIENT_OUTPUTBUFFER_SIZE" ++ }; ++ ++ return ((e < D_ARRAY_SIZE (JpegErrorType_strings)) ++ ? JpegErrorType_strings[e] ++ : "* Unknown JpegError code *"); ++} ++ ++static inline const char * ++get_jpeghw_error_string (unsigned int e) ++{ ++ static const char *JpegHWErrorType_strings[] = { ++ "Successfully Decoded", /* JPEG_DECODER_NO_ERROR */ ++ "", "", "", "", "", "", "", "", ++ "JPEG_DECODER_ERROR_TASK_TIMEOUT" ++ }; ++ ++ return ((e < D_ARRAY_SIZE (JpegHWErrorType_strings)) ++ ? JpegHWErrorType_strings[e] ++ : "* Unknown JpegHWError code *"); ++} ++#endif /* JPEG_PROVIDER_USE_MME */ ++ ++ ++#endif /* __IDIRECTFBIMAGEPROVIDER_JPEG_H__ */ +diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c +index 1ccf9c5..b7e2158 100644 +--- a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c ++++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c +@@ -1,4 +1,7 @@ + /* ++ (c) Copyright 2006-2010 ST Microelectronics R&D ++ ++based on code: + (c) Copyright 2001-2010 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + +@@ -60,10 +63,40 @@ + #include + #include + #include ++#include + #include + #include + +-#include "config.h" ++#if !defined(PNG_PROVIDER_USE_MME) ++#undef USE_MME ++#endif ++ ++ ++#include "debug_helper.h" ++ ++D_DEBUG_DOMAIN (HWPNG, "PNG", "STM MME-based PNG decoder"); ++D_DEBUG_DOMAIN (HWPNG_MME, "PNG/MME", "STM MME-based PNG decoder (MME)"); ++D_DEBUG_DOMAIN (HWPNG_SEMA, "PNG/SEMA", "STM MME-based PNG decoder (semaphores"); ++D_DEBUG_DOMAIN (HWPNG_TIME, "PNG/Time", "STM MME-based PNG decoder (timing"); ++#define MME_DEBUG_DOMAIN HWPNG_MME ++#define SEMA_DEBUG_DOMAIN HWPNG_SEMA ++#define MME_TEXT_DOMAIN "PNG" ++ ++#define fetch_data buffer_to_mme_copy ++#include "mme_helper.h" ++#include "idirectfbimageprovider_png.h" ++#if defined(PNG_PROVIDER_USE_MME) ++#include "sema_helper.h" ++static DFBResult PNG_HardwareRenderTo( IDirectFBImageProvider_PNG_data *data, ++ CoreSurface *dst_surface, ++ DFBSurfacePixelFormat format, ++ DFBRectangle *rect, ++ const DFBRegion *clip ); ++#else /* PNG_PROVIDER_USE_MME */ ++#define PNG_HardwareRenderTo(data,dst_surface, \ ++ format, rect, clip) DFB_NOSUCHINSTANCE ++#endif /* PNG_PROVIDER_USE_MME */ ++ + + D_DEBUG_DOMAIN( imageProviderPNG, "ImageProvider/PNG", "libPNG based image decoder" ); + +@@ -81,8 +114,11 @@ Construct( IDirectFBImageProvider *thiz, + + #include + +-DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, PNG ) +- ++#if defined(PNG_PROVIDER_USE_MME) ++DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, hwPNG ) ++#else /* PNG_PROVIDER_USE_MME */ ++DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, swPNG ) ++#endif /* PNG_PROVIDER_USE_MME */ + + enum { + STAGE_ABORT = -2, +@@ -93,31 +129,10 @@ enum { + STAGE_END + }; + +-/* +- * private data struct of IDirectFBImageProvider_PNG +- */ +-typedef struct { +- IDirectFBImageProvider_data base; +- +- int stage; +- int rows; +- +- png_structp png_ptr; +- png_infop info_ptr; +- +- png_int_32 width; +- png_int_32 height; +- int bpp; +- int color_type; +- png_uint_32 color_key; +- bool color_keyed; +- +- void *image; +- int pitch; +- u32 palette[256]; +- DFBColor colors[256]; +-} IDirectFBImageProvider_PNG_data; + ++static DFBResult ++IDirectFBImageProvider_PNG_SetRenderFlags ( IDirectFBImageProvider *thiz, ++ DIRenderFlags flags ); + + static DFBResult + IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, +@@ -125,6 +140,10 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + const DFBRectangle *destination_rect ); + + static DFBResult ++IDirectFBImageProvider_PNG_Sync( IDirectFBImageProvider *thiz, ++ DFBImageProviderSyncFlags flags ); ++ ++static DFBResult + IDirectFBImageProvider_PNG_GetSurfaceDescription( IDirectFBImageProvider *thiz, + DFBSurfaceDescription *dsc ); + +@@ -132,6 +151,10 @@ static DFBResult + IDirectFBImageProvider_PNG_GetImageDescription( IDirectFBImageProvider *thiz, + DFBImageDescription *dsc ); + ++static void * ++PNGrenderThread( DirectThread *thread, void *driver_data ); ++ ++ + /* Called at the start of the progressive load, once we have image info */ + static void + png_info_callback (png_structp png_read_ptr, +@@ -164,11 +187,31 @@ IDirectFBImageProvider_PNG_Destruct( IDirectFBImageProvider *thiz ) + IDirectFBImageProvider_PNG_data *data = + (IDirectFBImageProvider_PNG_data*)thiz->priv; + +- png_destroy_read_struct( &data->png_ptr, &data->info_ptr, NULL ); ++ if (data->thread) { ++ /* terminate the decoding thread, if necessary... */ ++ direct_thread_cancel( data->thread ); ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ ++ pthread_mutex_destroy( &data->lock ); ++ pthread_cond_destroy( &data->cond ); ++ } ++ ++ if (data->png_ptr) { ++ png_destroy_read_struct( &data->png_ptr, &data->info_ptr, NULL ); ++ data->png_ptr = NULL; ++ } + + /* Deallocate image data. */ +- if (data->image) +- D_FREE( data->image ); ++ if (data->common.image) ++ D_FREE( data->common.image ); ++ ++#if defined(PNG_PROVIDER_USE_MME) ++ if (data->common.decode_surface) { ++ dfb_gfxcard_wait_serial( &data->common.serial ); ++ dfb_surface_unref( data->common.decode_surface ); ++ } ++#endif + } + + /**********************************************************************************************************************/ +@@ -201,9 +244,9 @@ Construct( IDirectFBImageProvider *thiz, + core = va_arg( tag, CoreDFB * ); + va_end( tag ); + +- data->base.ref = 1; +- data->base.buffer = buffer; +- data->base.core = core; ++ data->common.base.ref = 1; ++ data->common.base.buffer = buffer; ++ data->common.base.core = core; + + /* Increase the data buffer reference counter. */ + buffer->AddRef( buffer ); +@@ -230,15 +273,16 @@ Construct( IDirectFBImageProvider *thiz, + png_row_callback, + png_end_callback ); + +- + /* Read until info callback is called. */ + ret = push_data_until_stage( data, STAGE_INFO, 64 ); + if (ret) + goto error; + +- data->base.Destruct = IDirectFBImageProvider_PNG_Destruct; ++ data->common.base.Destruct = IDirectFBImageProvider_PNG_Destruct; + ++ thiz->SetRenderFlags = IDirectFBImageProvider_PNG_SetRenderFlags; + thiz->RenderTo = IDirectFBImageProvider_PNG_RenderTo; ++ thiz->Sync = IDirectFBImageProvider_PNG_Sync; + thiz->GetImageDescription = IDirectFBImageProvider_PNG_GetImageDescription; + thiz->GetSurfaceDescription = IDirectFBImageProvider_PNG_GetSurfaceDescription; + +@@ -250,8 +294,8 @@ error: + + buffer->Release( buffer ); + +- if (data->image) +- D_FREE( data->image ); ++ if (data->common.image) ++ D_FREE( data->common.image ); + + DIRECT_DEALLOCATE_INTERFACE(thiz); + +@@ -261,42 +305,66 @@ error: + /**********************************************************************************************************************/ + + static DFBResult +-IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, +- IDirectFBSurface *destination, +- const DFBRectangle *dest_rect ) ++IDirectFBImageProvider_PNG_SetRenderFlags( IDirectFBImageProvider *thiz, ++ DIRenderFlags flags ) + { +- DFBResult ret = DFB_OK; +- IDirectFBSurface_data *dst_data; +- CoreSurface *dst_surface; +- DFBRegion clip; +- DFBRectangle rect; +- int x, y; +- DFBRectangle clipped; ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_PNG) + +- DIRECT_INTERFACE_GET_DATA (IDirectFBImageProvider_PNG) ++ /* if we have decoded the image already, don't do anything... */ ++ if (data->common.image ++#if defined(PNG_PROVIDER_USE_MME) ++ || data->common.decode_surface ++#endif /* PNG_PROVIDER_USE_MME */ ++ ) ++ return DFB_UNSUPPORTED; ++ ++ if (!(flags & DIRENDER_NONE) && data->thread) { ++ /* terminate the decoding thread, if necessary... */ ++ direct_thread_cancel( data->thread ); ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ data->thread = NULL; ++ ++ pthread_cond_destroy( &data->cond ); ++ pthread_mutex_destroy( &data->lock ); ++ } ++ else if (flags & DIRENDER_BACKGROUND && !data->thread) { ++ /* or create it */ ++ pthread_cond_init( &data->cond, NULL ); ++ pthread_mutex_init( &data->lock, NULL ); ++ /* as long as we haven't even started yet, we are in INIT state */ ++ data->thread_res = DFB_INIT; ++ data->thread = direct_thread_create( DTT_DEFAULT, PNGrenderThread, ++ thiz, "PNG_DECODER?" ); ++ } + +- D_DEBUG_AT( imageProviderPNG, "%s(%d)\n", __FUNCTION__, __LINE__ ); ++ data->flags = flags; + +- dst_data = (IDirectFBSurface_data*) destination->priv; +- if (!dst_data) +- return DFB_DEAD; ++ return DFB_OK; ++} + +- dst_surface = dst_data->surface; +- if (!dst_surface) +- return DFB_DESTROYED; + +- dfb_region_from_rectangle( &clip, &dst_data->area.current ); ++static DFBResult ++PNG_SoftwareRenderTo( IDirectFBImageProvider_PNG_data *data, ++ CoreSurface *dst_surface, ++ DFBSurfacePixelFormat format, ++ DFBRectangle *rect, ++ const DFBRegion *clip ) ++{ ++ ++ DFBResult ret = DFB_OK; ++ png_infop info; ++ int x, y; ++ DFBRectangle clipped; + +- if (dest_rect) { +- if (dest_rect->w < 1 || dest_rect->h < 1) +- return DFB_INVARG; +- rect = *dest_rect; +- rect.x += dst_data->area.wanted.x; +- rect.y += dst_data->area.wanted.y; +- } +- else { +- rect = dst_data->area.wanted; +- } ++ D_ASSERT( data != NULL ); ++ D_ASSERT( dst_surface != NULL ); ++ D_ASSERT( clip != NULL ); ++ D_ASSERT( rect != NULL ); ++ ++ D_DEBUG_AT(imageProviderPNG,"%s(%d)\n",__FUNCTION__,__LINE__); ++ ++ info = data->info_ptr; + + if (setjmp( png_jmpbuf(data->png_ptr) )) { + D_ERROR( "ImageProvider/PNG: Error during decoding!\n" ); +@@ -314,23 +382,23 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + return ret; + } + +- clipped = rect; ++ clipped = *rect; + +- if (!dfb_rectangle_intersect_by_region( &clipped, &clip )) ++ if (!dfb_rectangle_intersect_by_region( &clipped, clip )) + return DFB_INVAREA; + + /* actual rendering */ + if (0 && // FIXME +- rect.w == data->width && rect.h == data->height && ++ rect->w == data->common.width && rect->h == data->common.height && + (data->color_type == PNG_COLOR_TYPE_RGB || data->color_type == PNG_COLOR_TYPE_RGBA) && + (dst_surface->config.format == DSPF_RGB32 || dst_surface->config.format == DSPF_ARGB) && + !(dst_surface->config.caps & DSCAPS_PREMULTIPLIED)) + { + //ret = dfb_surface_write_buffer( dst_surface, CSBR_BACK, +- // data->image + +- // (clipped.x - rect.x) * 4 + +- // (clipped.y - rect.y) * data->width * 4, +- // data->width * 4, &clipped ); ++ // data->common.image + ++ // (clipped.x - rect->x) * 4 + ++ // (clipped.y - rect->y) * data->common.width * 4, ++ // data->common.width * 4, &clipped ); + } + else { + CoreSurfaceBufferLock lock; +@@ -349,17 +417,17 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + */ + + /* FIXME: Limitation for LUT8 is to load complete surface only. */ +- dfb_clip_rectangle( &clip, &rect ); +- if (rect.x == 0 && rect.y == 0 && +- rect.w == dst_surface->config.size.w && +- rect.h == dst_surface->config.size.h && +- rect.w == data->width && +- rect.h == data->height) ++ dfb_clip_rectangle( clip, rect ); ++ if (rect->x == 0 && rect->y == 0 && ++ rect->w == dst_surface->config.size.w && ++ rect->h == dst_surface->config.size.h && ++ rect->w == data->common.width && ++ rect->h == data->common.height) + { +- for (y = 0; y < data->height; y++) ++ for (y = 0; y < data->common.height; y++) + direct_memcpy( (u8*)lock.addr + lock.pitch * y, +- (u8*)data->image + data->pitch * y, +- data->width ); ++ (u8*)data->common.image + data->pitch * y, ++ data->common.width ); + + break; + } +@@ -376,15 +444,15 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + for (x = 0; x < 256; x++) + data->palette[x] = 0xff000000 | (x << 16) | (x << 8) | x; + +- dfb_scale_linear_32( data->image, data->width, data->height, +- lock.addr, lock.pitch, &rect, dst_surface, &clip ); ++ dfb_scale_linear_32( data->common.image, data->common.width, data->common.height, ++ lock.addr, lock.pitch, rect, dst_surface, clip ); + break; + } + + // FIXME: allocates four additional bytes because the scaling functions + // in src/misc/gfx_util.c have an off-by-one bug which causes + // segfaults on darwin/osx (not on linux) +- int size = data->width * data->height * 4 + 4; ++ int size = data->common.width * data->common.height * 4 + 4; + + /* allocate image data */ + void *image_argb = D_MALLOC( size ); +@@ -407,21 +475,21 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + + switch (bit_depth) { + case 8: +- for (y = 0; y < data->height; y++) { +- u8 *S = (u8*)data->image + data->pitch * y; +- u32 *D = (u32*)((u8*)image_argb + data->width * y * 4); ++ for (y = 0; y < data->common.height; y++) { ++ u8 *S = (u8*)data->common.image + data->pitch * y; ++ u32 *D = (u32*)((u8*)image_argb + data->common.width * y * 4); + +- for (x = 0; x < data->width; x++) ++ for (x = 0; x < data->common.width; x++) + D[x] = data->palette[ S[x] ]; + } + break; + + case 4: +- for (y = 0; y < data->height; y++) { +- u8 *S = (u8*)data->image + data->pitch * y; +- u32 *D = (u32*)((u8*)image_argb + data->width * y * 4); ++ for (y = 0; y < data->common.height; y++) { ++ u8 *S = (u8*)data->common.image + data->pitch * y; ++ u32 *D = (u32*)((u8*)image_argb + data->common.width * y * 4); + +- for (x = 0; x < data->width; x++) { ++ for (x = 0; x < data->common.width; x++) { + if (x & 1) + D[x] = data->palette[ S[x>>1] & 0xf ]; + else +@@ -431,12 +499,12 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + break; + + case 2: +- for (y = 0; y < data->height; y++) { ++ for (y = 0; y < data->common.height; y++) { + int n = 6; +- u8 *S = (u8*)data->image + data->pitch * y; +- u32 *D = (u32*)((u8*)image_argb + data->width * y * 4); ++ u8 *S = (u8*)data->common.image + data->pitch * y; ++ u32 *D = (u32*)((u8*)image_argb + data->common.width * y * 4); + +- for (x = 0; x < data->width; x++) { ++ for (x = 0; x < data->common.width; x++) { + D[x] = data->palette[ (S[x>>2] >> n) & 3 ]; + + n = (n ? n - 2 : 6); +@@ -445,12 +513,12 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + break; + + case 1: +- for (y = 0; y < data->height; y++) { ++ for (y = 0; y < data->common.height; y++) { + int n = 7; +- u8 *S = (u8*)data->image + data->pitch * y; +- u32 *D = (u32*)((u8*)image_argb + data->width * y * 4); ++ u8 *S = (u8*)data->common.image + data->pitch * y; ++ u32 *D = (u32*)((u8*)image_argb + data->common.width * y * 4); + +- for (x = 0; x < data->width; x++) { ++ for (x = 0; x < data->common.width; x++) { + D[x] = data->palette[ (S[x>>3] >> n) & 1 ]; + + n = (n ? n - 1 : 7); +@@ -463,19 +531,20 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + bit_depth ); + } + +- dfb_scale_linear_32( image_argb, data->width, data->height, +- lock.addr, lock.pitch, &rect, dst_surface, &clip ); ++ dfb_scale_linear_32( image_argb, data->common.width, data->common.height, ++ lock.addr, lock.pitch, rect, dst_surface, clip ); + + D_FREE( image_argb ); + } + break; + } ++ + default: + /* + * Generic loading code. + */ +- dfb_scale_linear_32( data->image, data->width, data->height, +- lock.addr, lock.pitch, &rect, dst_surface, &clip ); ++ dfb_scale_linear_32( data->common.image, data->common.width, data->common.height, ++ lock.addr, lock.pitch, rect, dst_surface, clip ); + break; + } + +@@ -488,6 +557,164 @@ IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, + return ret; + } + ++ ++static DFBResult ++PNG_RenderTo( IDirectFBImageProvider_PNG_data *data, ++ CoreSurface *dst_surface, ++ DFBSurfacePixelFormat format, ++ DFBRectangle *rect, ++ const DFBRegion *clip ) ++{ ++ DFBResult res; ++ ++ D_ASSERT( data != NULL ); ++ D_ASSERT( dst_surface != NULL ); ++ D_ASSERT( clip != NULL ); ++ D_ASSERT( rect != NULL ); ++ ++ res = PNG_HardwareRenderTo (data, dst_surface, format, rect, clip); ++ if (res != DFB_OK) { ++ if (unlikely (res == DFB_IO)) { ++ /* IO error - there's no point in retrying */ ++ D_DEBUG_AT (HWPNG, "hardware decode failed: %d (%s)\n", ++ res, DirectFBErrorString (res)); ++ return res; ++ } ++ ++ if (res == DFB_UNSUPPORTED) ++ D_DEBUG_AT (HWPNG, "doing software decode since it's faster " ++ "than hardware for this image\n"); ++ else ++ D_DEBUG_AT (HWPNG, "hardware decode failed: %d (%s) - " ++ "attempting software fallback\n", ++ res, DirectFBErrorString (res)); ++ ++ res = PNG_SoftwareRenderTo (data, dst_surface, format, rect, clip); ++ if (unlikely (res != DFB_OK)) ++ D_DEBUG_AT (HWPNG, "software decode failed: %d (%s)\n", ++ res, DirectFBErrorString (res)); ++ } ++ ++ return res; ++} ++ ++static DFBResult ++IDirectFBImageProvider_PNG_RenderTo( IDirectFBImageProvider *thiz, ++ IDirectFBSurface *destination, ++ const DFBRectangle *dest_rect ) ++{ ++ IDirectFBSurface_data *dst_data; ++ CoreSurface *dst_surface; ++ DFBSurfacePixelFormat format; ++ DFBResult ret; ++ ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_PNG) ++ ++ dst_data = (IDirectFBSurface_data*) destination->priv; ++ if (!dst_data) ++ return DFB_DEAD; ++ ++ dst_surface = dst_data->surface; ++ if (!dst_surface) ++ return DFB_DESTROYED; ++ ++ ret = destination->GetPixelFormat( destination, &format ); ++ if (ret) ++ return ret; ++ ++ if (data->thread) ++ pthread_mutex_lock( &data->lock ); ++ ++ dfb_region_from_rectangle( &data->clip, &dst_data->area.current ); ++ ++ if (dest_rect) { ++ if (dest_rect->w < 1 || dest_rect->h < 1) { ++ if (data->thread) ++ pthread_mutex_unlock (&data->lock); ++ return DFB_INVARG; ++ } ++ ++ data->rect = *dest_rect; ++ data->rect.x += dst_data->area.wanted.x; ++ data->rect.y += dst_data->area.wanted.y; ++ } ++ else { ++ data->rect = dst_data->area.wanted; ++ } ++ ++ if (!D_FLAGS_IS_SET (data->flags, DIRENDER_BACKGROUND)) { ++ /* threaded operation was not requested */ ++ data->thread_res = PNG_RenderTo( data, dst_surface, format, ++ &data->rect, &data->clip ); ++ if (data->thread) ++ pthread_mutex_unlock( &data->lock ); ++ return data->thread_res; ++ } ++ ++ if (!data->thread) { ++ /* for the case that somebody does a RenderTo() twice on us, we ++ have to create new thread, because the initial thread will have ++ finished already */ ++ ++ D_ASSERT( data->destination == NULL ); ++ ++ /* as long as we haven't even started yet, we are in INIT state */ ++ data->thread_res = DFB_INIT; ++ data->thread = direct_thread_create( DTT_DEFAULT, PNGrenderThread, ++ thiz, "PNG" ); ++ } ++ ++ D_ASSERT( data->destination == NULL ); ++ ++ destination->AddRef( destination ); ++ data->destination = destination; ++ ++ pthread_cond_signal( &data->cond ); ++ pthread_mutex_unlock( &data->lock ); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++IDirectFBImageProvider_PNG_Sync( IDirectFBImageProvider *thiz, ++ DFBImageProviderSyncFlags flags ) ++{ ++ DFBResult res; ++ ++ DIRECT_INTERFACE_GET_DATA(IDirectFBImageProvider_PNG) ++ ++ switch (flags) ++ { ++ case DIPSYNCFLAGS_TRYSYNC: ++ if (data->thread) { ++ if (data->thread_res == DFB_INIT ++ || data->thread_res == DFB_BUSY) { ++ /* DFB_INIT (user didn't call RenderTo() yet) ++ DFB_BUSY (still busy decoding) */ ++ return data->thread_res; ++ } ++ /* else we are done, either because of some error or because ++ we have processed all the data already */ ++ } ++ /* fall through */ ++ ++ case DIPSYNCFLAGS_SYNC: ++ if (data->thread) { ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ data->thread = NULL; ++ } ++ break; ++ ++ default: ++ return DFB_OK; ++ } ++ ++ res = data->thread_res; ++ data->thread_res = DFB_OK; ++ return res; ++} ++ + static DFBResult + IDirectFBImageProvider_PNG_GetSurfaceDescription( IDirectFBImageProvider *thiz, + DFBSurfaceDescription *dsc ) +@@ -497,13 +724,13 @@ IDirectFBImageProvider_PNG_GetSurfaceDescription( IDirectFBImageProvider *thiz, + DIRECT_INTERFACE_GET_DATA (IDirectFBImageProvider_PNG) + + dsc->flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; +- dsc->width = data->width; +- dsc->height = data->height; ++ dsc->width = data->common.width; ++ dsc->height = data->common.height; + + if (data->color_type & PNG_COLOR_MASK_ALPHA) + dsc->pixelformat = DFB_PIXELFORMAT_HAS_ALPHA(primary_format) ? primary_format : DSPF_ARGB; + else +- dsc->pixelformat = primary_format; ++ dsc->pixelformat = DSPF_RGB24; + + if (data->color_type == PNG_COLOR_TYPE_PALETTE) { + dsc->flags |= DSDESC_PALETTE; +@@ -540,6 +767,71 @@ IDirectFBImageProvider_PNG_GetImageDescription( IDirectFBImageProvider *thiz, + return DFB_OK; + } + ++static void ++render_cleanup( void *cleanup_data ) ++{ ++ IDirectFBImageProvider *thiz = cleanup_data; ++ IDirectFBImageProvider_PNG_data *data; ++ ++ D_MAGIC_ASSERT( (IAny*)thiz, DirectInterface ); ++ data = (IDirectFBImageProvider_PNG_data *) thiz->priv; ++ D_ASSERT( data != NULL ); ++ ++ if (data->destination) { ++ data->destination->Release( data->destination ); ++ data->destination = NULL; ++ } ++ ++ /* in case we get terminated from outside, set the state to DFB_DEAD */ ++ data->thread_res = DFB_DEAD; ++ ++ pthread_mutex_unlock( &data->lock ); ++} ++ ++static void * ++PNGrenderThread( DirectThread *thread, void *driver_data ) ++{ ++ IDirectFBImageProvider *thiz = driver_data; ++ IDirectFBImageProvider_PNG_data *data; ++ IDirectFBSurface_data *dst_data; ++ CoreSurface *dst_surface; ++ DFBSurfacePixelFormat format; ++ DFBResult res; ++ ++ D_MAGIC_ASSERT( (IAny*)thiz, DirectInterface ); ++ data = (IDirectFBImageProvider_PNG_data *) thiz->priv; ++ D_ASSERT( data != NULL ); ++ ++ pthread_mutex_lock( &data->lock ); ++ ++ pthread_cleanup_push( render_cleanup, thiz ); ++ ++ while (!data->destination) { ++ pthread_cond_wait( &data->cond, &data->lock ); ++ } ++ ++ dst_data = (IDirectFBSurface_data*) data->destination->priv; ++ D_ASSERT( dst_data != NULL ); ++ ++ dst_surface = dst_data->surface; ++ D_ASSERT( dst_surface != NULL ); ++ ++ res = data->destination->GetPixelFormat( data->destination, &format ); ++ D_ASSERT( res == DFB_OK ); ++ ++ /* as long as we haven't finished decoding we are busy */ ++ data->thread_res = DFB_BUSY; ++ ++ res = PNG_RenderTo( data, dst_surface, format, &data->rect, &data->clip ); ++ ++ pthread_cleanup_pop( 1 ); ++ ++ /* in case we exit normally, apply the real return value */ ++ data->thread_res = res; ++ ++ return NULL; ++} ++ + /**********************************************************************************************************************/ + + #define MAXCOLORMAPSIZE 256 +@@ -598,6 +890,8 @@ png_info_callback( png_structp png_read_ptr, + { + int i,ret; + IDirectFBImageProvider_PNG_data *data; ++ png_int_32 width; ++ png_int_32 height; + + u32 bpp1[2] = {0, 0xff}; + u32 bpp2[4] = {0, 0x55, 0xaa, 0xff}; +@@ -617,13 +911,16 @@ png_info_callback( png_structp png_read_ptr, + data->stage = STAGE_INFO; + + ret = png_get_IHDR( data->png_ptr, data->info_ptr, +- (png_uint_32 *)&data->width, (png_uint_32 *)&data->height, &data->bpp, &data->color_type, ++ (png_uint_32 *)&width, (png_uint_32 *)&height, &data->bpp, &data->color_type, + NULL, NULL, NULL ); + + /* Let's not do anything with badly sized or corrupted images */ +- if ( (data->height == 0) || (data->width == 0) || (ret != 1) ) ++ if ( (height == 0) || (width == 0) || (ret != 1) ) + return; + ++ data->common.width = width; ++ data->common.height = height; ++ + if (png_get_valid( data->png_ptr, data->info_ptr, PNG_INFO_tRNS )) { + data->color_keyed = true; + +@@ -773,13 +1070,13 @@ png_info_callback( png_structp png_read_ptr, + data->colors[i].b ); + } + +- data->pitch = (data->width + 7) & ~7; ++ data->pitch = (data->common.width + 7) & ~7; + break; + } + + case PNG_COLOR_TYPE_GRAY: + if (data->bpp < 16) { +- data->pitch = data->width; ++ data->pitch = data->common.width; + break; + } + +@@ -789,7 +1086,7 @@ png_info_callback( png_structp png_read_ptr, + + /* fall through */ + default: +- data->pitch = data->width * 4; ++ data->pitch = data->common.width * 4; + + if (!data->color_keyed) + png_set_strip_16( data->png_ptr ); /* if it is color keyed we will handle conversion ourselves */ +@@ -838,15 +1135,15 @@ png_row_callback( png_structp png_read_ptr, + data->stage = STAGE_IMAGE; + + /* check image data pointer */ +- if (!data->image) { ++ if (!data->common.image) { + // FIXME: allocates four additional bytes because the scaling functions + // in src/misc/gfx_util.c have an off-by-one bug which causes + // segfaults on darwin/osx (not on linux) +- int size = data->pitch * data->height + 4; ++ int size = data->pitch * data->common.height + 4; + + /* allocate image data */ +- data->image = D_CALLOC( 1, size ); +- if (!data->image) { ++ data->common.image = D_CALLOC( 1, size ); ++ if (!data->common.image) { + D_ERROR( "DirectFB/ImageProvider_PNG: Could not " + "allocate %d bytes of system memory!\n", size ); + +@@ -859,7 +1156,7 @@ png_row_callback( png_structp png_read_ptr, + + /* write to image data */ + if (data->bpp == 16 && data->color_keyed) { +- u8 *dst = (u8*)((u8*)data->image + row_num * data->pitch); ++ u8 *dst = (u8*)((u8*)data->common.image + row_num * data->pitch); + u8 *src = (u8*)new_row; + + if (src) { +@@ -908,7 +1205,7 @@ png_row_callback( png_structp png_read_ptr, + u16 *src16 = (u16*)src + src16_initial_offset; + u32 *dst32 = (u32*)dst + dst32_initial_offset; + +- int remaining = data->width - dst32_initial_offset; ++ int remaining = data->common.width - dst32_initial_offset; + + while (remaining > 0) { + int keyed = 0; +@@ -948,17 +1245,17 @@ png_row_callback( png_structp png_read_ptr, + } + } + else +- png_progressive_combine_row( data->png_ptr, (png_bytep)((u8*)data->image + row_num * data->pitch), new_row ); ++ png_progressive_combine_row( data->png_ptr, (png_bytep)((u8*)data->common.image + row_num * data->pitch), new_row ); + + /* increase row counter, FIXME: interlaced? */ + data->rows++; + +- if (data->base.render_callback) { ++ if (data->common.base.render_callback) { + DIRenderCallbackResult r; +- DFBRectangle rect = { 0, row_num, data->width, 1 }; ++ DFBRectangle rect = { 0, row_num, data->common.width, 1 }; + +- r = data->base.render_callback( &rect, +- data->base.render_callback_context ); ++ r = data->common.base.render_callback( &rect, ++ data->common.base.render_callback_context ); + if (r != DIRCR_OK) + data->stage = STAGE_ABORT; + } +@@ -992,7 +1289,7 @@ push_data_until_stage (IDirectFBImageProvider_PNG_data *data, + int buffer_size) + { + DFBResult ret; +- IDirectFBDataBuffer *buffer = data->base.buffer; ++ IDirectFBDataBuffer *buffer = data->common.base.buffer; + + while (data->stage < stage) { + unsigned int len; +@@ -1034,3 +1331,711 @@ push_data_until_stage (IDirectFBImageProvider_PNG_data *data, + + return DFB_OK; + } ++ ++ ++ ++#if defined(PNG_PROVIDER_USE_MME) ++static void ++TransformerCallback (MME_Event_t Event, ++ MME_Command_t *CallbackData, ++ void *UserData) ++{ ++ static const char *color_types[] = { "gray", "?", "rgb", "palette", ++ "alpha", "?", "rgba" }; ++ static const char *interlace_types[] = { "none", "adam7" }; ++ ++ const PNGDecode_TransformReturnParams_t * const transform_result = ++ CallbackData->CmdStatus.AdditionalInfo_p; ++ const PNGDecode_GlobalTransformReturnParams_t * const global_transform_result = ++ CallbackData->CmdStatus.AdditionalInfo_p; ++ struct _MMECommon * const mme = (struct _MMECommon *) UserData; ++ IDirectFBImageProvider_PNG_data * const data = ++ container_of (mme, IDirectFBImageProvider_PNG_data, common); ++ ++ if (!mme->name_set) ++ { ++ char name[20]; ++ snprintf (name, sizeof (name), "MME (%s)", mme->transformer_name); ++ direct_thread_set_name (name); ++ mme->name_set = true; ++ } ++ ++ D_DEBUG_AT (HWPNG, "%sTransformerCallback: Event: %d: (%s)%s\n", ++ RED, Event, get_mme_event_string (Event), BLACK); ++ D_DEBUG_AT (HWPNG, " -> CallbackData->CmdStatus.State: %d (%s)\n", ++ CallbackData->CmdStatus.State, ++ get_mme_state_string (CallbackData->CmdStatus.State)); ++ D_DEBUG_AT (HWPNG, " -> CallbackData->CmdStatus.CmdId: %u (%.8x)\n", ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId); ++ D_DEBUG_AT (HWPNG, " -> CallbackData->CmdStatus.Error: %d (%s)\n", ++ CallbackData->CmdStatus.Error, ++ get_mme_error_string (CallbackData->CmdStatus.Error)); ++ D_DEBUG_AT (HWPNG, " -> CallbackData->CmdStatus.AdditionalInfoSize: %u\n", ++ CallbackData->CmdStatus.AdditionalInfoSize); ++ D_DEBUG_AT (HWPNG, " -> mme->decode_success: %d\n", mme->decode_success); ++ ++ switch (Event) ++ { ++ case MME_COMMAND_COMPLETED_EVT: ++ pthread_mutex_lock (&mme->pending_commands_lock); ++ direct_hash_remove (mme->pending_commands, ++ CallbackData->CmdStatus.CmdId); ++ if (likely (CallbackData->CmdStatus.CmdId != mme->TransformCommand.CmdStatus.CmdId ++ && CallbackData->CmdStatus.CmdId != data->SetGlobalCommand.CmdStatus.CmdId)) ++ --mme->n_pending_buffers; ++ pthread_mutex_unlock (&mme->pending_commands_lock); ++ ++ switch (CallbackData->CmdStatus.State) ++ { ++ case MME_COMMAND_COMPLETED: ++ if (unlikely (CallbackData->CmdStatus.CmdId ++ == mme->TransformCommand.CmdStatus.CmdId)) ++ { ++ deb_gettimeofday (&mme->endtime, NULL); ++ deb_timersub (&mme->endtime, &mme->starttime, &mme->endtime); ++ D_DEBUG_AT (HWPNG_TIME, " -> total time %lu.%06lu\n", ++ mme->endtime.tv_sec, mme->endtime.tv_usec); ++ ++ D_DEBUG_AT (HWPNG, " -> expanded bytes: %u\n", ++ transform_result->BytesWritten); ++ ++ D_DEBUG_AT (HWPNG, " -> PNG result code: %d (%s)\n", ++ transform_result->ErrorType, ++ get_png_error_string (transform_result->ErrorType)); ++ ++ if (transform_result->Cycles) ++ { ++ D_DEBUG_AT (HWPNG, " -> profiling data: cyc/bu/i/d/n: " ++ "%u/%u/%u/%u/%u\n", ++ transform_result->Cycles, ++ transform_result->Bundles, ++ transform_result->ICacheMiss, ++ transform_result->DCacheMiss, ++ transform_result->NopBundles); ++ } ++ ++ mme->decode_success = 1; ++ sema_signal_event (&mme->decode_event); ++ ++ /* in case of bogus data (too much), abort pending data ++ buffers */ ++ abort_transformer (mme); ++ } ++ else if (unlikely (CallbackData->CmdStatus.CmdId ++ == data->SetGlobalCommand.CmdStatus.CmdId)) ++ { ++ D_DEBUG_AT (HWPNG, " -> size: %ux%u @ %ubpp\n", ++ global_transform_result->PictureWidth, ++ global_transform_result->PictureHeight, ++ global_transform_result->BitDepth); ++ D_DEBUG_AT (HWPNG, " -> ColorType : %d (%s)\n", ++ global_transform_result->ColorType, ++ (global_transform_result->ColorType ++ < D_ARRAY_SIZE (color_types)) ++ ? color_types[global_transform_result->ColorType] ++ : "?" ); ++ D_DEBUG_AT (HWPNG, " -> InterlaceType : %d (%s)\n", ++ global_transform_result->InterlaceType, ++ (global_transform_result->InterlaceType ++ < D_ARRAY_SIZE (interlace_types)) ++ ? interlace_types[global_transform_result->InterlaceType] ++ : "?"); ++ D_DEBUG_AT (HWPNG, " -> CompressionType: %d\n", global_transform_result->CompressionType); ++ D_DEBUG_AT (HWPNG, " -> FilterMethod : %d\n", global_transform_result->FilterMethod); ++ D_DEBUG_AT (HWPNG, " -> ErrorType : %d (%s)\n", global_transform_result->ErrorType, get_png_error_string (global_transform_result->ErrorType)); ++ ++ D_DEBUG_AT (HWPNG, " -> ColorFormatOutput: %d\n", global_transform_result->ColorFormatOutput); ++ D_DEBUG_AT (HWPNG, " -> ColorKey: %c\n", global_transform_result->HaveColorKey ? 'y' : 'n'); ++ if (global_transform_result->HaveColorKey) ++ D_DEBUG_AT (HWPNG, " -> ColorKey (xRGB): %.6x\n", global_transform_result->ColorKey); ++ D_DEBUG_AT (HWPNG, " -> pitch: %d\n", global_transform_result->pitch); ++ ++ sema_signal_event (&data->global_event); ++ } ++ else ++ { ++ /* buffer completed */ ++ struct _MMEHelper_buffer *buf = ++ container_of (CallbackData->DataBuffers_p, ++ struct _MMEHelper_buffer, buffer); ++ ++ D_DEBUG_AT (HWPNG, " -> buffer %p completed (container @ %p)\n", ++ CallbackData->DataBuffers_p[0], buf); ++ ++ sema_signal_event (&buf->sema); ++ } ++ break; /* MME_COMMAND_COMPLETED */ ++ ++ case MME_COMMAND_FAILED: ++ if (CallbackData->CmdStatus.Error != MME_COMMAND_ABORTED) ++ D_WARN ("(%5d) %s: command %u (%.8x) failed: error %d (%s)", ++ direct_gettid (), mme->name, ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.Error, ++ get_mme_error_string (CallbackData->CmdStatus.Error)); ++ ++ if (likely (CallbackData->CmdStatus.CmdId ++ == mme->TransformCommand.CmdStatus.CmdId)) ++ { ++ /* transform command failed */ ++ D_DEBUG_AT (HWPNG, " -> transform->ErrorType: %d (%s)\n", ++ transform_result->ErrorType, ++ get_png_error_string (transform_result->ErrorType)); ++ ++ mme->decode_success = -1; ++ sema_signal_event (&mme->decode_event); ++ } ++ else if (likely (CallbackData->CmdStatus.CmdId ++ == data->SetGlobalCommand.CmdStatus.CmdId)) ++ { ++ /* global transform params command failed */ ++ D_DEBUG_AT (HWPNG, " -> global->ErrorType: %d (%s)\n", ++ global_transform_result->ErrorType, ++ get_png_error_string (global_transform_result->ErrorType)); ++ ++ mme->decode_success = -1; ++ sema_signal_event (&data->global_event); ++ } ++ else ++ { ++ /* buffer failed */ ++ struct _MMEHelper_buffer *buf = ++ container_of (CallbackData->DataBuffers_p, ++ struct _MMEHelper_buffer, buffer); ++ if (mme->decode_success == 0) ++ /* only if we didn't succeed yet */ ++ mme->decode_success = -1; ++ sema_signal_event (&buf->sema); ++ } ++ break; /* MME_COMMAND_FAILED */ ++ ++ case MME_COMMAND_IDLE: ++ case MME_COMMAND_PENDING: ++ case MME_COMMAND_EXECUTING: ++ default: ++ D_WARN ("(%5d) %s: command %u (%.8x) completed in unknown state: %d (%s)", ++ direct_gettid (), mme->name, ++ CallbackData->CmdStatus.CmdId, CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.State, ++ get_mme_state_string (CallbackData->CmdStatus.State)); ++ break; ++ } ++ break; /* MME_COMMAND_COMPLETED_EVT */ ++ ++ case MME_DATA_UNDERFLOW_EVT: ++ ++mme->n_underflows; ++ { ++ /* check if the IDirectFBDataBuffer definitely(!) hit an EOF and ++ we have no buffers queued */ ++ bool end_of_data; ++ char tmp; ++ pthread_mutex_lock (&mme->pending_commands_lock); ++ DFBResult has_data = mme->base.buffer->PeekData (mme->base.buffer, ++ 1, 0, &tmp, NULL); ++ /* n_pending_buffers is checked to be == 0 because the ++ TransformCommand itself is not stored in there. */ ++ end_of_data = (has_data == DFB_EOF ++ && mme->n_pending_buffers == 0); ++ pthread_mutex_unlock (&mme->pending_commands_lock); ++ ++ /* if so, signal completion */ ++ if (end_of_data) ++ { ++ D_DEBUG_AT (HWPNG, " -> no more data available, signalling fail\n"); ++ mme->decode_success = -2; ++ sema_signal_event (&mme->decode_event); ++ } ++ } ++ break; /* MME_DATA_UNDERFLOW_EVT */ ++ ++ case MME_NOT_ENOUGH_MEMORY_EVT: ++ case MME_NEW_COMMAND_EVT: ++ default: ++ D_WARN ("(%5d) %s: unhandled event %d (%s) occured on command %u (%.8x)", ++ direct_gettid (), mme->name, Event, ++ get_mme_event_string (Event), CallbackData->CmdStatus.CmdId, ++ CallbackData->CmdStatus.CmdId); ++ ++ D_WARN ("(%5d) %s: CallbackData->CmdStatus.AdditionalInfoSize: %u", ++ direct_gettid (), mme->name, CallbackData->CmdStatus.AdditionalInfoSize); ++ ++ if (CallbackData->CmdStatus.CmdId == mme->TransformCommand.CmdStatus.CmdId) ++ { ++ D_WARN ("(%5d) %s: transform_result->bytes_written: %u", ++ direct_gettid (), mme->name, transform_result->BytesWritten); ++ D_WARN ("(%5d) %s: result code: %d (%s)\n", direct_gettid (), ++ mme->name, transform_result->ErrorType, ++ get_png_error_string (transform_result->ErrorType)); ++ } ++ else if (CallbackData->CmdStatus.CmdId == data->SetGlobalCommand.CmdStatus.CmdId) ++ { ++ D_WARN ("(%5d) %s: size: %ux%u @ %ubpp\n", ++ direct_gettid (), mme->name, ++ global_transform_result->PictureWidth, ++ global_transform_result->PictureHeight, ++ global_transform_result->BitDepth); ++ D_WARN ("(%5d) %s: ColorType : %d (%s)\n", ++ direct_gettid (), mme->name, ++ global_transform_result->ColorType, ++ (global_transform_result->ColorType ++ < D_ARRAY_SIZE (color_types)) ++ ? color_types[global_transform_result->ColorType] ++ : "?" ); ++ D_WARN ("(%5d) %s: InterlaceType : %d (%s)\n", ++ direct_gettid (), mme->name, ++ global_transform_result->InterlaceType, ++ (global_transform_result->InterlaceType ++ < D_ARRAY_SIZE (interlace_types)) ++ ? interlace_types[global_transform_result->InterlaceType] ++ : "?"); ++ D_WARN ("(%5d) %s: CompressionType: %d\n", direct_gettid (), mme->name, global_transform_result->CompressionType); ++ D_WARN ("(%5d) %s: FilterMethod : %d\n", direct_gettid (), mme->name, global_transform_result->FilterMethod); ++ D_WARN ("(%5d) %s: ErrorType : %d (%s)\n", direct_gettid (), mme->name, global_transform_result->ErrorType, get_png_error_string (global_transform_result->ErrorType)); ++ ++ D_DEBUG_AT (HWPNG, " -> ColorFormatOutput: %d\n", global_transform_result->ColorFormatOutput); ++ D_DEBUG_AT (HWPNG, " -> ColorKey: %c\n", global_transform_result->HaveColorKey ? 'y' : 'n'); ++ if (global_transform_result->HaveColorKey) ++ D_DEBUG_AT (HWPNG, " -> ColorKey (xRGB): %.6x\n", global_transform_result->ColorKey); ++ D_DEBUG_AT (HWPNG, " -> pitch: %d\n", global_transform_result->pitch); ++ } ++ break; ++ } ++} ++ ++ ++/* warning: MME_AbortCommand() works only for the MME_TRANSFORM command; ++ individual buffers can be aborted, too, but MME_TermTransformer() will ++ not work afterwards anymore! */ ++static bool ++pending_fe_func (DirectHash *hash, ++ unsigned long key, ++ void *value, ++ void *ctx) ++{ ++ struct _MMECommon * const mme = ctx; ++ __attribute__((unused)) ++ IDirectFBImageProvider_PNG_data * const data = ++ container_of (mme, IDirectFBImageProvider_PNG_data, common); ++ MME_CommandId_t CmdId = key; ++ ++ D_DEBUG_AT (HWPNG, "aborting %s command %u (%.8x)\n", ++ ((CmdId == mme->TransformCommand.CmdStatus.CmdId) ++ ? "(main transform)" ++ : ((CmdId == data->SetGlobalCommand.CmdStatus.CmdId) ++ ? "(global)" ++ : "(buffer)" ++ ) ++ ), CmdId, CmdId); ++ ++ MME_ERROR res = MME_AbortCommand (mme->Handle, CmdId); ++ if (res != MME_SUCCESS) ++ { ++ /* this would mean the command is about to finish, but we didn't ++ notice yet... */ ++ D_WARN ("(%5d) MME_AbortCommand(%x, %.8x) for %s failed: %d (%s)\n", ++ direct_gettid (), mme->Handle, CmdId, ++ mme->name, res, get_mme_error_string (res)); ++ } ++ ++ /* continue iterating */ ++ return true; ++} ++ ++static DFBResult ++abort_transformer (struct _MMECommon * const mme) ++{ ++ if (!mme) ++ return DFB_THIZNULL; ++ ++ /* FIXME: what about locking? */ ++ direct_hash_iterate (mme->pending_commands, ++ pending_fe_func, ++ mme); ++ ++ return DFB_OK; ++} ++ ++ ++static DFBResult ++set_global_transform_params (IDirectFBImageProvider_PNG_data *data) ++{ ++ MME_ERROR ret; ++ ++ data->SetGlobalCommand.StructSize = sizeof (MME_Command_t); ++ data->SetGlobalCommand.CmdCode = MME_SET_GLOBAL_TRANSFORM_PARAMS; ++ data->SetGlobalCommand.CmdEnd = MME_COMMAND_END_RETURN_NOTIFY; ++ data->SetGlobalCommand.DueTime = (MME_Time_t) 0; ++ data->SetGlobalCommand.NumberInputBuffers = 0; ++ data->SetGlobalCommand.NumberOutputBuffers = 0; ++ data->SetGlobalCommand.DataBuffers_p = NULL; ++ ++ /* clear the commandstatus from the previous run */ ++ memset (&( data->SetGlobalCommand.CmdStatus), 0, sizeof (MME_CommandStatus_t)); ++ ++ data->SetGlobalCommand.CmdStatus.AdditionalInfoSize = sizeof (PNGDecode_GlobalTransformReturnParams_t); ++ data->SetGlobalCommand.CmdStatus.AdditionalInfo_p = &data->GlobalReturnParams; ++ ++ data->SetGlobalCommand.NumberInputBuffers = 0; ++ data->SetGlobalCommand.NumberOutputBuffers = 0; ++ ++ /* set parameters - just settings flags to 0 should make this compatible ++ with old transformer versions, 0 means PNGDECODE_OF_EXPAND */ ++// data->GlobalParams.flags = PNGDECODE_PARAM_FORMAT; ++// data->GlobalParams.format = PNGDECODE_OF_EXPAND; ++// data->SetGlobalCommand.ParamSize = sizeof (PNGDecode_GlobalParams_t); ++// data->SetGlobalCommand.Param_p = &data->GlobalParams; ++ data->SetGlobalCommand.ParamSize = 0; ++ data->SetGlobalCommand.Param_p = NULL; ++ ++ D_DEBUG_AT (HWPNG, "sending global command\n"); ++ ++ pthread_mutex_lock (&data->common.pending_commands_lock); ++ ret = MME_SendCommand (data->common.Handle, &data->SetGlobalCommand); ++ if (ret != MME_SUCCESS) ++ { ++ pthread_mutex_unlock (&data->common.pending_commands_lock); ++ D_INFO ("%s: MME_SendCommand() failed: %d (%s)\n", ++ data->common.name, ret, get_mme_error_string (ret)); ++ return DFB_FAILURE; ++ } ++ ++ direct_hash_insert (data->common.pending_commands, ++ data->SetGlobalCommand.CmdStatus.CmdId, ++ (void *) 1); ++ D_DEBUG_AT (HWPNG, "sent packet's CmdId is %u (%.8x)\n", ++ data->SetGlobalCommand.CmdStatus.CmdId, ++ data->SetGlobalCommand.CmdStatus.CmdId); ++ pthread_mutex_unlock (&data->common.pending_commands_lock); ++ ++ return DFB_OK; ++} ++ ++ ++static void ++_imageprovider_update_transform_params (struct _MMECommon * const mme, ++ void * const params, ++ const CoreSurfaceBufferLock * const lock) ++{ ++ IDirectFBImageProvider_PNG_data * const data = ++ container_of (mme, IDirectFBImageProvider_PNG_data, common); ++ ++ if (data->GlobalReturnParams.pitch != lock->pitch) ++ { ++ PNGDecode_TransformParams_t * const p = params; ++ ++ p->flags |= PNGDECODE_PARAM_PITCH; ++ p->pitch = lock->pitch; ++ } ++} ++ ++ ++#define HWREND_THRESHOLD 20000 ++ ++static pthread_mutex_t transformer_index_mutex = PTHREAD_MUTEX_INITIALIZER; ++static unsigned int transformer_index; ++static DFBResult ++PNG_HardwareRenderTo( IDirectFBImageProvider_PNG_data *data, ++ CoreSurface *dst_surface, ++ DFBSurfacePixelFormat format, ++ DFBRectangle *rect, ++ const DFBRegion *clip ) ++{ ++ DFBResult dfbret = dfbret; ++ CoreSurfaceBufferLock lock; ++ unsigned int bufpos = 0; ++ ++ D_ASSERT( data != NULL ); ++ D_ASSERT( dst_surface != NULL); ++ D_ASSERT( rect != NULL ); ++ D_ASSERT( clip != NULL ); ++ ++ /* FIXME: check if the image is big enough to warrant a HW decode */ ++ if ((dst_surface->config.size.w * dst_surface->config.size.h) < HWREND_THRESHOLD) ++ return DFB_UNSUPPORTED; ++ ++ /* only decode if we haven't decoded before */ ++ if (data->common.decode_success <= 0) ++ { ++ MME_TransformerCapability_t cap; ++ bool surface_locked = false; ++ ++ data->common.name = "hwPNG"; ++ static const char *transformers0[] = { PNGDECODER_MME_TRANSFORMER_NAME"0", NULL }; ++ static const char *transformers1[] = { PNGDECODER_MME_TRANSFORMER_NAME"1", NULL }; ++ static const char *transformers2[] = { PNGDECODER_MME_TRANSFORMER_NAME"2", NULL }; ++ static const char *transformers3[] = { PNGDECODER_MME_TRANSFORMER_NAME"3", NULL }; ++ static const char *transformers4[] = { PNGDECODER_MME_TRANSFORMER_NAME"4", NULL }; ++ static const char *transformers5[] = { PNGDECODER_MME_TRANSFORMER_NAME, NULL }; ++ static const char **transformers[] = { transformers0, transformers1, ++ transformers2, transformers3, ++ transformers4, transformers5 }; ++ ++ unsigned i; ++ transformer_index = -1; ++ pthread_mutex_lock (&transformer_index_mutex); ++ for (i = 0; i < D_ARRAY_SIZE (transformers); ++i) ++ { ++ ++transformer_index; ++ transformer_index %= D_ARRAY_SIZE (transformers); ++ ++ PNGDecode_InitTransformerParams_t png_init; ++ png_init.flags = PNGDECODE_PARAM_FORMAT; ++ png_init.format = PNGDECODE_OF_EXPAND; ++ dfbret = mme_helper_init_transformer (&data->common, ++ transformers[transformer_index], ++ sizeof (png_init), ++ &png_init, NULL); ++ if (dfbret == DFB_OK) ++ { ++ /* need to init this because old transformer versions didn't ++ touch it at all. */ ++ cap.Version = 0; ++ _mme_helper_get_capability (&data->common, ++ *transformers[transformer_index], ++ &cap); ++ ++ if (cap.Version != 11) ++ { ++ /* incompatible with old transformer, it has just way too ++ many bugs! */ ++ mme_helper_deinit_transformer (&data->common); ++ dfbret = DFB_FAILURE; ++ continue; ++ } ++ ++ data->common.transformer_name = *transformers[transformer_index]; ++ if (data->flags & DIRENDER_BACKGROUND) ++ direct_thread_set_name (*transformers[transformer_index]); ++ ++ break; ++ } ++ } ++ pthread_mutex_unlock (&transformer_index_mutex); ++ ++ if (dfbret != DFB_OK) ++ return dfbret; ++ ++ sema_init_event (&data->common.decode_event, 0); /* Alerts to completion */ ++ sema_init_event (&data->global_event, 0); ++ ++ { ++ /* store the current data buffer position for software fallback should ++ we not succeed */ ++ data->common.base.buffer->GetPosition (data->common.base.buffer, ++ &bufpos); ++ ++ /* as an optimization we first send one packet, otherwise ++ SET_GLOBAL_TRANSFORM_COMMAND would through a data underflow event */ ++ mme_helper_calculate_packets (&data->common); ++ dfbret = mme_helper_send_packets (&data->common, 1); ++ if (dfbret != DFB_OK) ++ goto err_abort_commands; ++ ++ dfbret = set_global_transform_params (data); ++ if (dfbret != DFB_OK) ++ goto err_abort_commands; ++ ++ D_DEBUG_AT (HWPNG, " -> waiting for global transform to finish\n"); ++ while ((sema_wait_event (&data->global_event) == -1) ++ && errno == EINTR) ++ ; ++ D_DEBUG_AT (HWPNG, " -> global transform finished (failed: %c)\n", ++ (data->common.decode_success != 0) ? 'y' : 'n'); ++ ++ /* the transformer encountered an error */ ++ if (data->common.decode_success != 0) ++ { ++ dfbret = DFB_FAILURE; ++ goto err_abort_commands; ++ } ++ ++ if (!data->common.decode_surface) ++ { ++ /* create a destination surface to MME-decode the image onto before ++ stretchblit ... and if we can't create a surface in video ++ memory then we can't blit */ ++ CoreSurfaceConfig config; ++ CorePalette *palette = NULL; ++ ++ switch (data->GlobalReturnParams.ColorFormatOutput) ++ { ++ case PNGDECODE_COLOR_TYPE_PALETTE: ++ config.format = DSPF_LUT8; ++ ++ dfbret = dfb_palette_create (data->common.base.core, ++ 256, &palette); ++ if (dfbret != DFB_OK) ++ goto err_abort_commands; ++ ++ direct_memcpy (palette->entries, ++ data->GlobalReturnParams.palette, ++ 256 * sizeof (DFBColor)); ++ dfb_palette_update (palette, 0, 256 - 1); ++ break; ++ ++ case PNGDECODE_COLOR_TYPE_RGB: ++ config.format = DSPF_RGB24; ++ break; ++ ++ case PNGDECODE_COLOR_TYPE_RGB_ALPHA: ++ default: ++ config.format = DSPF_ARGB; ++ break; ++ } ++ config.flags = CSCONF_SIZE | CSCONF_FORMAT | CSCONF_CAPS; ++ config.size.w = data->common.width; ++ config.size.h = data->common.height; ++ config.caps = DSCAPS_VIDEOONLY; ++ #ifdef DIRECT_BUILD_DEBUG ++ config.caps |= DSCAPS_SHARED; ++ #endif ++ ++ dfbret = dfb_surface_create (data->common.base.core, &config, ++ CSTF_NONE, 0, palette, ++ &data->common.decode_surface); ++ if (palette) ++ dfb_palette_unref (palette); ++ ++ if (dfbret != DFB_OK) ++ goto err_abort_commands; ++ } ++ ++ /* tell the transformer what to do and where to put the result */ ++ data->TransformParams.flags = 0; ++ dfbret = mme_helper_start_transformer (&data->common, ++ sizeof (data->ReturnParams), ++ &data->ReturnParams, ++ sizeof (data->TransformParams), ++ &data->TransformParams, ++ data->common.decode_surface, ++ &lock); ++ if (dfbret != DFB_OK) ++ { ++ D_DEBUG_AT (HWPNG, "couldn't start transformer\n"); ++ goto err_abort_commands; ++ } ++ ++ surface_locked = true; ++ ++ /* Now send the rest of the data */ ++ D_DEBUG_AT (HWPNG, "Transform sent, sending data buffers now\n"); ++ dfbret = mme_helper_send_packets (&data->common, -1); ++ if (dfbret != DFB_OK) ++ { ++ D_DEBUG_AT (HWPNG, "couldn't send all buffers\n"); ++ goto err_abort_commands; ++ } ++ ++ /* wait until the decode is complete */ ++ D_DEBUG_AT (HWPNG, "waiting for completion\n"); ++ while ((sema_wait_event (&data->common.decode_event) == -1) ++ && errno == EINTR) ++ ; ++ /* the transformer encountered an error */ ++ if (data->common.decode_success != 1) ++ { ++ dfbret = DFB_FAILURE; ++ goto err_abort_commands; ++ } ++ } ++ ++err_abort_commands: ++ { ++ /* we need to do this explicitly here because the generic code will ++ not call abort_transformer() if no TransformCommand is pending. ++ Unfortunately in the PNG case, we always send a buffer before the ++ transform command. This buffer would otherwise not be aborted. ++ Should probably change the code to be more in line with JPEG. */ ++ abort_transformer (&data->common); ++ /* wait till all commands are aborted and acknowledged */ ++ while (data->common.n_pending_buffers ++ || direct_hash_lookup (data->common.pending_commands, ++ data->common.TransformCommand.CmdStatus.CmdId)) ++ usleep (1); ++ ++ if (surface_locked) ++ { ++ mme_helper_deinit_transformer (&data->common); ++ ++ dfb_surface_unlock_buffer (data->common.decode_surface, &lock); ++ } ++ ++ ++ if (data->common.OutDataBuffers) ++ { ++ D_FREE (data->common.OutDataBuffers); ++ data->common.OutDataBuffers = NULL; ++ } ++ ++ unsigned int i; ++ for (i = 0; i < D_ARRAY_SIZE (data->common.SendDataBuffers); ++i) ++ { ++ if (data->common.SendDataBuffers[i].buffer) ++ { ++ MME_FreeDataBuffer (data->common.SendDataBuffers[i].buffer); ++ data->common.SendDataBuffers[i].buffer = NULL; ++ ++ sema_close_event (&data->common.SendDataBuffers[i].sema); ++ } ++ } ++ ++ sema_close_event (&data->common.decode_event); ++ sema_close_event (&data->global_event); ++ ++ if (data->common.decode_success != 1) ++ { ++ /* if we saw corrupt data, there's no point in trying libpng, just ++ display the result as far as possible. */ ++ if (data->common.TransformCommand.CmdStatus.State == MME_COMMAND_FAILED ++ && data->common.TransformCommand.CmdStatus.Error == MME_INVALID_ARGUMENT) ++ { ++ const PNGDecode_TransformReturnParams_t * __restrict r = ++ &data->ReturnParams; ++ ++ switch (r->ErrorType) ++ { ++ case PNGDECODE_CRC_ERROR: ++ case PNGDECODE_INVALID_STREAM: ++ case PNGDECODE_STREAM_ERROR: ++ /* just assume invalid data and display what we have */ ++ D_DEBUG_AT (HWPNG, "faking success due to corrupt data\n"); ++ data->common.decode_success = 1; ++ ++ default: ++ break; ++ } ++ } ++ else if (dfbret == DFB_IO) ++ { ++ D_DEBUG_AT (HWPNG, "faking success due to EOF\n"); ++ dfbret = DFB_OK; ++ data->common.decode_success = 1; ++ } ++ ++ if (data->common.decode_success != 1) ++ data->common.base.buffer->SeekTo (data->common.base.buffer, ++ bufpos); ++ } ++ } ++ } ++ ++ ++ if (data->common.decode_success == 1) ++ { ++ /* stretch blit the decoded image to the destination surface and size */ ++ mme_helper_stretch_blit (&data->common, data->common.decode_surface, ++ dst_surface, rect); ++ dfbret = DFB_OK; ++ ++ if (data->GlobalReturnParams.HaveColorKey) ++ { ++ data->color_keyed = true; ++ data->color_key = data->GlobalReturnParams.ColorKey; ++ } ++ } ++ ++ return dfbret; ++} ++#endif /* PNG_PROVIDER_USE_MME */ +diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.h b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.h +new file mode 100644 +index 0000000..510a64d +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.h +@@ -0,0 +1,83 @@ ++#ifndef __IDIRECTFBIMAGEPROVIDER_PNG_H__ ++#define __IDIRECTFBIMAGEPROVIDER_PNG_H__ ++ ++#if defined(PNG_PROVIDER_USE_MME) ++/* HW Decode Requirements */ ++#include ++#include ++ ++#define PNGDEC_MME_VERSION 11 ++#define PNGDECODE_PROFILING_ENABLE ++#include ++#endif /* PNG_PROVIDER_USE_MME */ ++ ++ ++/* private data struct of IDirectFBImageProvider_PNG */ ++typedef struct ++{ ++ struct _MMECommon common; ++ ++ int stage; ++ int rows; ++ ++ png_structp png_ptr; ++ png_infop info_ptr; ++ ++ int bpp; ++ int color_type; ++ png_uint_32 color_key; ++ bool color_keyed; ++ ++ int pitch; ++ u32 palette[256]; ++ DFBColor colors[256]; ++ ++ DFBRectangle rect; ++ DFBRegion clip; ++ ++ /* thread stuff */ ++ DIRenderFlags flags; ++ pthread_mutex_t lock; ++ pthread_cond_t cond; ++ DirectThread *thread; ++ IDirectFBSurface *destination; ++ DFBResult thread_res; ++ ++#if defined(PNG_PROVIDER_USE_MME) ++ PNGDecode_TransformParams_t TransformParams; ++ PNGDecode_TransformReturnParams_t ReturnParams; ++ ++ PNGDecode_GlobalTransformReturnParams_t GlobalReturnParams; ++ ++ MME_Command_t SetGlobalCommand; ++ ++ sem_t global_event; ++#endif /* PNG_PROVIDER_USE_MME */ ++} IDirectFBImageProvider_PNG_data; ++ ++ ++ ++#if defined(PNG_PROVIDER_USE_MME) ++/****************************************************************************/ ++static inline const char * ++get_png_error_string (PNGDecode_ErrorCodes_t e) ++{ ++ static const char *PNGErrorType_strings[] = { ++ "PNGDECODE_NO_ERROR", ++ "PNGDECODE_MEMEORY_ALLOCATION_ERROR", ++ "PNGDECODE_CRC_ERROR", ++ "PNGDECODE_INVALID_STREAM", ++ "PNGDECODE_INTERNAL_ERROR", ++ "PNGDECODE_INVALID_ARGUMENT", ++ "PNGDECODE_STREAM_ERROR" ++ }; ++ ++ return (((unsigned int) e) < D_ARRAY_SIZE (PNGErrorType_strings)) ++ ? PNGErrorType_strings[e] ++ : "* Unknown PngError code *"; ++} ++#endif /* PNG_PROVIDER_USE_MME */ ++ ++ ++ ++#endif /* __IDIRECTFBIMAGEPROVIDER_PNG_H__ */ +diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_tiff.c b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_tiff.c +new file mode 100644 +index 0000000..b67d851 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_tiff.c +@@ -0,0 +1,469 @@ ++/* ++ Copyright (c) 2013 Haithem Rahmani ++based on code: ++ (c) Copyright 2001-2013 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by Haithem Rahmani ++ Based on code by: ++ Andre' Draszik , ++ Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, 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 "config.h" ++ ++static DFBResult ++Probe( IDirectFBImageProvider_ProbeContext *ctx ); ++ ++static DFBResult ++Construct( IDirectFBImageProvider *thiz, ++ ... ); ++ ++#include ++ ++DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, TIFF ) ++ ++ ++/* ++ * private data struct of IDirectFBImageProvider_TIFF ++ */ ++typedef struct { ++ IDirectFBImageProvider_data base; ++ ++ TIFF *tiff; ++ ++ int image_width; ++ int image_height; ++ ++ CoreSurface *decode_surface; ++ CoreGraphicsSerial *serial; ++ ++ DIRenderCallback render_callback; ++ void *render_callback_ctx; ++ ++} IDirectFBImageProvider_TIFF_data; ++ ++/* ++ * custom I/O functions to access TIFF Handle ++ */ ++static tsize_t ++_readTIFF( thandle_t, tdata_t, tsize_t ); ++ ++static tsize_t ++_writeTIFF( thandle_t, tdata_t, tsize_t ); ++ ++static toff_t ++_seekTIFF(thandle_t, toff_t, int); ++static int ++_closeTIFF(thandle_t); ++ ++static toff_t ++_sizeTIFF(thandle_t); ++ ++static int ++_mapdataTIFF(thandle_t, tdata_t*, toff_t*); ++ ++static void ++_unmapdataTIFF(thandle_t, tdata_t, toff_t); ++ ++static DirectResult ++IDirectFBImageProvider_TIFF_AddRef ( IDirectFBImageProvider *thiz ); ++ ++static DirectResult ++IDirectFBImageProvider_TIFF_Release ( IDirectFBImageProvider *thiz ); ++ ++static DFBResult ++IDirectFBImageProvider_TIFF_RenderTo( IDirectFBImageProvider *thiz, ++ IDirectFBSurface *destination, ++ const DFBRectangle *destination_rect ); ++ ++static DFBResult ++IDirectFBImageProvider_TIFF_SetRenderCallback( IDirectFBImageProvider *thiz, ++ DIRenderCallback callback, ++ void *context ); ++ ++static DFBResult ++IDirectFBImageProvider_TIFF_GetSurfaceDescription( IDirectFBImageProvider *thiz, ++ DFBSurfaceDescription *dsc ); ++ ++static DFBResult ++IDirectFBImageProvider_TIFF_GetImageDescription( IDirectFBImageProvider *thiz, ++ DFBImageDescription *dsc ); ++ ++ ++/**********************************************************************************************************************/ ++ ++static DFBResult ++Probe( IDirectFBImageProvider_ProbeContext *ctx ) ++{ ++ unsigned short tiff_magic = (ctx->header[0] | (ctx->header[1] << 8)); ++ ++ if ((tiff_magic != TIFF_BIGENDIAN) && ++ (tiff_magic != TIFF_LITTLEENDIAN) && ++ (tiff_magic != MDI_LITTLEENDIAN)) ++ { ++ return DFB_UNSUPPORTED; ++ } ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++Construct( IDirectFBImageProvider *thiz, ++ ... ) ++{ ++ IDirectFBDataBuffer *buffer; ++ CoreDFB *core; ++ va_list tag; ++ ++ DIRECT_ALLOCATE_INTERFACE_DATA(thiz, IDirectFBImageProvider_TIFF) ++ ++ va_start( tag, thiz ); ++ buffer = va_arg( tag, IDirectFBDataBuffer * ); ++ core = va_arg( tag, CoreDFB * ); ++ va_end( tag ); ++ ++ data->base.ref = 1; ++ data->base.buffer = buffer; ++ data->base.core = core; ++ ++ buffer->AddRef( buffer ); ++ ++ data->tiff = TIFFClientOpen( "TIFF", "rM", (thandle_t)data, _readTIFF, ++ _writeTIFF, _seekTIFF, _closeTIFF, ++ _sizeTIFF, _mapdataTIFF, _unmapdataTIFF ); ++ ++ TIFFGetField( data->tiff, TIFFTAG_IMAGEWIDTH, &data->image_width ); ++ TIFFGetField( data->tiff, TIFFTAG_IMAGELENGTH, &data->image_height ); ++ if (!data->tiff) ++ { ++ buffer->Release( buffer ); ++ data->base.buffer = NULL; ++ DIRECT_DEALLOCATE_INTERFACE( thiz ); ++ return DFB_FAILURE; ++ } ++ ++ thiz->AddRef = IDirectFBImageProvider_TIFF_AddRef; ++ thiz->Release = IDirectFBImageProvider_TIFF_Release; ++ thiz->RenderTo = IDirectFBImageProvider_TIFF_RenderTo; ++ thiz->SetRenderCallback = IDirectFBImageProvider_TIFF_SetRenderCallback; ++ thiz->GetImageDescription = IDirectFBImageProvider_TIFF_GetImageDescription; ++ thiz->GetSurfaceDescription = IDirectFBImageProvider_TIFF_GetSurfaceDescription; ++ ++ return DFB_OK; ++} ++ ++/**********************************************************************************************************************/ ++ ++static void ++IDirectFBImageProvider_TIFF_Destruct( IDirectFBImageProvider *thiz ) ++{ ++ IDirectFBImageProvider_TIFF_data *data = ++ (IDirectFBImageProvider_TIFF_data*)thiz->priv; ++ ++ if (data->decode_surface) { ++ dfb_gfxcard_wait_serial( data->serial ); ++ dfb_surface_unref( data->decode_surface ); ++ } ++ ++ if (data->base.buffer) ++ data->base.buffer->Release( data->base.buffer ); ++ ++ DIRECT_DEALLOCATE_INTERFACE( thiz ); ++} ++ ++static DirectResult ++IDirectFBImageProvider_TIFF_AddRef( IDirectFBImageProvider *thiz ) ++{ ++ DIRECT_INTERFACE_GET_DATA (IDirectFBImageProvider_TIFF) ++ data->base.ref++; ++ ++ return DFB_OK; ++} ++ ++static DirectResult ++IDirectFBImageProvider_TIFF_Release( IDirectFBImageProvider *thiz ) ++{ ++ DIRECT_INTERFACE_GET_DATA( IDirectFBImageProvider_TIFF ) ++ ++ if (--data->base.ref == 0) { ++ IDirectFBImageProvider_TIFF_Destruct( thiz ); ++ } ++ ++ return DFB_OK; ++} ++ ++/**********************************************************************************************************************/ ++ ++static DFBResult ++IDirectFBImageProvider_TIFF_RenderTo( IDirectFBImageProvider *thiz, ++ IDirectFBSurface *destination, ++ const DFBRectangle *dest_rect ) ++{ ++ DFBResult ret; ++ DFBRegion clip; ++ ++ IDirectFBSurface_data *dst_data; ++ ++ CoreSurface *dst_surface; ++ CardState state; ++ ++ CoreSurfaceBufferLock lock; ++ ++ DFBRectangle rect; ++ DFBRectangle src_rect; ++ ++ DIRECT_INTERFACE_GET_DATA (IDirectFBImageProvider_TIFF) ++ ++ dst_data = (IDirectFBSurface_data*) destination->priv; ++ if (!dst_data) ++ return DFB_DEAD; ++ ++ dst_surface = dst_data->surface; ++ if (!dst_surface) ++ return DFB_DESTROYED; ++ ++ dfb_region_from_rectangle( &clip, &dst_data->area.current ); ++ ++ if (dest_rect) { ++ if (dest_rect->w < 1 || dest_rect->h < 1) ++ return DFB_INVARG; ++ rect = *dest_rect; ++ rect.x += dst_data->area.wanted.x; ++ rect.y += dst_data->area.wanted.y; ++ } ++ else { ++ rect = dst_data->area.wanted; ++ } ++ ++ if (!dfb_rectangle_region_intersects( &rect, &clip )) ++ return DFB_OK; ++ ++ ret = dfb_surface_create_simple( data->base.core, data->image_width, data->image_height, DSPF_ARGB, ++ DSCS_RGB, DSCAPS_NONE, CSTF_NONE, ++ 0, NULL, &data->decode_surface ); ++ ++ ret = dfb_surface_lock_buffer( data->decode_surface, CSBR_BACK, CSAID_CPU, CSAF_WRITE, &lock ); ++ if (ret) { ++ D_PERROR( "Failed to create decode surface\n" ); ++ goto error; ++ } ++ ++ TIFFReadRGBAImageOriented( data->tiff, data->image_width, data->image_height, ++ (uint32 *)(lock.addr), ORIENTATION_TOPLEFT, 0 ); ++ ++ dfb_surface_unlock_buffer( data->decode_surface, &lock ); ++ ++ dfb_state_init( &state, data->base.core ); ++ ++ state.modified |= SMF_CLIP; ++ ++ state.clip = DFB_REGION_INIT_FROM_RECTANGLE_VALS( rect.x, rect.y, rect.w, rect.h ); ++ src_rect = (DFBRectangle){0, 0, data->image_width, data->image_height}; ++ ++ dfb_state_set_source( &state, data->decode_surface ); ++ dfb_state_set_destination( &state, dst_surface ); ++ ++ dfb_gfxcard_batchstretchblit( &src_rect, &rect, 1, &state ); ++ ++ data->serial = &state.serial; ++ ++ dfb_gfxcard_wait_serial( &data->serial ); ++ dfb_surface_unref( data->decode_surface ); ++ data->decode_surface = NULL; ++ ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, NULL ); ++ ++ dfb_state_destroy( &state ); ++ ++ if (data->render_callback) { ++ DIRenderCallbackResult r; ++ ++ rect.x = 0; ++ rect.y = 0; ++ rect.w = data->image_width; ++ rect.h = data->image_height; ++ ++ r = data->render_callback( &rect, data->render_callback_ctx ); ++ ++ if (r != DIRCR_OK) ++ return DFB_INTERRUPTED; ++ } ++ ++ return DFB_OK; ++ ++error: ++ dfb_surface_unref( data->decode_surface ); ++ return ret; ++} ++ ++static DFBResult ++IDirectFBImageProvider_TIFF_SetRenderCallback( IDirectFBImageProvider *thiz, ++ DIRenderCallback callback, ++ void *context ) ++{ ++ DIRECT_INTERFACE_GET_DATA( IDirectFBImageProvider_TIFF ) ++ ++ data->render_callback = callback; ++ data->render_callback_ctx = context; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++IDirectFBImageProvider_TIFF_GetSurfaceDescription( IDirectFBImageProvider *thiz, ++ DFBSurfaceDescription *dsc ) ++{ ++ DIRECT_INTERFACE_GET_DATA( IDirectFBImageProvider_TIFF ) ++ ++ dsc->flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; ++ dsc->width = data->image_width; ++ dsc->height = data->image_height; ++ dsc->pixelformat = DSPF_ARGB; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++IDirectFBImageProvider_TIFF_GetImageDescription( IDirectFBImageProvider *thiz, ++ DFBImageDescription *dsc ) ++{ ++ DIRECT_INTERFACE_GET_DATA( IDirectFBImageProvider_TIFF ) ++ ++ dsc->caps = DICAPS_NONE; ++ ++ return DFB_OK; ++} ++ ++static tsize_t ++_readTIFF(thandle_t handle, tdata_t data, tsize_t size) ++{ ++ unsigned int ret_size; ++ ++ IDirectFBImageProvider_TIFF_data *priv = (IDirectFBImageProvider_TIFF_data*)handle; ++ priv->base.buffer->GetData( priv->base.buffer, size, data, &ret_size ); ++ ++ return (tsize_t)ret_size; ++} ++ ++static tsize_t ++_writeTIFF( thandle_t handle, tdata_t data, tsize_t size ) ++{ ++ return -1; ++} ++static toff_t ++_seekTIFF( thandle_t handle, toff_t offset, int whence ) ++{ ++ unsigned int off; ++ ++ IDirectFBImageProvider_TIFF_data *data = (IDirectFBImageProvider_TIFF_data*)handle; ++ ++ switch (whence) ++ { ++ case SEEK_SET: ++ off = offset; ++ break; ++ case SEEK_CUR: ++ data->base.buffer->GetPosition( data->base.buffer, &off ); ++ off += offset; ++ break; ++ case SEEK_END: ++ data->base.buffer->GetLength( data->base.buffer, &off ); ++ off += offset; ++ break; ++ default: ++ break; ++ } ++ ++ data->base.buffer->SeekTo( data->base.buffer, off ); ++ ++ return (tsize_t)off; ++} ++ ++static int ++_closeTIFF( thandle_t handle ) ++{ ++ return 0; ++} ++ ++static toff_t ++_sizeTIFF( thandle_t handle ) ++{ ++ unsigned int length; ++ ++ IDirectFBImageProvider_TIFF_data *data = (IDirectFBImageProvider_TIFF_data*)handle; ++ ++ data->base.buffer->GetLength( data->base.buffer, &length ); ++ ++ return (toff_t)length; ++} ++ ++static int ++_mapdataTIFF(thandle_t handle, tdata_t* data, toff_t* offset) ++{ ++ return 0; ++} ++ ++static void ++_unmapdataTIFF( thandle_t handle, tdata_t data, toff_t offset ) ++{ ++} +diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_webp.c b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_webp.c +new file mode 100644 +index 0000000..fdce208 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_webp.c +@@ -0,0 +1,390 @@ ++/* ++ Copyright (c) 2013 Haithem Rahmani ++based on code: ++ (c) Copyright 2001-2013 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by Haithem Rahmani ++ Based on code by: ++ Andre' Draszik , ++ Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++ ++D_DEBUG_DOMAIN( imageProviderWebP, "ImageProvider/WebP", "libWebP based image decoder" ); ++ ++static DFBResult Probe( IDirectFBImageProvider_ProbeContext *ctx ); ++ ++static DFBResult Construct( IDirectFBImageProvider *thiz, ++ ... ); ++ ++#include ++ ++DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBImageProvider, WebP ) ++ ++typedef struct { ++ IDirectFBImageProvider_data base; ++ ++ WebPDecoderConfig config; /* WebP decoder config to intialize before starting the decoding */ ++ ++ int width; /* image width */ ++ int height; /* image height */ ++ DFBSurfacePixelFormat pixelformat; /* image pixelformat DSPF_ARGB or DFB_RGB24 */ ++ uint32_t image_size; /* image data size */ ++ ++ CoreSurface *decode_surface; /* surface containing the decoded image*/ ++ CoreGraphicsSerial *serial; ++} IDirectFBImageProvider_WebP_data; ++ ++static void ++IDirectFBImageProvider_WebP_Destruct( IDirectFBImageProvider *thiz ) ++{ ++ IDirectFBImageProvider_WebP_data *data = thiz->priv; ++ ++ if (data->decode_surface) { ++ dfb_gfxcard_wait_serial( data->serial ); ++ dfb_surface_unref( data->decode_surface ); ++ } ++ ++ if (data->base.buffer) ++ data->base.buffer->Release( data->base.buffer ); ++} ++ ++static DFBResult ++WebP_decode_image( IDirectFBImageProvider_WebP_data *data, ++ CoreSurfaceBufferLock *lock ) ++{ ++ VP8StatusCode status; ++ DFBResult ret; ++ ++ uint32_t read_size; ++ u8 image[data->image_size]; ++ ++ WebPIDecoder* WebP_dec; ++ IDirectFBDataBuffer *buffer = data->base.buffer; ++ ++ WebP_dec = WebPINewDecoder( &data->config.output ); ++ ++ data->config.output.colorspace = (data->pixelformat == DSPF_ARGB) ? MODE_bgrA : MODE_BGR; ++ ++ data->config.output.u.RGBA.rgba = (uint8_t*)lock->addr; ++ data->config.output.u.RGBA.stride = lock->pitch; ++ data->config.output.u.RGBA.size = lock->pitch * data->height; ++ ++ data->config.output.is_external_memory = 1; ++ ++ ret = DFB_OK; ++ buffer->SeekTo( buffer, 0 ); ++ ++ while (ret != DFB_EOF && buffer->HasData( buffer ) == DFB_OK) { ++ ret = buffer->GetData( buffer, data->image_size, image, &read_size ); ++ ++ status = WebPIAppend( WebP_dec, image, read_size ); ++ if (!(status == VP8_STATUS_OK || status == VP8_STATUS_SUSPENDED)) ++ break; ++ } ++ ++ WebPIDelete( WebP_dec ); ++ ++ return (status == VP8_STATUS_OK) ? DFB_OK : DFB_FAILURE; ++} ++ ++static DFBResult ++IDirectFBImageProvider_WebP_RenderTo( IDirectFBImageProvider *thiz, ++ IDirectFBSurface *destination, ++ const DFBRectangle *dest_rect ) ++{ ++ DFBResult ret; ++ ++ DFBRegion clip; ++ CoreSurface *dst_surface; ++ CardState state; ++ ++ CoreSurfaceBufferLock lock; ++ ++ IDirectFBSurface_data *dst_data; ++ DIRenderCallbackResult cb_result = DIRCR_OK; ++ ++ DFBRectangle src_rect; ++ DFBRectangle rect; ++ ++ DIRECT_INTERFACE_GET_DATA( IDirectFBImageProvider_WebP ) ++ ++ if (!destination) ++ return DFB_INVARG; ++ ++ dst_data = destination->priv; ++ if (!dst_data || !dst_data->surface) ++ return DFB_DESTROYED; ++ ++ dst_surface = dst_data->surface; ++ ++ if (dest_rect) { ++ if (dest_rect->w < 1 || dest_rect->h < 1) ++ return DFB_INVARG; ++ ++ rect = *dest_rect; ++ rect.x += dst_data->area.wanted.x; ++ rect.y += dst_data->area.wanted.y; ++ } ++ else { ++ rect = dst_data->area.wanted; ++ } ++ ++ dfb_region_from_rectangle( &clip, &dst_data->area.current ); ++ if (!dfb_rectangle_region_intersects( &rect, &clip )) ++ return DFB_OK; ++ ++ ++ ret = dfb_surface_create_simple( data->base.core, data->width, data->height, data->pixelformat, ++ DSCS_RGB, DSCAPS_NONE, CSTF_NONE, ++ 0, NULL, &data->decode_surface ); ++ if (ret) { ++ D_ERROR( "Failed to create surface : '%s'\n", DirectResultString(ret) ); ++ goto error; ++ } ++ ++ ret = dfb_surface_lock_buffer( data->decode_surface, CSBR_BACK, CSAID_CPU, CSAF_WRITE, &lock ); ++ if (ret) { ++ D_ERROR( "Failed to lock the surface : '%s'\n", DirectResultString(ret) ); ++ goto error; ++ } ++ ++ ret = WebP_decode_image( data, &lock ); ++ if (ret) { ++ D_ERROR( "Failed to decode the image : '%s'\n", DirectResultString(ret) ); ++ goto error; ++ } ++ ++ dfb_surface_unlock_buffer( data->decode_surface, &lock ); ++ ++ dfb_state_init( &state, data->base.core ); ++ ++ state.modified |= SMF_CLIP; ++ ++ state.clip = DFB_REGION_INIT_FROM_RECTANGLE_VALS( rect.x, rect.y, rect.w, rect.h ); ++ src_rect = (DFBRectangle){0, 0, data->width, data->height}; ++ ++ dfb_state_set_source( &state, data->decode_surface ); ++ dfb_state_set_destination( &state, dst_surface ); ++ ++ dfb_gfxcard_stretchblit( &src_rect, &rect, &state ); ++ ++ data->serial = &state.serial; ++ ++ dfb_gfxcard_wait_serial( data->serial ); ++ dfb_surface_unref( data->decode_surface ); ++ ++ dfb_state_set_source(&state, NULL); ++ dfb_state_set_destination(&state, NULL); ++ ++ dfb_state_destroy(&state); ++ ++ if (data->base.render_callback) { ++ DFBRectangle r = { 0, 0, data->width, data->height }; ++ cb_result=data->base.render_callback( &r, data->base.render_callback_context ); ++ } ++ ++ return DFB_OK; ++ ++error: ++ if (data->decode_surface && lock.pitch) ++ dfb_surface_unlock_buffer( data->decode_surface, &lock ); ++ ++ dfb_surface_unref( data->decode_surface ); ++ ++ return ret; ++} ++ ++static DFBResult ++IDirectFBImageProvider_WebP_SetRenderCallback( IDirectFBImageProvider *thiz, ++ DIRenderCallback callback, ++ void *ctx ) ++{ ++ DIRECT_INTERFACE_GET_DATA( IDirectFBImageProvider_WebP ) ++ ++ data->base.render_callback = callback; ++ data->base.render_callback_context = ctx; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++IDirectFBImageProvider_WebP_GetImageDescription( IDirectFBImageProvider *thiz, ++ DFBImageDescription *desc ) ++{ ++ DIRECT_INTERFACE_GET_DATA( IDirectFBImageProvider_WebP ) ++ ++ if (!desc) ++ return DFB_INVARG; ++ ++ desc->caps = DFB_PIXELFORMAT_HAS_ALPHA( data->pixelformat ) ? DICAPS_ALPHACHANNEL : DICAPS_NONE; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++IDirectFBImageProvider_WebP_GetSurfaceDescription( IDirectFBImageProvider *thiz, ++ DFBSurfaceDescription *desc ) ++{ ++ DIRECT_INTERFACE_GET_DATA( IDirectFBImageProvider_WebP ) ++ ++ if (!desc) ++ return DFB_INVARG; ++ ++ desc->flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS; ++ ++ desc->caps = DFB_PIXELFORMAT_HAS_ALPHA( data->pixelformat ) ? DSCAPS_PREMULTIPLIED : DSCAPS_NONE; ++ ++ desc->width = data->width; ++ desc->height = data->height; ++ ++ desc->pixelformat = data->pixelformat; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++Probe( IDirectFBImageProvider_ProbeContext *ctx ) ++{ ++ ++ if (WebPGetInfo( ctx->header, D_ARRAY_SIZE( ctx->header ), NULL, NULL ) != 0) ++ return DFB_OK; ++ ++ return DFB_UNSUPPORTED; ++} ++ ++static DFBResult ++get_image_features( IDirectFBImageProvider_WebP_data *data ) ++{ ++ u32 buffer_size = 32; ++ u32 read = 0; ++ u8 buffer[buffer_size]; ++ ++ WebPBitstreamFeatures image_features; ++ DFBResult ret; ++ ++ ret = data->base.buffer->WaitForData( data->base.buffer, buffer_size ); ++ ++ /* ++ * Get the actual image size manually ++ * as webp api doesn't return that info ++ */ ++ if (ret == DFB_OK) ++ ret = data->base.buffer->PeekData( data->base.buffer, 4, 4, &data->image_size, &read ); ++ ++ data->image_size += 8; ++ ++ ret = data->base.buffer->PeekData( data->base.buffer, buffer_size, 0, buffer, &read ); ++ if (ret) ++ return ret; ++ ++ if (WebPGetFeatures( buffer, buffer_size, &image_features ) != VP8_STATUS_OK) ++ return DFB_FAILURE; ++ ++ data->width = image_features.width; ++ data->height = image_features.height; ++ data->pixelformat = image_features.has_alpha ? DSPF_ARGB : DSPF_RGB24; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++Construct( IDirectFBImageProvider *thiz, ++ ... ) ++{ ++ IDirectFBDataBuffer *buffer; ++ CoreDFB *core; ++ va_list tag; ++ ++ D_DEBUG_AT( imageProviderWebP, "%s(%d)\n", __FUNCTION__, __LINE__ ); ++ ++ DIRECT_ALLOCATE_INTERFACE_DATA(thiz, IDirectFBImageProvider_WebP) ++ ++ va_start( tag, thiz ); ++ buffer = va_arg( tag, IDirectFBDataBuffer * ); ++ core = va_arg( tag, CoreDFB * ); ++ va_end( tag ); ++ ++ data->base.ref = 1; ++ data->base.buffer = buffer; ++ data->base.core = core; ++ ++ /* Increase the data buffer reference counter. */ ++ buffer->AddRef( buffer ); ++ ++ if (get_image_features( data )) ++ goto error; ++ ++ D_DEBUG_AT( imageProviderWebP, "%s( %dx%d -%s)\n", __FUNCTION__, data->width, ++ data->height, dfb_pixelformat_name( data->pixelformat ) ); ++ ++ data->base.Destruct = IDirectFBImageProvider_WebP_Destruct; ++ ++ thiz->RenderTo = IDirectFBImageProvider_WebP_RenderTo; ++ thiz->GetImageDescription = IDirectFBImageProvider_WebP_GetImageDescription; ++ thiz->GetSurfaceDescription = IDirectFBImageProvider_WebP_GetSurfaceDescription; ++ thiz->SetRenderCallback = IDirectFBImageProvider_WebP_SetRenderCallback; ++ ++ return DFB_OK; ++ ++error: ++ buffer->Release( buffer ); ++ DIRECT_DEALLOCATE_INTERFACE(thiz); ++ ++ return DFB_FAILURE; ++} +diff --git a/interfaces/IDirectFBImageProvider/mme/mme.h b/interfaces/IDirectFBImageProvider/mme/mme.h +new file mode 100644 +index 0000000..b29d243 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/mme/mme.h +@@ -0,0 +1,586 @@ ++/************************************************************** ++ * Copyright (C) 2010 STMicroelectronics. All Rights Reserved. ++ * This file is part of the latest release of the Multicom4 project. This release ++ * is fully functional and provides all of the original MME functionality.This ++ * release is now considered stable and ready for integration with other software ++ * components. ++ ++ * Multicom4 is a 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 ++ * version 2. ++ ++ * Multicom4 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 Multicom4; ++ * see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - ++ * Suite 330, Boston, MA 02111-1307, USA. ++ ++ * Written by Multicom team at STMicroelectronics in November 2010. ++ * Contact multicom.support@st.com. ++**************************************************************/ ++ ++/* ++ * ++ */ ++ ++#ifndef _MME_H ++#define _MME_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++/* Constants */ ++ ++#define MME_MAX_TRANSFORMER_NAME (63U) ++ ++#define MME_MAX_CACHE_LINE (32) ++#define MME_CACHE_LINE_ALIGN(X) ((void*)(((unsigned) (X) + (MME_MAX_CACHE_LINE-1)) & ~(MME_MAX_CACHE_LINE-1))) ++#define MME_CACHE_LINE_ALIGNED(X) (((unsigned) (X) & (MME_MAX_CACHE_LINE-1)) == 0) ++ ++/* Aliased names for some of the inconsistently named (or simply overly long) identifiers */ ++ ++#define MME_Deinit MME_Term ++#define MME_Error_t MME_ERROR ++#define MME_NO_MEMORY MME_NOMEM ++#define MME_SET_GLOBAL_TRANSFORM_PARAMS MME_SET_PARAMS ++#define MME_EMBX_ERROR MME_ICS_ERROR ++ ++/* Version info */ ++ ++#define __MULTICOM_VERSION__ "4.0.51 : Orly" ++#define __MULTICOM_VERSION_MAJOR__ (4) ++#define __MULTICOM_VERSION_MINOR__ (0) ++#define __MULTICOM_VERSION_PATCH__ (51) ++ ++/* Version macros like the ones found in Linux */ ++#define MULTICOM_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) ++#define MULTICOM_VERSION_CODE MULTICOM_VERSION(__MULTICOM_VERSION_MAJOR__, __MULTICOM_VERSION_MINOR__, __MULTICOM_VERSION_PATCH__) ++ ++/* Enumerations */ ++ ++/* MME_AllocationFlags_t: ++ * Used to qualify MME_DataBuffer_t memory allocation ++ */ ++typedef enum MME_AllocationFlags_t { ++ MME_ALLOCATION_PHYSICAL = 1, ++ MME_ALLOCATION_CACHED = 2, ++ MME_ALLOCATION_UNCACHED = 4 ++} MME_AllocationFlags_t; ++ ++/* MME_CommandCode_t: ++ * Used to specify a command to a transformer ++ */ ++typedef enum MME_CommandCode_t { ++ MME_SET_PARAMS, ++ MME_TRANSFORM, ++ MME_SEND_BUFFERS, ++ MME_PING /* MME4 API extension */ ++} MME_CommandCode_t; ++ ++/* MME_CommandState_t: ++ * Used to specify the current state of a submitted command ++ */ ++typedef enum MME_CommandState_t { ++ MME_COMMAND_IDLE, ++ MME_COMMAND_PENDING, ++ MME_COMMAND_EXECUTING, ++ MME_COMMAND_COMPLETED, ++ MME_COMMAND_FAILED ++} MME_CommandState_t; ++ ++/* MME_CommandEndType_t: ++ * Used to specify whether the Client callback or Wake ++ * should be actioned on command completion ++ * ++ * MME_COMMAND_END_RETURN_NO_INFO - No Callback/Wake ++ * MME_COMMAND_END_RETURN_NOTIFY - Call Client callback ++ * MME_COMMAND_END_RETURN_WAKE - Wakeup MME_Wait() call ++ */ ++typedef enum MME_CommandEndType_t { ++ MME_COMMAND_END_RETURN_NO_INFO, ++ MME_COMMAND_END_RETURN_NOTIFY, ++ MME_COMMAND_END_RETURN_WAKE /* MME4 API extension */ ++} MME_CommandEndType_t; ++ ++/* MME_Event_t: ++ * Used to indicate a transform event type to the Client callback ++ */ ++typedef enum MME_Event_t { ++ MME_COMMAND_COMPLETED_EVT, ++ MME_DATA_UNDERFLOW_EVT, ++ MME_NOT_ENOUGH_MEMORY_EVT, ++ MME_NEW_COMMAND_EVT, ++ MME_TRANSFORMER_TIMEOUT ++} MME_Event_t; ++ ++ ++/* MME_ERROR: ++ * The errors that may be returned by MME API functions or by ++ * transformer entry point functions ++ */ ++typedef enum MME_ERROR { ++ MME_SUCCESS = 0, ++ MME_DRIVER_NOT_INITIALIZED = 1, ++ MME_DRIVER_ALREADY_INITIALIZED = 2, ++ MME_NOMEM = 3, ++ MME_INVALID_TRANSPORT = 4, /* DEPRECATED */ ++ MME_INVALID_HANDLE = 5, ++ MME_INVALID_ARGUMENT = 6, ++ MME_UNKNOWN_TRANSFORMER = 7, ++ MME_TRANSFORMER_NOT_RESPONDING = 8, ++ MME_HANDLES_STILL_OPEN = 9, ++ MME_COMMAND_STILL_EXECUTING = 10, ++ MME_COMMAND_ABORTED = 11, ++ MME_DATA_UNDERFLOW = 12, ++ MME_DATA_OVERFLOW = 13, ++ MME_TRANSFORM_DEFERRED = 14, ++ MME_SYSTEM_INTERRUPT = 15, ++ MME_ICS_ERROR = 16, ++ MME_INTERNAL_ERROR = 17, ++ MME_NOT_IMPLEMENTED = 18, ++ MME_COMMAND_TIMEOUT = 19 /* MME4 API extension */ ++} MME_ERROR; ++ ++/* MME_CacheFlags_t ++ * Cache management flags used allow optimizations to be applied ++ * for each MME_ScatterPage_t (FlagsIn/FlagsOut) ++ */ ++typedef enum MME_CacheFlags_t { ++ MME_DATA_CACHE_COHERENT = (1 << 31), /* In/Out: Memory/Page is already coherent with cache */ ++ MME_DATA_TRANSIENT = (1 << 30), /* In: Cache flush is not necessary in Companion */ ++ MME_REMOTE_CACHE_COHERENT = (1 << 29), /* Out: Remote Page translation should be COHERENT */ ++ MME_DATA_PHYSICAL = (1 << 28) /* In/Out: Memory address is Physical don't translate */ ++} MME_CacheFlags_t; ++ ++/* MME_Tuneable_t: ++ * Keys used to modify tuneable parameters ++ */ ++typedef enum { ++ /* no need to MME_THREAD_STACK_SIZE, this is managed by the ICS call */ ++ MME_TUNEABLE_MANAGER_THREAD_PRIORITY, ++ MME_TUNEABLE_TRANSFORMER_THREAD_PRIORITY, ++ MME_TUNEABLE_EXECUTION_LOOP_HIGHEST_PRIORITY, ++ MME_TUNEABLE_EXECUTION_LOOP_ABOVE_NORMAL_PRIORITY, ++ MME_TUNEABLE_EXECUTION_LOOP_NORMAL_PRIORITY, ++ MME_TUNEABLE_EXECUTION_LOOP_BELOW_NORMAL_PRIORITY, ++ MME_TUNEABLE_EXECUTION_LOOP_LOWEST_PRIORITY, ++ /* TIMEOUT SUPPORT - allow default timeout to be modified */ ++ MME_TUNEABLE_TRANSFORMER_TIMEOUT, ++ MME_TUNEABLE_BUFFER_POOL_SIZE, /* MME4 API Extension */ ++ MME_TUNEABLE_COMMAND_TIMEOUT, /* MME4 API Extension */ ++ ++ MME_TUNEABLE_MAX ++} MME_Tuneable_t; ++ ++/* MME_Priority_t: ++ * The MME scheduler priority at which a transform is executed ++ */ ++typedef enum MME_Priority_t { ++ MME_PRIORITY_HIGHEST = 5000, ++ MME_PRIORITY_ABOVE_NORMAL = 4000, ++ MME_PRIORITY_NORMAL = 3000, ++ MME_PRIORITY_BELOW_NORMAL = 2000, ++ MME_PRIORITY_LOWEST = 1000 ++} MME_Priority_t; ++ ++/* Types: simple */ ++ ++/* CPU architecture-specific */ ++ ++#if defined __sh__ || defined(__st200__) || defined(__ILP32__) || defined(__arm__) ++/* SH4/ST40 */ ++typedef unsigned int MME_UINT; ++typedef unsigned long MME_ULONG; ++typedef unsigned long MME_SIZE; ++typedef double MME_GENERIC64; ++#define MME_MaxTime_c 0xffffffff ++#else ++#error Unsupported CPU type ++#endif ++ ++/* TIMEOUT SUPPORT: Maximum timeout value which basically means don't timeout */ ++#define MME_TIMEOUT_INFINITE MME_MaxTime_c ++ ++/* Architecture neutral */ ++/* MME_Time_t: ++ * MME time ++ */ ++typedef MME_UINT MME_Time_t; ++ ++/* MME_GenericParams_t: ++ * A transformer specific parameter ++ */ ++typedef void* MME_GenericParams_t; ++ ++/* MME_CommandId_t: ++ * The identifier assigned by MME to a submitted command ++ */ ++typedef MME_UINT MME_CommandId_t; ++ ++/* MME_TransformerHandle_t: ++ * The handle of a transformer instance assigned by MME ++ */ ++typedef MME_UINT MME_TransformerHandle_t; ++ ++/* MME_MemoryHandle_t: ++ * The handle of a registered memory region assigned by MME ++ */ ++typedef MME_UINT MME_MemoryHandle_t; ++ ++/* Types: structures */ ++ ++/* MME_CommandStatus_t: ++ * Structure containing state associated with a command ++ */ ++typedef struct MME_CommandStatus_t { ++ MME_CommandId_t CmdId; ++ MME_CommandState_t State; ++ MME_Time_t ProcessedTime; ++ MME_ERROR Error; ++ MME_UINT AdditionalInfoSize; ++ MME_GenericParams_t AdditionalInfo_p; ++} MME_CommandStatus_t; ++ ++/* MME_ScatterPage_t: ++ * Structure describing a single scatter page - see MME_DataBuffer_t ++ */ ++typedef struct MME_ScatterPage_t { ++ void* Page_p; ++ MME_UINT Size; ++ MME_UINT BytesUsed; ++ MME_UINT FlagsIn; ++ MME_UINT FlagsOut; ++} MME_ScatterPage_t; ++ ++/* MME_DataBuffer_t: ++ * Structure describing a data buffer ++ */ ++typedef struct MME_DataBuffer_t { ++ MME_UINT StructSize; ++ void* UserData_p; ++ MME_UINT Flags; ++ MME_UINT StreamNumber; ++ MME_UINT NumberOfScatterPages; ++ MME_ScatterPage_t* ScatterPages_p; ++ MME_UINT TotalSize; ++ MME_UINT StartOffset; ++} MME_DataBuffer_t; ++ ++/* MME_Command_t: ++ * Structure to pass a command to a transformer ++ */ ++typedef struct MME_Command_t { ++ MME_UINT StructSize; ++ MME_CommandCode_t CmdCode; ++ MME_CommandEndType_t CmdEnd; ++ MME_Time_t DueTime; ++ MME_UINT NumberInputBuffers; ++ MME_UINT NumberOutputBuffers; ++ MME_DataBuffer_t** DataBuffers_p; ++ MME_CommandStatus_t CmdStatus; ++ MME_UINT ParamSize; ++ MME_GenericParams_t Param_p; ++} MME_Command_t; ++ ++/* MME_DataFormat_t: ++ * Structure describing the data format that a transformer supports ++ */ ++typedef struct MME_DataFormat_t { ++ unsigned char FourCC[4]; ++} MME_DataFormat_t; ++ ++ ++/* MME_TransformerCapability_t: ++ * Structure containing information pertaining to a transformer's capability ++ */ ++typedef struct MME_TransformerCapability_t { ++ MME_UINT StructSize; ++ MME_UINT Version; ++ MME_DataFormat_t InputType; ++ MME_DataFormat_t OutputType; ++ MME_UINT TransformerInfoSize; ++ MME_GenericParams_t TransformerInfo_p; ++} MME_TransformerCapability_t; ++ ++ ++/* Transformer Client callback function */ ++typedef void (*MME_GenericCallback_t) (MME_Event_t event, MME_Command_t * callbackData, void *userData); ++ ++/* MME_TransformerInitParams_t: ++ * The parameters with which to initialize a transformer ++ */ ++typedef struct MME_TransformerInitParams_t { ++ MME_UINT StructSize; ++ MME_Priority_t Priority; ++ MME_GenericCallback_t Callback; ++ void* CallbackUserData; ++ MME_UINT TransformerInitParamsSize; ++ MME_GenericParams_t TransformerInitParams_p; ++} MME_TransformerInitParams_t; ++ ++/* Types: functions */ ++ ++/* Transformer: AbortCommand entry point */ ++typedef MME_ERROR (*MME_AbortCommand_t) (void *context, MME_CommandId_t commandId); ++ ++/* Transformer: GetTransformerCapability entry point */ ++typedef MME_ERROR (*MME_GetTransformerCapability_t) (MME_TransformerCapability_t * capability); ++ ++/* Transformer: InitTransformer entry point */ ++typedef MME_ERROR (*MME_InitTransformer_t) (MME_UINT initParamsLength, MME_GenericParams_t initParams, void **context); ++ ++/* Transformer: ProcessCommand entry point */ ++typedef MME_ERROR (*MME_ProcessCommand_t) (void *context, MME_Command_t * commandInfo); ++ ++/* Transformer: TermTransformer entry point */ ++typedef MME_ERROR (*MME_TermTransformer_t) (void *context); ++ ++/* Macros */ ++ ++/* These macros are shown in their most simplistic form. On mixed endian ++ * systems these macros can use (sizeof(field) == n) if networks to cope. ++ * Since such a network can be solved at compile time this would not impact ++ * runtime performance. ++ */ ++ ++/* MME_PARAM has a different implementation of machines with a different ++ * endian. This permits the MME implementation on a big endian machine ++ * to perform a 64-bit byte swap ++ */ ++ ++#if defined(__sh__) || defined(__st200__) || defined(__LITTLE_ENDIAN__) || defined(__arm__) ++/* this is the definition of MME_PARAM for little endian machines */ ++#define _MME_PARAM_ADDRESS(p, f) ((MME_TYPE_##f*)(((MME_GENERIC64*)p)+MME_OFFSET_##f)) ++ ++#else ++/* this is the definition of MME_PARAM for big endian machines */ ++#define _MME_PARAM_ADDRESS(p, f) \ ++ ((MME_TYPE_##f *)(((char *)((MME_GENERIC64*)p+MME_OFFSET_##f))+(sizeof(MME_GENERIC64)-sizeof(MME_TYPE_##f)))) ++ ++/* At the moment we do not support BE machines */ ++#error Unsupported CPU type ++#endif ++ ++/* A parameter */ ++#define MME_PARAM(p, f) (*_MME_PARAM_ADDRESS(p, f)) ++ ++/* A parameter sublist */ ++#define MME_PARAM_SUBLIST(p, f) _MME_PARAM_ADDRESS(p, f) ++ ++/* Access a parameter at a given index */ ++#define MME_INDEXED_PARAM(p, f, i) (*((MME_TYPE_##f*)(((MME_GENERIC64*)p)+MME_OFFSET_##f+(i)))) ++ ++/* Get number of paramters */ ++#define MME_LENGTH(id) (MME_LENGTH_##id) ++ ++/* Get number of paramters */ ++#define MME_LENGTH_BYTES(id) ((MME_LENGTH_##id)*sizeof(MME_GENERIC64)) ++ ++/* Function declarations */ ++ ++/* MME_AbortCommand() ++ * Attempt to abort a submitted command ++ * ++ * Asyncrhonous operation whose success will be observed in the CmdStatus of the aborted command ++ */ ++MME_ERROR MME_AbortCommand (MME_TransformerHandle_t handle, MME_CommandId_t cmdId); ++ ++/* MME_KillCommand() ++ * Abort a command without communicating with the remote processor. Should only be used ++ * when we know the transformer processor has definitely crashed ++ */ ++MME_ERROR MME_KillCommand (MME_TransformerHandle_t handle, MME_CommandId_t cmdId); ++ ++/* MME_KillCommandAll() ++ * Abort all commands without communicating with the remote processor. Should only be used ++ * when we know the transformer processor has definitely crashed ++ */ ++MME_ERROR MME_KillCommandAll (MME_TransformerHandle_t handle); ++ ++/* MME_AllocDataBuffer() ++ * Allocate a data buffer that is optimal for the transformer instantiation ++ * to pass between a Client and companion ++ */ ++MME_ERROR MME_AllocDataBuffer (MME_TransformerHandle_t handle, ++ MME_UINT size, ++ MME_AllocationFlags_t flags, ++ MME_DataBuffer_t ** dataBuffer_p); ++ ++/* MME_DeregisterTransformer() ++ * Deregister a transformer that has been registered ++ */ ++MME_ERROR MME_DeregisterTransformer (const char *name); ++ ++/* MME_DeregisterTransport() ++ * Deregister an EMBX transport being used by MME ++ * ++ * DEPRECATED ++ */ ++MME_ERROR MME_DeregisterTransport (const char *name); ++ ++/* MME_FreeDataBuffer() ++ * Free a buffer previously allocated with MME_AllocDataBuffer ++ */ ++MME_ERROR MME_FreeDataBuffer (MME_DataBuffer_t * DataBuffer); ++ ++/* MME_GetTransformerCapability() ++ * Obtain the capabilities of a transformer ++ */ ++MME_ERROR MME_GetTransformerCapability (const char *name, ++ MME_TransformerCapability_t * capability); ++ ++/* MME_Init() ++ * Initialize MME ++ */ ++MME_ERROR MME_Init (void); ++ ++/* MME_InitTransformer() ++ * Create a transformer instance on a companion ++ */ ++MME_ERROR MME_InitTransformer (const char *name, ++ MME_TransformerInitParams_t * params, ++ MME_TransformerHandle_t * handlep); ++ ++/* MME_ModifyTuneable() ++ * Modify system wide configuration parameters such as thread priority. ++ */ ++MME_ERROR MME_ModifyTuneable (MME_Tuneable_t key, MME_UINT value); ++ ++/* MME_GetTuneable() ++ * Returns current value of system wide configuration parameters such as thread priority. ++ */ ++MME_UINT MME_GetTuneable (MME_Tuneable_t key); ++ ++/* MME_NotifyHost() ++ * Notify the Command Client that a transformer event has occurred ++ */ ++MME_ERROR MME_NotifyHost (MME_Event_t event, MME_Command_t * commandInfo, MME_ERROR res); ++ ++/* MME_RegisterTransformer() ++ * Register a transformer after which instantiations may be made ++ */ ++MME_ERROR MME_RegisterTransformer (const char *name, ++ MME_AbortCommand_t abortFunc, ++ MME_GetTransformerCapability_t getTransformerCapabilityFunc, ++ MME_InitTransformer_t initTransformerFunc, ++ MME_ProcessCommand_t processCommandFunc, ++ MME_TermTransformer_t termTransformerFunc); ++ ++/* MME_RegisterTransport() ++ * Register an existing EMBX transport for use by MME ++ * ++ * DEPRECATED ++ */ ++MME_ERROR MME_RegisterTransport (const char *name); ++ ++/* MME_Run() ++ * Run the MME message loop on a companion CPU ++ * ++ * DEPRECATED ++ */ ++MME_ERROR MME_Run (void); ++ ++/* MME_SendCommand() ++ * Send a transformer command to a transformer instance ++ */ ++MME_ERROR MME_SendCommand (MME_TransformerHandle_t handle, MME_Command_t *commandInfo); ++ ++/* MME_Term() ++ * Terminate MME on the local CPU. ++ */ ++MME_ERROR MME_Term (void); ++ ++/* MME_TermTransformer() ++ * Terminate a transformer instance ++ */ ++MME_ERROR MME_TermTransformer (MME_TransformerHandle_t handle); ++ ++/* MME_KillTransformer() ++ * Terminate a transformer instance, without communicating ++ * with the remote processor, which we assume has crashed ++ */ ++MME_ERROR MME_KillTransformer (MME_TransformerHandle_t handle); ++ ++/* MME_IsStillAlive() ++ * Ping a remote transformer to see if it's still running ++ * Sets alive to be non zero if it replies, zero otherwise ++ */ ++MME_ERROR MME_IsStillAlive (MME_TransformerHandle_t handle, MME_UINT *alive); ++ ++/* ++ * Multihost extensions - DEPRECATED ++ */ ++MME_ERROR MME_HostRegisterTransport(const char *name); ++MME_ERROR MME_HostDeregisterTransport(const char* name); ++MME_ERROR MME_HostInit(void); ++MME_ERROR MME_HostTerm(void); ++ ++/* ++ * MME4 New APIs ++ */ ++ ++/* ++ * Return a pointer to the MME version string ++ * ++ * This string takes the form: ++ * ++ * {major number}.{minor number}.{patch number} [text] ++ * ++ * That is, a major, minor and release number, separated by ++ * decimal points, and optionally followed by a space and a text string. ++ */ ++const char *MME_Version (void); ++ ++/* MME_WaitCommand() ++ * Block waiting for an issued Command to complete. Command must have been ++ * issued using the MME_COMMAND_END_RETURN_WAKE CmdEnd notification type ++ * ++ * Returns MME_SUCCESS when transformation has completed and CmdStatus has been updated ++ * Corresponding MME_Event status is updated via eventp ++ * ++ * Can return MME_COMMAND_TIMEOUT, MME_SYSTEM_INTERRUPT or MME_ICS_ERROR ++ */ ++MME_ERROR MME_WaitCommand (MME_TransformerHandle_t handle, ++ MME_CommandId_t cmdId, ++ MME_Event_t *eventp, ++ MME_Time_t timeout); ++ ++/* MME_PingTransformer() ++ * Ping a remote transformer to see if it's still running ++ * Waits for timeout period for response before returning an error ++ */ ++MME_ERROR MME_PingTransformer (MME_TransformerHandle_t handle, MME_Time_t timeout); ++ ++/* ++ * Register a memory region for use with the specified transformer instance ++ * ++ * Only data buffers which lie within the specified region can be used ++ * during transform operations ++ * ++ */ ++MME_ERROR MME_RegisterMemory (MME_TransformerHandle_t handle, ++ void *base, ++ MME_SIZE size, ++ MME_MemoryHandle_t *handlep); ++ ++MME_ERROR MME_DeregisterMemory (MME_MemoryHandle_t handle); ++ ++ ++#include /* Debug logging */ ++ ++ ++#ifdef __cplusplus ++} ++#endif /* __cplusplus */ ++#endif /* _MME_H */ ++ ++/* ++ * Local Variables: ++ * tab-width: 8 ++ * c-indent-level: 2 ++ * c-basic-offset: 2 ++ * End: ++ */ +diff --git a/interfaces/IDirectFBImageProvider/mme/mme_debug.h b/interfaces/IDirectFBImageProvider/mme/mme_debug.h +new file mode 100644 +index 0000000..7b4ed03 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/mme/mme_debug.h +@@ -0,0 +1,63 @@ ++/************************************************************** ++ * Copyright (C) 2010 STMicroelectronics. All Rights Reserved. ++ * This file is part of the latest release of the Multicom4 project. This release ++ * is fully functional and provides all of the original MME functionality.This ++ * release is now considered stable and ready for integration with other software ++ * components. ++ ++ * Multicom4 is a 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 ++ * version 2. ++ ++ * Multicom4 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 Multicom4; ++ * see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - ++ * Suite 330, Boston, MA 02111-1307, USA. ++ ++ * Written by Multicom team at STMicroelectronics in November 2010. ++ * Contact multicom.support@st.com. ++**************************************************************/ ++ ++/* ++ * ++ */ ++ ++#ifndef _MME_DEBUG_H ++#define _MME_DEBUG_H ++ ++typedef enum mme_debug_flags ++{ ++ MME_DBG = 0x0000, /* Always displayed */ ++ ++ MME_DBG_ERR = 0x0001, /* Display all error paths */ ++ MME_DBG_INIT = 0x0002, /* Initialisation operations */ ++ MME_DBG_MANAGER = 0x0004, /* MME management operations */ ++ ++ MME_DBG_RECEIVER = 0x0010, /* Transformer receiver task (companion) */ ++ MME_DBG_TRANSFORMER = 0x0020, /* Transformer operations (host) */ ++ MME_DBG_EXEC = 0x0040, /* Execution tasks */ ++ ++ MME_DBG_COMMAND = 0x0100, /* Transformer Command issue */ ++ MME_DBG_BUFFER = 0x0200, /* DataBuffer Alloc/Free */ ++ ++} MME_DBG_FLAGS; ++ ++const char *MME_ErrorStr (MME_ERROR res); ++MME_ERROR MME_DebugFlags (MME_DBG_FLAGS flags); ++ ++/* These were inconsistently named originally */ ++#define MME_Error_Str MME_ErrorStr ++#define MME_Debug_Flags MME_DebugFlags ++ ++#endif /* _MME_DEBUG_H */ ++ ++/* ++ * Local Variables: ++ * tab-width: 8 ++ * c-indent-level: 2 ++ * c-basic-offset: 2 ++ * End: ++ */ +diff --git a/interfaces/IDirectFBImageProvider/mme/transform/JPEGDECHW_VideoTransformerTypes.h b/interfaces/IDirectFBImageProvider/mme/transform/JPEGDECHW_VideoTransformerTypes.h +new file mode 100644 +index 0000000..c32292c +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/mme/transform/JPEGDECHW_VideoTransformerTypes.h +@@ -0,0 +1,379 @@ ++/// ++/// @file : JPEGDECHW_VideoTransformerTypes.h ++/// ++/// @brief : JPEG Video Decoder specific types for MME ++/// ++/// @par OWNER: ++/// ++/// @author : Prabhat Awasthi ++/// ++/// @par SCOPE: ++/// ++/// @date : 2008-08-01 ++/// ++/// © 2006 ST Microelectronics. All Rights Reserved. ++/// ++ ++#ifndef _JPEGDECHW_VIDEOTRANSFORMERTYPES_H_ ++#define _JPEGDECHW_VIDEOTRANSFORMERTYPES_H_ ++ ++#include "stddefs.h" ++ ++/*=============================================== ++ JPEG_DECODER ++===============================================*/ ++ ++#define JPEGHWDEC_MME_TRANSFORMER_NAME "JPEG_DECODER_HW" ++ ++/* ++JPEGHW_MME_VERSION: ++Identifies the MME API version of the JPEGHW firmware. ++If wants to build the firmware for old MME API version, change this string correspondingly. ++*/ ++#ifndef JPEGHW_MME_VERSION ++ #define JPEGHW_MME_VERSION 17 /* Latest MME API version */ ++#endif ++ ++#if (JPEGHW_MME_VERSION >= 17) ++ #define JPEGHWDEC_MME_API_VERSION "1.7" ++#elif (JPEGHW_MME_VERSION >= 16) ++ #define JPEGHWDEC_MME_API_VERSION "1.6" ++#elif (JPEGHW_MME_VERSION >= 15) ++ #define JPEGHWDEC_MME_API_VERSION "1.5" ++#elif (JPEGHW_MME_VERSION >= 14) ++ #define JPEGHWDEC_MME_API_VERSION "1.4" ++#elif (JPEGHW_MME_VERSION >= 13) ++ #define JPEGHWDEC_MME_API_VERSION "1.3" ++#elif (JPEGHW_MME_VERSION >= 12) ++ #define JPEGHWDEC_MME_API_VERSION "1.2" ++#elif (JPEGHW_MME_VERSION >= 11) ++ #define JPEGHWDEC_MME_API_VERSION "1.1" ++#else ++ #define JPEGHWDEC_MME_API_VERSION "1.0" ++#endif ++ ++ ++#define JPEGDECHW_NUMBER_OF_CEH_INTERVALS 32 ++ ++/* ++** JPEGDECHW_CompressedData_t : ++** Defines the address type for the JPEGDECHW compressed data ++*/ ++typedef U32 *JPEGDECHW_CompressedData_t; ++ ++ ++/* ++** JPEGDECHW_LumaAddress_t : ++** Defines the address type for the JPEGDECHW decoded Luma data’s ++** Bits 0 to 7 shall be set to 0 ++*/ ++typedef U32 *JPEGDECHW_LumaAddress_t; ++ ++ ++/* ++** JPEGDECHW_ChromaAddress_t : ++** Defines the address type for the JPEGDECHW decoded Chroma data’s ++** Bits 0 to 7 shall be set to 0 ++*/ ++typedef U32 *JPEGDECHW_ChromaAddress_t; ++ ++ ++/* ++** JPEGDECHW_DecodedBufferAddress_t : ++** Defines the addresses where the decoded picture/additional info related to the block ++** structures will be stored ++*/ ++typedef struct _JPEGDECHWDECODEDBUFFERADDRESS_T_ ++{ ++ JPEGDECHW_LumaAddress_t Luma_p; ++ JPEGDECHW_ChromaAddress_t Chroma_p; ++#if (JPEGHW_MME_VERSION < 15) /* Not required For Reference reconstruction block*/ ++ JPEGDECHW_LumaAddress_t LumaDecimated_p; ++ JPEGDECHW_ChromaAddress_t ChromaDecimated_p; ++#endif ++} JPEGDECHW_DecodedBufferAddress_t; ++ ++ ++#if (JPEGHW_MME_VERSION >= 15) ++/* ++** JPEGDECHW_DisplayBufferAddress_t : ++** Defines the addresses (used by Display Reconstruction block) where the pictures to be displayed will be stored ++*/ ++typedef struct _JPEGDECHWDISPLAYBUFFERADDRESS_T_ ++{ ++ U32 StructSize; /* Size of the structure in bytes */ ++ JPEGDECHW_LumaAddress_t DisplayLuma_p; /* address of the Luma buffer */ ++ JPEGDECHW_ChromaAddress_t DisplayChroma_p; /* address of the Chroma buffer */ ++ JPEGDECHW_LumaAddress_t DisplayDecimatedLuma_p; /* address of the decimated Luma buffer */ ++ JPEGDECHW_ChromaAddress_t DisplayDecimatedChroma_p; /* address of the decimated Chroma buffer */ ++} JPEGDECHW_DisplayBufferAddress_t; ++#endif ++ ++ ++#if (JPEGHW_MME_VERSION >= 15) ++/* ++** JPEGDECHW_RcnRefDispEnable_t : ++** Used for enabling Main/Aux outputs for both Display & Reference reconstruction blocks ++*/ ++typedef enum _JPEGDECHW_RCNREFDISPENABLE_T_ ++{ ++ JPEGDECHW_DISP_AUX_EN = 0x00000010, /* Enable decimated (for display) reconstruction */ ++ JPEGDECHW_DISP_MAIN_EN = 0x00000020, /* Enable main (for display) reconstruction */ ++ JPEGDECHW_DISP_AUX_MAIN_EN = 0x00000030, /* Enable both main & decimated (for display) reconstruction */ ++ JPEGDECHW_REF_MAIN_EN = 0x00000100, /* Enable only reference output(ex. for Trick modes)*/ ++ JPEGDECHW_REF_MAIN_DISP_AUX_EN = 0x00000110, /* Enable reference output with decimated (for display) reconstruction */ ++ JPEGDECHW_REF_MAIN_DISP_MAIN_EN = 0x00000120, /* Enable reference output with main (for display) reconstruction */ ++ JPEGDECHW_REF_MAIN_DISP_MAIN_AUX_EN = 0x00000130 /* Enable reference output with main & decimated (for display) reconstruction */ ++} JPEGDECHW_RcnRefDispEnable_t; ++ ++#else ++ ++/* ++** JPEGDECHW_MainAuxEnable_t : ++** Used for enabling Main/Aux outputs ++*/ ++typedef enum _JPEGDECHW_MAINAUXENABLE_T_ ++{ ++ JPEGDECHW_AUXOUT_EN = 0x00000010, /* enable decimated reconstruction */ ++ JPEGDECHW_MAINOUT_EN = 0x00000020, /* enable main reconstruction */ ++ JPEGDECHW_AUX_MAIN_OUT_EN = 0x00000030 /* enable both main & decimated reconstruction */ ++} JPEGDECHW_MainAuxEnable_t; ++ ++#endif ++ ++ ++/* ++** JPEGDECHW_HorizontalDeciFactor _t : ++** Identifies the horizontal decimation factor ++*/ ++typedef enum _JPEGDECHW_HORIZONTALDECIFACTOR_T_ ++{ ++ JPEGDECHW_HDEC_1 = 0x00000000, /* no resize */ ++ JPEGDECHW_HDEC_ADVANCED_2 = 0x00000101, /* Advanced H/2 resize using improved 8-tap filters */ ++ JPEGDECHW_HDEC_ADVANCED_4 = 0x00000102 /* Advanced H/4 resize using improved 8-tap filters */ ++} JPEGDECHW_HorizontalDeciFactor_t; ++ ++ ++/* ++** JPEGDECHW_VerticalDeciFactor _t : ++** Identifies the vertical decimation factor ++*/ ++typedef enum _JPEGDECHW_VERTICALDECIFACTOR_T_ ++{ ++ JPEGDECHW_VDEC_1 = 0x00000000, /* no resize */ ++ JPEGDECHW_VDEC_ADVANCED_2_PROG = 0x00000204, /* V/2 , progressive resize */ ++ JPEGDECHW_VDEC_ADVANCED_2_INT = 0x000000208 /* V/2 , interlaced resize */ ++} JPEGDECHW_VerticalDeciFactor_t; ++ ++ ++/* ++** JPEGDECHW_VideoDecodeInitParams_t : ++** Identifies the Initialization parameters for the transformer. ++*/ ++typedef struct _JPEGDECHW_VIDEODECODEINITPARAMS_T_ ++{ ++ JPEGDECHW_CompressedData_t CircularBufferBeginAddr_p; ++ JPEGDECHW_CompressedData_t CircularBufferEndAddr_p; ++} JPEGDECHW_VideoDecodeInitParams_t; ++ ++ ++/* ++** JPEGDECHW_DecodingError_t : ++** Status of the decoding process ++*/ ++typedef enum ++{ ++ /* The firmware has been sucessful */ ++#if (JPEGHW_MME_VERSION >= 13) ++ JPEG_DECODER_NO_ERROR = 0, ++ JPEG_DECODER_UNDEFINED_HUFF_TABLE = 1, ++ JPEG_DECODER_UNSUPPORTED_MARKER = 2, ++ JPEG_DECODER_UNABLE_ALLOCATE_MEMORY = 3, ++ JPEG_DECODER_NON_SUPPORTED_SAMP_FACTORS = 4, ++ JPEG_DECODER_BAD_PARAMETER = 5, ++ JPEG_DECODER_DECODE_ERROR = 6, ++ JPEG_DECODER_BAD_RESTART_MARKER = 7, ++ JPEG_DECODER_UNSUPPORTED_COLORSPACE = 8, ++ JPEG_DECODER_BAD_SOS_SPECTRAL = 9, ++ JPEG_DECODER_BAD_SOS_SUCCESSIVE = 10, ++ JPEG_DECODER_BAD_HEADER_LENGHT = 11, ++ JPEG_DECODER_BAD_COUNT_VALUE = 12, ++ JPEG_DECODER_BAD_DHT_MARKER = 13, ++ JPEG_DECODER_BAD_INDEX_VALUE = 14, ++ JPEG_DECODER_BAD_NUMBER_HUFFMAN_TABLES = 15, ++ JPEG_DECODER_BAD_QUANT_TABLE_LENGHT = 16, ++ JPEG_DECODER_BAD_NUMBER_QUANT_TABLES = 17, ++ JPEG_DECODER_BAD_COMPONENT_COUNT = 18, ++ JPEG_DECODER_DIVIDE_BY_ZERO_ERROR = 19, ++ JPEG_DECODER_NOT_JPG_IMAGE = 20, ++ JPEG_DECODER_UNSUPPORTED_ROTATION_ANGLE = 21, ++ JPEG_DECODER_UNSUPPORTED_SCALING = 22, ++ JPEG_DECODER_INSUFFICIENT_OUTPUTBUFFER_SIZE = 23, ++ JPEG_DECODER_BAD_HWCFG_GP_VERSION_VALUE = 24, ++ JPEG_DECODER_BAD_VALUE_FROM_RED = 25, ++ JPEG_DECODER_BAD_SUBREGION_PARAMETERS = 26, ++ JPEG_DECODER_PROGRESSIVE_DECODE_NOT_SUPPORTED = 27, ++ JPEG_DECODER_ERROR_TASK_TIMEOUT = 28 ++#else ++ JPEG_DECODER_NO_ERROR = 0, ++ JPEG_DECODER_ERROR_NOT_RECOVERED = 4, ++ JPEG_DECODER_ERROR_TASK_TIMEOUT = 8 ++#endif ++} JPEGDECHW_DecodingError_t; ++ ++ ++/* ++** JPEGDECHW_DecodingMode_t : ++** Identifies the decoding mode. ++*/ ++typedef enum ++{ ++ JPEGDECHW_NORMAL_DECODE = 0, ++ /* Other values to be added later */ ++} JPEGDECHW_DecodingMode_t; ++ ++ ++/* ++** JPEGDECHW_AdditionalFlags_t : ++** Identifies the different flags that will be passed to JPEG firmware ++*/ ++#if (JPEGHW_MME_VERSION >= 14) ++typedef enum ++{ ++ JPEGDECHW_ADDITIONAL_FLAG_NONE = 0, ++ JPEGDECHW_ADDITIONAL_FLAG_CEH = 1, /* Request firmware to return values of the CEH registers */ ++ JPEGDECHW_ADDITIONAL_FLAG_RASTER = 64, /* Output storage of Auxillary reconstruction in Raster format. */ ++ JPEGDECHW_ADDITIONAL_FLAG_420MB = 128 /* Output storage of Auxillary reconstruction in 420MB format. */ ++} JPEGDECHW_AdditionalFlags_t; ++#elif (JPEGHW_MME_VERSION >= 12) ++typedef enum ++{ ++ JPEGDECHW_ADDITIONAL_FLAG_NONE = 0, ++ JPEGDECHW_ADDITIONAL_FLAG_CEH = 1, /* Request firmware to return values of the CEH registers */ ++ JPEGDECHW_ADDITIONAL_FLAG_RASTER = 64 /* Output storage of Auxillary reconstruction in Raster format. */ ++} JPEGDECHW_AdditionalFlags_t; ++#else ++typedef enum ++{ ++ JPEGDECHW_ADDITIONAL_FLAG_NONE = 0, ++ JPEGDECHW_ADDITIONAL_FLAG_CEH = 1 /* Request firmware to return values of the CEH registers */ ++} JPEGDECHW_AdditionalFlags_t; ++#endif ++ ++ ++/* ++** JPEGDECHW_VideoDecodeReturnParams_t : ++** Identifies the parameters to be returned back to the driver by decoder. ++*/ ++typedef struct _JPEGDECHWVIDEODECODERETURNPARAMS_T_ ++{ ++ /* profiling info */ ++#if (JPEGHW_MME_VERSION >= 17) ++ U32 DecodeTimeInMicros; ++#endif ++#if (JPEGHW_MME_VERSION <= 16) || defined (DUMP_PROFILE_INFO) ++ U32 pm_cycles; ++ U32 pm_dmiss; ++ U32 pm_imiss; ++ U32 pm_bundles; ++ U32 pm_pft; ++#endif ++ JPEGDECHW_DecodingError_t ErrorCode; ++ // CEHRegisters[] is an array where values of the ++ // Contrast Enhancement Histogram (CEH) registers will be stored. ++ // CEHRegisters[0] will correspond to register MBE_CEH_0_7, CEHRegisters[1] will ++ // correspond to register MBE_CEH_8_15., CEHRegisters[2], correspond to register ++ // MBE_CEH_16_23. ++ // Note that elements of this array will be updated only if ++ // VC9_TransformParam_t.AdditionalFlags will have the flag ++ // VC9_ADDITIONAL_FLAG_CEH set. They will remain unchanged otherwise. ++ U32 CEHRegisters[JPEGDECHW_NUMBER_OF_CEH_INTERVALS]; ++#ifdef JPEGHW_DEBUG ++ S32 LastDecodedMB; ++#endif ++} JPEGDECHW_VideoDecodeReturnParams_t; ++ ++ ++/* ++** JPEGDECHW_VideoDecodeCapabilityParams_t : ++** Transformer capability parameters. ++*/ ++typedef struct _JPEGDECHW_VIDEODECODECAPABILITYPARAMS_T_ ++{ ++ U32 api_version; // Omega2 frame buffer size (luma+chroma) ++} JPEGDECHW_VideoDecodeCapabilityParams_t; ++ ++ ++/* ++** JPEGDECHW_VideoDecodeParams_t : ++** Parameters to be sent along with the Transform command ++*/ ++typedef struct _JPEGDECHW_VIDEODECODEPARAMS_T_ ++{ ++ JPEGDECHW_CompressedData_t PictureStartAddr_p; ++ JPEGDECHW_CompressedData_t PictureEndAddr_p; ++ JPEGDECHW_DecodedBufferAddress_t DecodedBufferAddr; ++#if (JPEGHW_MME_VERSION >= 15) ++ JPEGDECHW_DisplayBufferAddress_t DisplayBufferAddr; ++#endif ++#if (JPEGHW_MME_VERSION >= 15) ++ JPEGDECHW_RcnRefDispEnable_t MainAuxEnable; /* enable Main and/or Aux outputs */ ++#else ++ JPEGDECHW_MainAuxEnable_t MainAuxEnable; /* enable Main and/or Aux outputs */ ++#endif ++ JPEGDECHW_HorizontalDeciFactor_t HorizontalDecimationFactor; ++ JPEGDECHW_VerticalDeciFactor_t VerticalDecimationFactor; ++ U32 xvalue0; /* The X(0) coordinate for subregion decoding */ ++ U32 xvalue1; /* The X(1) coordinate for subregion decoding */ ++ U32 yvalue0; /* The Y(0) coordinate for subregion decoding */ ++ U32 yvalue1; /* The Y(1) coordinate for subregion decoding */ ++ JPEGDECHW_DecodingMode_t DecodingMode; ++#if (JPEGHW_MME_VERSION >= 12) ++ U32 AdditionalFlags; /* Additonal Flags */ ++#else ++ JPEGDECHW_AdditionalFlags_t AdditionalFlags; /* Additonal Flags */ ++#endif ++#if (JPEGHW_MME_VERSION >= 16) ++ U32 FieldFlag; /* Determines Frame/Field Scan */ ++#endif ++#ifdef JPEG_PIC_SEQ_DEBUG_INFO ++ U8 *DebugBufferPtr; ++#endif ++} JPEGDECHW_VideoDecodeParams_t; ++ ++ ++#ifdef JPEG_PIC_SEQ_DEBUG_INFO ++/* ++** JPEG_DebugPicture_t : ++** Parameters to be sent along with the Transform command ++*/ ++typedef struct _JPEG_DEBUGPICTURE_T_ ++{ ++ U32 PicStdConfig; ++ U32 PictureWidthWord; ++ U32 PictureHeightWord; ++ U32 PicType_IPF; ++ U32 PictureWidthWord_IPF; ++ U32 PictureHeightWord_IPF; ++} JPEG_DebugPicture_t; ++#endif ++ ++#ifdef JPEG_MB_DEBUG_INFO ++/* ++** JPEG_DebugMb_t : ++** Parameters to be sent along with the Transform command ++*/ ++typedef struct _JPEG_DEBUGMB_T_ ++{ ++ U32 SMB_WORD_0; ++ U32 SMB_WORD_1; ++ U32 MbType; ++ U32 LmbWord2; ++ U32 Data2PipeWord[192]; ++ U32 BitBuf_LSB[6]; ++ U32 BitBuf_MSB[6]; ++} JPEG_DebugMb_t; ++#endif ++ ++#endif /* _JPEGDECHW_VIDEOTRANSFORMERTYPES_H_ */ ++ +diff --git a/interfaces/IDirectFBImageProvider/mme/transform/JPEG_VideoTransformerTypes.h b/interfaces/IDirectFBImageProvider/mme/transform/JPEG_VideoTransformerTypes.h +new file mode 100644 +index 0000000..c88ae6d +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/mme/transform/JPEG_VideoTransformerTypes.h +@@ -0,0 +1,192 @@ ++/* ++ ST Microelectronics MME JPEG transformer - user API ++ ++ (c) Copyright 2010 STMicroelectronics Ltd. ++ ++ All rights reserved. ++*/ ++ ++#ifndef __JPEG_VIDEOTRANSFORMERTYPES_H__ ++#define __JPEG_VIDEOTRANSFORMERTYPES_H__ ++ ++ ++#define JPEGDEC_MME_TRANSFORMER_NAME "JPEG_Transformer" ++ ++#if JPEGDEC_MME_VERSION == 0 ++# define JPEGDEC_MME_VERSION 1 ++#endif ++ ++#if (JPEGDEC_MME_VERSION == 20) ++# define JPEGDEC_MME_API_VERSION "2.0" ++#elif (JPEGDEC_MME_VERSION == 1) ++# define JPEGDEC_MME_API_VERSION "1.0" ++#else ++# error only API versions 1 or 2.0 are supported ++#endif ++ ++/* Common driver error constants */ ++#if (JPEGDEC_MME_VERSION == 1) ++# define JPEGDEC_ERROR_ID 0 ++# define JPEGDEC_ERROR_BASE (JPEG_ERROR_ID << 16) ++#else ++# include ++#endif ++ ++ ++ ++ ++#if (JPEGDEC_MME_VERSION == 1) ++/* Structure for GetTransformerCapability() */ ++typedef struct ++{ ++ /* for further expansion... */ ++ unsigned int dummy; ++} JPEGDEC_TransformerInfo_t; ++ ++typedef struct ++{ ++ unsigned int caps_len; ++}JPEGDEC_Capability_t; ++#elif (JPEGDEC_MME_VERSION == 20) ++enum JPEGDEC_TransformFlags { ++ JDIF_ROTATE90 = 0x00000001, ++ JDIF_ROTATE270 = 0x00000002, ++ JDIF_FLIP_HORIZONTAL = 0x00000004, ++ JDIF_FLIP_VERTICAL = 0x00000008, ++ JDIF_ALL = 0x0000000f, ++}; ++#endif ++ ++ ++ ++/* Structure for the Transformer Initialization */ ++typedef struct ++{ ++ /* coardinates for subregion decoding */ ++ unsigned int xvalue0; ++ unsigned int xvalue1; ++ unsigned int yvalue0; ++ unsigned int yvalue1; ++ ++ /* Output width and height of the decoded image. Used for IDCT select and ++ resizing (if done in the core). */ ++ int outputWidth; ++ int outputHeight; ++ ++#if (JPEGDEC_MME_VERSION == 1) ++ /* TRUE if Rotatedegree is other than zero degree ++ Rotation clockwise/anticlockwise is required */ ++ int ROTATEFLAG; ++ /* degree of rotation clockwise/anti-clockwise || 90 | 180 | 270 */ ++ int Rotatedegree; ++ /* Flag set TRUE when vertical flip of the picture is required */ ++ int VerticalFlip; ++ /* Flag set TRUE when vertical flip of the picture is required */ ++ int HorizantalFlip; ++ ++ /* the pitch. Valid only if ROTATEFLAG & 0x80000000 */ ++ int Pitch; ++#elif (JPEGDEC_MME_VERSION == 20) ++ /* you should really set this, otherwise some default value is used, which ++ doesn't necessarily coincides with what you assume. */ ++ int pitch; ++#endif ++} JPEGDEC_InitParams_t; ++ ++ ++ ++ ++ ++typedef enum ++{ ++ /* planar 3 buffer YCbCr, 4:4:4, 4:2:2 or 4:2:0 (not implemented) */ ++ /* 24 bit YUV planar (3 planes, Y Cb Cr, each 8 bit) */ ++ JPEGDEC_OF_YCbCr4xxp, ++ /* 16 bit YUV ( 8 bit Y plane followed by one ++ 16 bit half width CbCr [15:0] plane) */ ++ JPEGDEC_OF_NV16, ++ /* 16 bit YUV (4 byte/ 2 pixel, macropixel contains YCbYCr [31:0]) */ ++ JPEGDEC_OF_UYVY, ++ /* 24 bit VYU 4:4:4 (3 byte, Cr 8@16, Y 8@8, Cb 8@0) */ ++ JPEGDEC_OF_YCbCr444r, /* DSPF_VYU in DirectFB */ ++ /* 24 bit RGB (3 byte, red 8@16, green 8@8, blue 8@0) */ ++ JPEGDEC_OF_RGB, ++} JPEGDEC_OutputFormat_t; ++ ++ ++/* Structure for the databuffers passed with TRANSFORM commands */ ++typedef struct ++{ ++ /* Steering of size/widht/height of output picture */ ++ JPEGDEC_InitParams_t outputSettings; ++#if (JPEGDEC_MME_VERSION == 20) ++ JPEGDEC_OutputFormat_t OutputFormat; ++ enum JPEGDEC_TransformFlags flags; ++#endif ++} JPEGDEC_TransformParams_t; ++ ++ ++#if (JPEGDEC_MME_VERSION == 1) ++typedef enum ++{ ++ JPEG_NO_ERROR, ++ UNDEFINED_HUFF_TABLE, ++ UNSUPPORTED_MARKER, ++ UNABLE_ALLOCATE_MEMORY, ++ NON_SUPPORTED_SAMP_FACTORS, ++ BAD_PARAMETER, ++ DECODE_ERROR, ++ BAD_RESTART_MARKER, ++ UNSUPPORTED_COLORSPACE, ++ BAD_SOS_SPECTRAL, ++ BAD_SOS_SUCCESSIVE, ++ BAD_HEADER_LENGHT, ++ BAD_COUNT_VALUE, ++ BAD_DHT_MARKER, ++ BAD_INDEX_VALUE, ++ BAD_NUMBER_HUFFMAN_TABLES, ++ BAD_QUANT_TABLE_LENGHT, ++ BAD_NUMBER_QUANT_TABLES, ++ BAD_COMPONENT_COUNT, ++ DIVIDE_BY_ZERO_ERROR, ++ NOT_JPG_IMAGE, ++ UNSUPPORTED_ROTATION_ANGLE, ++ UNSUPPORTED_SCALING, ++ INSUFFICIENT_OUTPUTBUFFER_SIZE ++}JPEGDEC_ErrorCodes_t; ++#endif ++ ++ ++/* Structure for return parameters of TRANSFORM commands */ ++typedef struct ++{ ++ /* bytes written to the o/p buffer sent back to the host */ ++ unsigned int bytes_written; ++ /* scaled image output height / width */ ++ int decodedImageHeight; ++ int decodedImageWidth; ++ ++#if (JPEGDEC_MME_VERSION == 1) ++ unsigned int Total_cycle; ++ unsigned int DMiss_Cycle; ++ unsigned int IMiss_Cycle; ++ JPEGDEC_ErrorCodes_t ErrorType; ++#elif (JPEGDEC_MME_VERSION == 20) ++ ++ int pitch; ++ ++ J_MESSAGE_CODE ErrorType; ++# if defined(JPEGDEC_PROFILING_ENABLE) ++ unsigned int Cycles; ++ unsigned int Bundles; ++ unsigned int ICacheMiss; ++ unsigned int DCacheMiss; ++ unsigned int NopBundles; ++# endif ++ ++#endif ++} JPEGDEC_TransformReturnParams_t; ++ ++ ++ ++#endif /* __JPEG_VIDEOTRANSFORMERTYPES_H__ */ +diff --git a/interfaces/IDirectFBImageProvider/mme/transform/PNGDecode_interface.h b/interfaces/IDirectFBImageProvider/mme/transform/PNGDecode_interface.h +new file mode 100644 +index 0000000..ea3516d +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/mme/transform/PNGDecode_interface.h +@@ -0,0 +1,191 @@ ++#ifndef PNGDECODERINTERFACE_H ++#define PNGDECODERINTERFACE_H ++ ++#define PNGDECODER_MME_TRANSFORMER_NAME "PNGDECODER" ++ ++#if (PNGDEC_MME_VERSION == 11) ++ #define PNGDECODER_MME_API_VERSION "1.1" ++#elif (PNGDEC_MME_VERSION == 10) ++ #define PNGDECODER_MME_API_VERSION "1.0" ++#else ++ #define PNGDECODER_MME_API_VERSION "undefined" ++#endif ++ ++#define PNGDECODE_COLOR_MASK_PALETTE 1 ++#define PNGDECODE_COLOR_MASK_COLOR 2 ++#define PNGDECODE_COLOR_MASK_ALPHA 4 ++ ++#define PNGDECODE_MAX_PALETTE 256 ++ ++typedef enum ++{ ++ PNGDECODE_COLOR_TYPE_GRAY = 0 /* PNG_COLOR_TYPE_GRAY */, ++ PNGDECODE_COLOR_TYPE_PALETTE = PNGDECODE_COLOR_MASK_COLOR | PNGDECODE_COLOR_MASK_PALETTE /* PNG_COLOR_TYPE_PALETTE */, ++ PNGDECODE_COLOR_TYPE_RGB = PNGDECODE_COLOR_MASK_COLOR /* PNG_COLOR_TYPE_RGB */, ++ PNGDECODE_COLOR_TYPE_RGB_ALPHA = PNGDECODE_COLOR_MASK_COLOR | PNGDECODE_COLOR_MASK_ALPHA /* PNG_COLOR_TYPE_RGB_ALPHA */, ++ PNGDECODE_COLOR_TYPE_GRAY_ALPHA = PNGDECODE_COLOR_MASK_ALPHA /* PNG_COLOR_TYPE_GRAY_ALPHA*/ ++}PNGDecode_ColorType_t; ++ ++typedef enum ++{ ++ PNGDECODE_INTERLACE_NONE = 0 /* PNG_INTERLACE_NONE */, ++ PNGDECODE_INTERLACE_ADAM7 = 1 /* PNG_INTERLACE_ADAM7 */ ++}PNGDecode_InterlaceType_t; ++ ++typedef enum ++{ ++ PNGDECODE_COMPRESSION_TYPE_BASE = 0 /* PNG_COMPRESSION_TYPE_BASE */ ++}PNGDecode_CompressionType_t; ++ ++ ++typedef enum ++{ ++ PNGDECODE_FILTER_TYPE_BASE = 0 /* PNG_FILTER_TYPE_BASE */ ++}PNGDecode_FilterMethod_t; ++ ++/* for an MME_TRANSFORM command the ones marked with a star or plus denote ++ possibly corrupt data when seen together with MME_INVALID_ARGUMENT. A plus ++ is given for PNGDEC_MME_VERSION == 10 and a star for ++ PNGDEC_MME_VERSION == 11. In theory, PNGDECODE_MEMORY_ALLOCATION_ERROR ++ could denote corrupt data, too, but it's unlikely any data was decoded ++ at all, thus it doesn't make sense to display the result, either try ++ again or use libpng on the host! For version 10, ++ PNGDECODE_INTERNAL_ERROR is returned in more occasions than just data ++ corruption. */ ++typedef enum ++{ ++ PNGDECODE_NO_ERROR, ++ PNGDECODE_MEMORY_ALLOCATION_ERROR, ++ PNGDECODE_CRC_ERROR /* +* */, ++ PNGDECODE_INVALID_STREAM /* +* */, ++ PNGDECODE_INTERNAL_ERROR /* + */ ++#if (PNGDEC_MME_VERSION > 10) ++ ,PNGDECODE_INVALID_ARGUMENT ++ ,PNGDECODE_STREAM_ERROR /* * */ ++#endif ++} PNGDecode_ErrorCodes_t; ++ ++ ++typedef struct ++{ ++ /* Picture Width in pixels */ ++ unsigned int PictureWidth; ++ ++ /* Picture Height in pixels */ ++ unsigned int PictureHeight; ++ ++ /* bitstream information: */ ++ /* Number of bits per sample or palette index */ ++ unsigned int BitDepth; ++ /* Color type as encoded in the bitstream */ ++ PNGDecode_ColorType_t ColorType; ++ /* Transmission order of image data */ ++ PNGDecode_InterlaceType_t InterlaceType; ++ /* Only compression type 0 is supported */ ++ PNGDecode_CompressionType_t CompressionType; ++ /* Only Filter method 0 is supported */ ++ PNGDecode_FilterMethod_t FilterMethod; ++ ++ PNGDecode_ErrorCodes_t ErrorType; ++ ++#if (PNGDEC_MME_VERSION > 10) ++ /* transformer return params: */ ++ /* Color type as returned by the transformer: ++ - PNGDECODE_COLOR_TYPE_PALETTE (LUT8) ++ - PNGDECODE_COLOR_TYPE_RGB (RGB24) ++ - PNGDECODE_COLOR_TYPE_RGB_ALPHA (ARGB32) */ ++ PNGDecode_ColorType_t ColorFormatOutput; ++ ++ int HaveColorKey; ++ unsigned int ColorKey; /* 32 bit xRGB */ ++ ++ unsigned int pitch; ++ ++ unsigned char palette[4 * PNGDECODE_MAX_PALETTE]; /* ARGB ARGB ARGB */ ++#endif ++} PNGDecode_GlobalTransformReturnParams_t; ++ ++ ++#if (PNGDEC_MME_VERSION == 10) ++ ++typedef enum ++{ ++ /* always ARGB */ ++ PNGDECODE_OUTPUTFORMAT_ARGB = 0 ++} PNGDecode_OutputFormat_t; ++ ++typedef struct ++{ ++ /* indicates seven step display in case of interlaced pictures */ ++ unsigned int ProgressiveDisplayFlag; ++ PNGDecode_OutputFormat_t OutputFormat; ++} PNGDecode_GlobalParams_t; ++ ++typedef struct ++{ ++ unsigned int caps_len; ++} caps_len_t; ++ ++typedef struct ++{ ++ unsigned char *caps; ++} caps_t; ++ ++#elif (PNGDEC_MME_VERSION > 10) ++ ++typedef enum ++{ ++ /* PNGDecode_OutputFormat_t, valid in PNGDecode_GlobalParams_t and ++ PNGDecode_InitTransformerParams_t */ ++ PNGDECODE_PARAM_FORMAT = 0x00000001, ++ /* pitch, only valid in PNGDecode_TransformParams_t */ ++ PNGDECODE_PARAM_PITCH = 0x00000002 ++} PNGDecode_Params_Flags_t; ++ ++typedef enum ++{ ++ /* expand everything to RGB24 (if the image has no alpha components, else ++ to ARGB32) */ ++ PNGDECODE_OF_EXPAND, ++ /* keep indexed images: ++ - LUT8 for all (non alpha) greyscale (any bitdepth) and 8bit palette ++ images ++ - RGB24 for all other non alpha images ++ - ARGB32 for alpha images */ ++ PNGDECODE_OF_COMPRESSED, ++ /* always expand to ARGB32 */ ++ PNGDECODE_OF_EXPAND_FORCE_ALPHA ++} PNGDecode_OutputFormat_t; ++ ++typedef struct ++{ ++ PNGDecode_Params_Flags_t flags; ++ /* if not specified, PNGDECODE_OF_EXPAND is assumed */ ++ PNGDecode_OutputFormat_t format; ++ /* if not specified, the pitch will be as returned in ++ PNGDecode_GlobalTransformReturnParams_t */ ++ int pitch; ++} PNGDecode_InitTransformerParams_t, ++ PNGDecode_TransformParams_t, ++ PNGDecode_GlobalParams_t; ++ ++#endif ++ ++ ++typedef struct ++{ /* Number of bytes written by the decoder into the output buffer*/ ++ unsigned int BytesWritten; ++ /* Error encountered while decoding the picture */ ++ PNGDecode_ErrorCodes_t ErrorType; ++ ++#if defined(PNGDECODE_PROFILING_ENABLE) ++ unsigned int Cycles; ++ unsigned int Bundles; ++ unsigned int ICacheMiss; ++ unsigned int DCacheMiss; ++ unsigned int NopBundles; ++#endif ++} PNGDecode_TransformReturnParams_t; ++ ++ ++#endif /* PNGDECODERINTERFACE_H */ +diff --git a/interfaces/IDirectFBImageProvider/mme_helper.h b/interfaces/IDirectFBImageProvider/mme_helper.h +new file mode 100644 +index 0000000..786d6e6 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/mme_helper.h +@@ -0,0 +1,1042 @@ ++#ifndef __MME_HELPER_H__ ++#define __MME_HELPER_H__ ++ ++ ++#if defined(USE_MME) ++#include ++#include ++#include ++#endif /* USE_MME */ ++#include ++#include "sema_helper.h" ++ ++#define likely(x) __builtin_expect(!!(x),1) ++#define unlikely(x) __builtin_expect(!!(x),0) ++ ++#define container_of(ptr, type, member) ({ \ ++ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ ++ (type *)( (char *)__mptr - offsetof(type,member) );}) ++ ++#ifndef MAX_STREAMING_COMMANDS ++ #define MAX_STREAMING_COMMANDS 5 ++#endif ++#ifndef MME_STREAMING_BUFFERSIZE ++ #define MME_STREAMING_BUFFERSIZE (32 * 1024) /* this must _not_ be less ++ than 8 k */ ++#endif ++ ++ ++#if defined(USE_MME) ++struct _MMEHelper_buffer { ++ MME_DataBuffer_t *buffer; ++ MME_Command_t command; ++ sem_t sema; ++}; ++#endif /* USE_MME */ ++ ++typedef struct _MMECommon ++{ ++ IDirectFBImageProvider_data base; ++ ++ const char *name; ++ ++ void *image; /* decoded image data */ ++ unsigned int width; /* width of the JPEG/PNG image */ ++ unsigned int height; /* height of the JPEG/PNG image */ ++ ++#ifdef DIRECT_BUILD_DEBUG ++ /* performance monitoring */ ++ struct timeval starttime, endtime; ++#endif /* DIRECT_BUILD_DEBUG */ ++ ++ CoreSurface *decode_surface; ++ CoreGraphicsSerial serial; ++ ++ unsigned int decoded_width; ++ unsigned int decoded_height; ++ ++#if defined(USE_MME) ++ bool name_set; ++ const char *transformer_name; ++ ++ /* hardware decode specifics */ ++ MME_TransformerHandle_t Handle; ++ ++ MME_DataBuffer_t **OutDataBuffers; ++ MME_ScatterPage_t OutDataBufferScatterPage; ++ MME_DataBuffer_t OutDataBuffer; ++ ++ struct _MMEHelper_buffer SendDataBuffers[MAX_STREAMING_COMMANDS]; ++ ++ MME_Command_t TransformCommand; /* provide the output buffer and request ++ transform */ ++ ++ pthread_mutex_t pending_commands_lock; ++ DirectHash *pending_commands; ++ unsigned int n_pending_buffers; ++ ++ sem_t decode_event; ++ ++ int decode_success; ++ ++ /* bytes remaining to be decoded */ ++ unsigned int bytes; ++ unsigned int packets; ++ ++ /* just for statistics */ ++ unsigned int n_underflows; ++#endif /* USE_MME */ ++} MMECommon; ++ ++ ++#if defined(USE_MME) ++/* every user should provide those... */ ++static void TransformerCallback( MME_Event_t Event, ++ MME_Command_t *CallbackData, ++ void *UserData ); ++static DFBResult abort_transformer( struct _MMECommon *mme ); ++static DFBResult fetch_data( IDirectFBDataBuffer *buffer, ++ MME_DataBuffer_t *dbuf, ++ int len ); ++static void ++_imageprovider_update_transform_params (MMECommon * const mme, ++ void * const params, ++ const CoreSurfaceBufferLock * const lock); ++#endif /* USE_MME */ ++ ++ ++static DFBResult ++buffer_to_ptr_copy (IDirectFBDataBuffer * const buffer, ++ void * ptr, ++ int len) ++{ ++ DFBResult ret; ++ ++ while (len > 0) ++ { ++ unsigned int read; ++ ++ ret = buffer->WaitForData (buffer, len); ++ if (ret == DFB_OK) ++ ret = buffer->GetData (buffer, len, ptr, &read); ++ ++ if (ret) ++ return ret; ++ ++ ptr += read; ++ len -= read; ++ } ++ ++ return DFB_OK; ++} ++ ++ ++#if !defined(USE_MME) ++ ++#define mme_helper_LoadLib (data) DFB_FILENOTFOUND ++#define mme_helper_UnloadLib (struct _MMECommon * const data) {( )} ++ ++#else /* USE_MME */ ++ ++/* Some Error and Debug Management */ ++ ++ ++static inline const char * ++get_mme_event_string (MME_Event_t ev) ++{ ++ static const char *mme_event_strings[] = { ++ "MME_COMMAND_COMPLETED_EVT", ++ "MME_DATA_UNDERFLOW_EVT", ++ "MME_NOT_ENOUGH_MEMORY_EVT", ++ "MME_NEW_COMMAND_EVT", ++ }; ++ ++ return (((unsigned int) ev) < D_ARRAY_SIZE (mme_event_strings)) ++ ? mme_event_strings[ev] ++ : "* Unknown Event code *"; ++} ++ ++static inline const char * ++get_mme_state_string (MME_CommandState_t s) ++{ ++ static const char *mme_command_state_strings[] ={ ++ "MME_COMMAND_IDLE", ++ "MME_COMMAND_PENDING", ++ "MME_COMMAND_EXECUTING", ++ "MME_COMMAND_COMPLETED", ++ "MME_COMMAND_FAILED" ++ }; ++ ++ return (((unsigned int) s) < D_ARRAY_SIZE (mme_command_state_strings)) ++ ? mme_command_state_strings[s] ++ : "* Unknown State code *"; ++} ++ ++static inline const char * ++get_mme_error_string (MME_ERROR e) ++{ ++ static const char *mme_error_type_strings[] = { ++ "MME_SUCCESS", ++ "MME_DRIVER_NOT_INITIALIZED", ++ "MME_DRIVER_ALREADY_INITIALIZED", ++ "MME_NOMEM", ++ "MME_INVALID_TRANSPORT", ++ "MME_INVALID_HANDLE", ++ "MME_INVALID_ARGUMENT", ++ "MME_UNKNOWN_TRANSFORMER", ++ "MME_TRANSFORMER_NOT_RESPONDING", ++ "MME_HANDLES_STILL_OPEN", ++ "MME_COMMAND_STILL_EXECUTING", ++ "MME_COMMAND_ABORTED", ++ "MME_DATA_UNDERFLOW", ++ "MME_DATA_OVERFLOW", ++ "MME_TRANSFORM_DEFERRED", ++ "MME_SYSTEM_INTERRUPT", ++ "MME_EMBX_ERROR", ++ "MME_INTERNAL_ERROR", ++ "MME_NOT_IMPLEMENTED" ++ }; ++ ++ return (((unsigned int) e) < D_ARRAY_SIZE (mme_error_type_strings)) ++ ? mme_error_type_strings[e] ++ : "* Unknown Error code *"; ++} ++ ++ ++#if defined(MME_USE_DLOPEN) ++#include ++typedef MME_ERROR (*MME_Init_func) (void); ++typedef MME_ERROR (*MME_Term_func) (void); ++typedef MME_ERROR (*MME_SendCommand_func) (MME_TransformerHandle_t Handle, ++ MME_Command_t *CmdInfo_p); ++typedef MME_ERROR (*MME_AbortCommand_func) (MME_TransformerHandle_t Handle, ++ MME_CommandId_t CmdId); ++typedef MME_ERROR (*MME_AllocDataBuffer_func) (MME_TransformerHandle_t handle, ++ MME_UINT size, ++ MME_AllocationFlags_t flags, ++ MME_DataBuffer_t **dataBuffer_p); ++typedef MME_ERROR (*MME_FreeDataBuffer_func) (MME_DataBuffer_t *DataBuffer_p); ++typedef MME_ERROR (*MME_GetTransformerCapability_func) (const char *TransformerName, ++ MME_TransformerCapability_t *TransformerCapability_p); ++typedef MME_ERROR (*MME_InitTransformer_func) (const char *Name, ++ MME_TransformerInitParams_t *Params_p, ++ MME_TransformerHandle_t *Handle_p); ++typedef MME_ERROR (*MME_IsTransformerRegistered_func) (const char *name); ++typedef MME_ERROR (*MME_TermTransformer_func) (MME_TransformerHandle_t handle); ++typedef const char (*MME_Version_func) (void); ++ ++static MME_ERROR _mme_helper_MME_func (void) ++{ ++ return MME_DRIVER_NOT_INITIALIZED; ++} ++ ++static MME_Init_func _MME_Init = (MME_Init_func) _mme_helper_MME_func; ++static MME_Term_func _MME_Term = (MME_Term_func) _mme_helper_MME_func; ++static MME_SendCommand_func _MME_SendCommand = (MME_SendCommand_func) _mme_helper_MME_func; ++static MME_AbortCommand_func _MME_AbortCommand = (MME_AbortCommand_func) _mme_helper_MME_func; ++static MME_AllocDataBuffer_func _MME_AllocDataBuffer = (MME_AllocDataBuffer_func) _mme_helper_MME_func; ++static MME_FreeDataBuffer_func _MME_FreeDataBuffer = (MME_FreeDataBuffer_func) _mme_helper_MME_func; ++static MME_GetTransformerCapability_func _MME_GetTransformerCapability = (MME_GetTransformerCapability_func) _mme_helper_MME_func; ++static MME_InitTransformer_func _MME_InitTransformer = (MME_InitTransformer_func) _mme_helper_MME_func; ++static MME_IsTransformerRegistered_func _MME_IsTransformerRegistered = (MME_IsTransformerRegistered_func) _mme_helper_MME_func; ++static MME_TermTransformer_func _MME_TermTransformer = (MME_TermTransformer_func) _mme_helper_MME_func; ++static MME_Version_func _MME_Version = (MME_Version_func) _mme_helper_MME_func; ++#define MME_Init _MME_Init ++#define MME_Term _MME_Term ++#define MME_SendCommand _MME_SendCommand ++#define MME_AbortCommand _MME_AbortCommand ++#define MME_AllocDataBuffer _MME_AllocDataBuffer ++#define MME_FreeDataBuffer _MME_FreeDataBuffer ++#define MME_GetTransformerCapability _MME_GetTransformerCapability ++#define MME_InitTransformer _MME_InitTransformer ++#define MME_IsTransformerRegistered _MME_IsTransformerRegistered ++#define MME_TermTransformer _MME_TermTransformer ++#define MME_Version _MME_Version ++ ++static void *mme_helper_libmme; ++#endif /* MME_USE_DLOPEN */ ++ ++static bool mme_lib_inited; ++ ++ ++static void ++__attribute__((constructor)) ++mme_helper_ctor(void) ++{ ++#if defined(MME_USE_DLOPEN) ++ if ((mme_helper_libmme = dlopen ("libmme.so", RTLD_LAZY)) != NULL ++ || (mme_helper_libmme = dlopen ("libmme_host.so", RTLD_LAZY)) != NULL) ++ { ++ _MME_Init = dlsym (mme_helper_libmme, "MME_Init"); ++ _MME_Term = dlsym (mme_helper_libmme, "MME_Term"); ++ _MME_SendCommand = dlsym (mme_helper_libmme, "MME_SendCommand"); ++ _MME_AbortCommand = dlsym (mme_helper_libmme, "MME_AbortCommand"); ++ _MME_AllocDataBuffer = dlsym (mme_helper_libmme, "MME_AllocDataBuffer"); ++ _MME_FreeDataBuffer = dlsym (mme_helper_libmme, "MME_FreeDataBuffer"); ++ _MME_GetTransformerCapability = dlsym (mme_helper_libmme, "MME_GetTransformerCapability"); ++ _MME_InitTransformer = dlsym (mme_helper_libmme, "MME_InitTransformer"); ++ ++ /* only available in Multicom 4 and onward */ ++ _MME_Version = dlsym (mme_helper_libmme, "MME_Version"); ++ if (_MME_Version) ++ _MME_IsTransformerRegistered = dlsym (mme_helper_libmme, "MME_IsTransformerRegistered"); ++ ++ _MME_TermTransformer = dlsym (mme_helper_libmme, "MME_TermTransformer"); ++ ++ if (unlikely (!_MME_Init || !_MME_Term ++ || !_MME_SendCommand || !_MME_AbortCommand ++ || !_MME_AllocDataBuffer || !_MME_FreeDataBuffer ++ || !_MME_GetTransformerCapability ++ || (_MME_Version && !_MME_IsTransformerRegistered) ++ || !_MME_InitTransformer || !_MME_TermTransformer)) ++ { ++ _MME_Init = (MME_Init_func) _mme_helper_MME_func; ++ _MME_Term = (MME_Term_func) _mme_helper_MME_func; ++ _MME_SendCommand = (MME_SendCommand_func) _mme_helper_MME_func; ++ _MME_AbortCommand = (MME_AbortCommand_func) _mme_helper_MME_func; ++ _MME_AllocDataBuffer = (MME_AllocDataBuffer_func) _mme_helper_MME_func; ++ _MME_FreeDataBuffer = (MME_FreeDataBuffer_func) _mme_helper_MME_func; ++ _MME_GetTransformerCapability = (MME_GetTransformerCapability_func) _mme_helper_MME_func; ++ _MME_InitTransformer = (MME_InitTransformer_func) _mme_helper_MME_func; ++ _MME_IsTransformerRegistered = (MME_IsTransformerRegistered_func) _mme_helper_MME_func; ++ _MME_TermTransformer = (MME_TermTransformer_func) _mme_helper_MME_func; ++ _MME_Version = (MME_Version_func) _mme_helper_MME_func; ++ ++ dlclose (mme_helper_libmme); ++ mme_helper_libmme = NULL; ++ ++ D_WARN ("Unable to use libmme.so for "MME_TEXT_DOMAIN": (%s)", ++ dlerror ()); ++ } ++ else ++#endif /* MME_USE_DLOPEN */ ++ { ++ MME_ERROR mme_res = MME_Init (); ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "MME_Init() returned %d (%s)\n", ++ mme_res, get_mme_error_string (mme_res)); ++ switch (mme_res) ++ { ++ case MME_DRIVER_ALREADY_INITIALIZED: ++ mme_res = MME_SUCCESS; ++ case MME_SUCCESS: ++ break; ++ ++ default: ++ /* probably kernel module or /dev node required */ ++ D_ONCE ("failed to initialize MME for "MME_TEXT_DOMAIN": %d (%s)", ++ mme_res, get_mme_error_string (mme_res)); ++ break; ++ } ++ ++ mme_lib_inited = (mme_res == MME_SUCCESS); ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "mme_lib_inited %d\n", mme_lib_inited); ++ } ++#if defined(MME_USE_DLOPEN) ++ } ++ else ++ D_INFO ("Couldn't resolve libmme.so for "MME_TEXT_DOMAIN", can't " ++ "use MME for hw accelerated decoding\n"); ++#endif /* MME_USE_DLOPEN */ ++} ++ ++static void ++__attribute__((destructor)) ++mme_helper_dtor(void) ++{ ++ /* we can't MME_Term() here - there might be other users of MME still ++ active. MME should implement some use counters instead. */ ++// MME_ERROR mme_res = MME_Term (); ++// D_DEBUG_AT (MME_DEBUG_DOMAIN, "MME_Term() returned %d (%s)\n", ++// mme_res, get_mme_error_string (mme_res)); ++ mme_lib_inited = false; ++ ++#if defined(MME_USE_DLOPEN) ++ if (mme_helper_libmme) ++ { ++ _MME_Init = (MME_Init_func) _mme_helper_MME_func; ++ _MME_Term = (MME_Term_func) _mme_helper_MME_func; ++ _MME_SendCommand = (MME_SendCommand_func) _mme_helper_MME_func; ++ _MME_AbortCommand = (MME_AbortCommand_func) _mme_helper_MME_func; ++ _MME_AllocDataBuffer = (MME_AllocDataBuffer_func) _mme_helper_MME_func; ++ _MME_FreeDataBuffer = (MME_FreeDataBuffer_func) _mme_helper_MME_func; ++ _MME_InitTransformer = (MME_InitTransformer_func) _mme_helper_MME_func; ++ _MME_IsTransformerRegistered = (MME_IsTransformerRegistered_func) _mme_helper_MME_func; ++ _MME_TermTransformer = (MME_TermTransformer_func) _mme_helper_MME_func; ++ _MME_Version = (MME_Version_func) _mme_helper_MME_func; ++ ++ dlclose (mme_helper_libmme); ++ mme_helper_libmme = NULL; ++ } ++#endif /* MME_USE_DLOPEN */ ++} ++ ++ ++/***************************************/ ++ ++static DFBResult ++__attribute__((unused)) ++_mme_helper_get_capability (struct _MMECommon * const data, ++ const char * const name, ++ MME_TransformerCapability_t * const cap) ++{ ++ volatile u32 _len = 0; ++ MME_ERROR res; ++ ++ cap->TransformerInfoSize = sizeof (_len); ++ cap->TransformerInfo_p = (u32 *) &_len; ++ ++ cap->StructSize = sizeof (*cap); ++ ++ res = MME_GetTransformerCapability (name, cap); ++ if (res != MME_SUCCESS) ++ return DFB_FAILURE; ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, ++ "'%s' 1: sz/v/it/ot/is/p: %u, %u (%x), %.2x%.2x%.2x%.2x, " ++ "%.2x%.2x%.2x%.2x, %u, %p (%u bytes)\n", ++ name, ++ cap->StructSize, cap->Version, cap->Version, ++ cap->InputType.FourCC[0], cap->InputType.FourCC[1], ++ cap->InputType.FourCC[2], cap->InputType.FourCC[3], ++ cap->OutputType.FourCC[0], cap->OutputType.FourCC[1], ++ cap->OutputType.FourCC[2], cap->OutputType.FourCC[3], ++ cap->TransformerInfoSize, cap->TransformerInfo_p, _len); ++ if (_len) ++ { ++ char *buf = D_CALLOC (1, _len); ++ ++ cap->TransformerInfo_p = buf; ++ cap->TransformerInfoSize = _len; ++ ++ res = MME_GetTransformerCapability (name, cap); ++ if (res != MME_SUCCESS) ++ { ++ D_FREE (buf); ++ return DFB_FAILURE; ++ } ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, ++ "'%s' 2: sz/v/it/ot/is/p: %u, %u (%x), '%c%c%c%c' " ++ "(%.2x%.2x%.2x%.2x), '%c%c%c%c' (%.2x%.2x%.2x%.2x), %u, " ++ "%p (%u bytes)\n", ++ name, ++ cap->StructSize, cap->Version, cap->Version, ++ cap->InputType.FourCC[0], cap->InputType.FourCC[1], ++ cap->InputType.FourCC[2], cap->InputType.FourCC[3], ++ cap->InputType.FourCC[0], cap->InputType.FourCC[1], ++ cap->InputType.FourCC[2], cap->InputType.FourCC[3], ++ cap->OutputType.FourCC[0], cap->OutputType.FourCC[1], ++ cap->OutputType.FourCC[2], cap->OutputType.FourCC[3], ++ cap->OutputType.FourCC[0], cap->OutputType.FourCC[1], ++ cap->OutputType.FourCC[2], cap->OutputType.FourCC[3], ++ cap->TransformerInfoSize, cap->TransformerInfo_p, _len); ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "caps: '%s'\n", buf); ++ ++ D_FREE (buf); ++ cap->TransformerInfo_p = NULL; ++ } ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++mme_helper_deinit_transformer (struct _MMECommon * const data) ++{ ++ MME_ERROR ret; ++ ++ if (!data->Handle) ++ return DFB_OK; ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "terminating %s transformer w/ handle %x\n", ++ data->name, data->Handle); ++ ++ /* if we are still waiting for the main decode command to finish (because ++ we ran out of data but the transformer is still waiting), abort it. ++ JPEG needs this. */ ++ /* FIXME: what about locking? */ ++ if (direct_hash_lookup (data->pending_commands, ++ data->TransformCommand.CmdStatus.CmdId)) ++ { ++ abort_transformer (data); ++ while ((sema_wait_event (&data->decode_event) == -1) ++ && errno == EINTR) ++ ; ++ } ++ ++ if (data->n_underflows) ++ { ++ D_INFO ("%s: %d data underflow(s) during decode\n", ++ data->name, data->n_underflows); ++ data->n_underflows = 0; ++ } ++ ++ ret = MME_TermTransformer (data->Handle); ++ if (ret != MME_SUCCESS) ++ { ++ D_WARN ("(%5d) Couldn't terminate %s transformer w/ handle %x: %d (%s)", ++ direct_gettid (), data->name, data->Handle, ret, ++ get_mme_error_string (ret)); ++ return DFB_FAILURE; ++ } ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, " -> terminated %s transformer w/ handle %x\n", ++ data->name, data->Handle); ++ ++ if (data->pending_commands) ++ { ++ pthread_mutex_destroy (&data->pending_commands_lock); ++ direct_hash_destroy (data->pending_commands); ++ data->pending_commands = NULL; ++ } ++ ++ data->Handle = 0; ++ return DFB_OK; ++} ++ ++static DFBResult ++mme_helper_init_transformer2 (struct _MMECommon * const data, ++ const char const * const transformer_names[], ++ size_t transformer_params_size, ++ void * const transformer_params, ++ unsigned int * const ret_index, ++ MME_GenericCallback_t Callback) ++{ ++ DFBResult dfb_res; ++ unsigned int index; ++ ++ MME_ERROR ret; ++ MME_TransformerInitParams_t params; ++ ++ D_ASSUME (data->Handle == 0); ++ D_ASSUME ((transformer_params_size == 0 && transformer_params == NULL) ++ || (transformer_params_size && transformer_params)); ++ ++ if (!mme_lib_inited) ++ return DFB_NOSUCHINSTANCE; ++ ++ params.StructSize = sizeof (params); ++ params.Priority = MME_PRIORITY_BELOW_NORMAL; ++ params.Callback = Callback; ++ params.CallbackUserData = data; ++ params.TransformerInitParamsSize = transformer_params_size; ++ params.TransformerInitParams_p = transformer_params; ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "initializing %s tranformer:\n", data->name); ++ ++ index = 0; ++ do ++ { ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, " -> %s\n", transformer_names[index]); ++ ++ if (MME_IsTransformerRegistered != (MME_IsTransformerRegistered_func) _mme_helper_MME_func) ++ { ++ ret = MME_IsTransformerRegistered (transformer_names[index]); ++ if (ret != MME_SUCCESS) ++ continue; ++ } ++ ++ ret = MME_InitTransformer (transformer_names[index], ++ ¶ms, &data->Handle); ++ } ++ while (ret != MME_SUCCESS && transformer_names[++index] != NULL); ++ ++ if (ret != MME_SUCCESS) ++ { ++ if (ret != MME_DRIVER_NOT_INITIALIZED ++ && ret != MME_DRIVER_ALREADY_INITIALIZED ++ && ret != MME_UNKNOWN_TRANSFORMER) ++ D_WARN ("(%5d) %s transformer initialisation failed: %s", ++ direct_gettid (), data->name, get_mme_error_string (ret)); ++ data->Handle = 0; ++ return DFB_IDNOTFOUND; ++ } ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, " -> OK (handle %x)\n", data->Handle); ++ ++ D_ASSUME (data->n_pending_buffers == 0); ++ data->n_pending_buffers = 0; ++ pthread_mutex_init (&data->pending_commands_lock, NULL); ++ if ((dfb_res = direct_hash_create (17, &data->pending_commands)) != DFB_OK) ++ { ++ data->pending_commands = NULL; ++ mme_helper_deinit_transformer (data); ++ } ++ ++ if (ret_index) ++ *ret_index = index; ++ ++ return dfb_res; ++} ++ ++static DFBResult ++mme_helper_init_transformer (struct _MMECommon * const data, ++ const char const * const transformer_names[], ++ size_t transformer_params_size, ++ void * const transformer_params, ++ unsigned int * const ret_index) ++{ ++ return mme_helper_init_transformer2 (data, transformer_names, ++ transformer_params_size, ++ transformer_params, ++ ret_index, ++ &TransformerCallback); ++} ++ ++ ++/* Create MME_DataBuffer Structures required to map an Existing Buffer */ ++static void ++create_MME_output_data_buffer (struct _MMECommon * const data, ++ MME_DataBuffer_t * const buf, ++ unsigned int flags, ++ void * const dstbuf, ++ unsigned int size) ++{ ++ buf->StructSize = sizeof (MME_DataBuffer_t); ++ buf->Flags = flags; ++ buf->StreamNumber = 0; ++ buf->NumberOfScatterPages = 1; ++ ++ /* create scatter page detail */ ++ buf->ScatterPages_p = &data->OutDataBufferScatterPage; ++ buf->TotalSize = size; ++ buf->StartOffset = 0; ++ ++ /* scatter page for the data buffer passed in */ ++ buf->ScatterPages_p[0].Page_p = dstbuf; ++ buf->ScatterPages_p[0].Size = size; ++ buf->ScatterPages_p[0].BytesUsed = 0; ++ buf->ScatterPages_p[0].FlagsIn = 0; ++ buf->ScatterPages_p[0].FlagsOut = 0; ++} ++ ++ ++static inline DFBResult ++buffer_to_mme_copy (IDirectFBDataBuffer * const buffer, ++ MME_DataBuffer_t * const dbuf, ++ int len) ++{ ++ dbuf->ScatterPages_p[0].BytesUsed = len; ++ ++ return buffer_to_ptr_copy (buffer, dbuf->ScatterPages_p[0].Page_p, len); ++} ++ ++ ++ ++ ++static DFBResult ++_mme_helper_start_transformer_core (struct _MMECommon * const data, ++ size_t return_params_size, ++ void * const return_params, ++ size_t params_size, ++ void * const params, ++ CoreSurface * const dst_surface, ++ CoreSurfaceBufferLock * const lock) ++{ ++ DFBResult res; ++ unsigned int buffersize; ++ ++ D_ASSERT (data->OutDataBuffers == NULL); ++ ++ res = dfb_surface_lock_buffer (dst_surface, CSBR_BACK, CSAID_ACCEL0, ++ CSAF_WRITE, lock); ++ if (res != DFB_OK) ++ return res; ++ ++ buffersize = lock->pitch * dst_surface->config.size.h; ++ ++ data->OutDataBuffers = (MME_DataBuffer_t **) D_MALLOC (sizeof (MME_DataBuffer_t *)); ++ if (!data->OutDataBuffers) ++ goto out; ++ create_MME_output_data_buffer (data, &data->OutDataBuffer, ++ MME_ALLOCATION_PHYSICAL, ++ lock->addr, buffersize); ++ data->OutDataBuffers[0] = &data->OutDataBuffer; ++ ++ data->TransformCommand.DataBuffers_p = data->OutDataBuffers; ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "surface locked @ %p (pitch %u)\n", ++ lock->addr, lock->pitch); ++ ++ /* init the commandstatus */ ++ memset (&(data->TransformCommand.CmdStatus), 0, sizeof (MME_CommandStatus_t)); ++ data->TransformCommand.CmdStatus.AdditionalInfoSize = return_params_size; ++ data->TransformCommand.CmdStatus.AdditionalInfo_p = return_params; ++ ++ /* Setting up the command */ ++ data->TransformCommand.StructSize = sizeof (MME_Command_t); ++ data->TransformCommand.CmdCode = MME_TRANSFORM; ++ data->TransformCommand.CmdEnd = MME_COMMAND_END_RETURN_NOTIFY; ++ data->TransformCommand.DueTime = (MME_Time_t) 0; ++ data->TransformCommand.NumberInputBuffers = 0; ++ data->TransformCommand.NumberOutputBuffers = 1; ++ data->TransformCommand.ParamSize = params_size; ++ data->TransformCommand.Param_p = params; ++ ++ data->TransformCommand.DataBuffers_p[0]->ScatterPages_p[0].Size ++ = data->TransformCommand.DataBuffers_p[0]->TotalSize; ++ data->TransformCommand.DataBuffers_p[0]->ScatterPages_p[0].BytesUsed = 0; ++ data->TransformCommand.DataBuffers_p[0]->ScatterPages_p[0].FlagsIn = 0; ++ data->TransformCommand.DataBuffers_p[0]->ScatterPages_p[0].FlagsOut = 0; ++ ++ return DFB_OK; ++ ++out: ++ dfb_surface_unlock_buffer (dst_surface, lock); ++ return D_OOM (); ++} ++ ++ ++static DFBResult ++__attribute__((unused)) ++mme_helper_start_transformer (struct _MMECommon * const data, ++ size_t return_params_size, ++ void * const return_params, ++ size_t params_size, ++ void * const params, ++ CoreSurface * const dst_surface, ++ CoreSurfaceBufferLock * const lock) ++{ ++ DFBResult dfb_res; ++ MME_ERROR mme_res; ++ ++ /* setup transform command */ ++ dfb_res = _mme_helper_start_transformer_core (data, ++ return_params_size, ++ return_params, ++ params_size, params, ++ dst_surface, lock); ++ if (dfb_res != DFB_OK) ++ return dfb_res; ++ ++ _imageprovider_update_transform_params (data, params, lock); ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "issuing MME_TRANSFORM\n"); ++ ++ /* lock access to hash, because otherwise the callback could be called ++ before we've had a chance to put the command id into the hash */ ++ D_ASSERT (data->pending_commands != NULL); ++ pthread_mutex_lock (&data->pending_commands_lock); ++ ++ mme_res = MME_SendCommand (data->Handle, &data->TransformCommand); ++ if (mme_res != MME_SUCCESS) ++ { ++ pthread_mutex_unlock (&data->pending_commands_lock); ++ ++ D_WARN ("(%5d) %s: starting transformer failed: %d (%s)", ++ direct_gettid (), data->name, mme_res, ++ get_mme_error_string (mme_res)); ++ ++ dfb_surface_unlock_buffer (dst_surface, lock); ++ ++ D_FREE (data->OutDataBuffers); ++ data->OutDataBuffers = NULL; ++ ++ return DFB_FAILURE; ++ } ++ ++ direct_hash_insert (data->pending_commands, ++ data->TransformCommand.CmdStatus.CmdId, ++ (void *) 1); ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "sent packet's CmdId is %u (%.8x)\n", ++ data->TransformCommand.CmdStatus.CmdId, ++ data->TransformCommand.CmdStatus.CmdId); ++ ++ deb_gettimeofday (&data->starttime, NULL); ++ ++ pthread_mutex_unlock (&data->pending_commands_lock); ++ ++ return DFB_OK; ++} ++ ++ ++static DFBResult ++_alloc_send_buffer (MME_TransformerHandle_t handle, ++ size_t size, ++ struct _MMEHelper_buffer * const buffer) ++{ ++ MME_ERROR res; ++ size_t this_size = MIN (size, MME_STREAMING_BUFFERSIZE); ++ ++ D_ASSERT (buffer != NULL); ++ D_ASSUME (size != 0); ++ D_ASSERT (buffer->buffer == NULL); ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, " -> allocating MME buffer for %u bytes\n", ++ this_size); ++ ++ res = MME_AllocDataBuffer (handle, this_size, MME_ALLOCATION_PHYSICAL, ++ &buffer->buffer); ++ if (unlikely (res)) ++ { ++ D_WARN ("(%5d) MME_AllocDataBuffer() for %u bytes failed: %s", ++ direct_gettid (), this_size, get_mme_error_string (res)); ++ ++ return DFB_NOSYSTEMMEMORY; ++ } ++ ++ buffer->command.StructSize = sizeof (MME_Command_t); ++ buffer->command.CmdCode = MME_SEND_BUFFERS; ++ buffer->command.CmdEnd = MME_COMMAND_END_RETURN_NOTIFY; ++ buffer->command.DueTime = (MME_Time_t) 0; ++ buffer->command.NumberInputBuffers = 1; ++ buffer->command.NumberOutputBuffers = 0; ++ buffer->command.DataBuffers_p = &buffer->buffer; ++ buffer->command.ParamSize = 0; ++ buffer->command.Param_p = NULL; ++ ++ sema_init_event (&buffer->sema, 0); ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, " -> @ %p (%p)\n", ++ buffer, buffer->buffer); ++ ++ return DFB_OK; ++} ++ ++ ++static void ++mme_helper_calculate_packets (struct _MMECommon * const data) ++{ ++ D_ASSUME (data->bytes == 0); ++ ++ /* FIXME: this is BAD (tm) -> think streaming media! */ ++ data->base.buffer->SeekTo (data->base.buffer, 0); ++ ++ /* find out the length of the buffer */ ++ data->base.buffer->GetLength (data->base.buffer, &data->bytes); ++ ++ data->packets = data->bytes / MME_STREAMING_BUFFERSIZE; ++ if ((data->packets * MME_STREAMING_BUFFERSIZE) < data->bytes) ++ ++data->packets; ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, ++ "calculated transfer: %u bytes (%u packets, %u bytes each)\n", ++ data->bytes, data->packets, MME_STREAMING_BUFFERSIZE); ++} ++ ++static DFBResult ++__attribute__((unused)) ++mme_helper_send_packets (struct _MMECommon * const data, ++ unsigned int n_packets) ++{ ++ unsigned int orig_packets; ++ unsigned int currentbuffer = currentbuffer; ++ ++ D_ASSUME (n_packets != 0); ++ ++ if (!data->packets && !data->bytes) ++ return DFB_OK; ++ ++ D_ASSUME (data->packets != 0); ++ D_ASSUME (data->bytes != 0); ++ ++ DFBResult res = DFB_OK; ++ MME_ERROR mme_res; ++ ++ orig_packets = n_packets = MIN (n_packets, data->packets); ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "Sending %u buffers (out of %u remaining)\n", ++ n_packets, data->packets); ++ ++//#define MME_OOM ++//#define MME_IOERR ++//#define MME_SENDFAIL ++//#define MME_DATA_CORRUPTION ++#if defined(MME_OOM) || defined(MME_IOERR) || defined(MME_SENDFAIL) || defined(MME_DATA_CORRUPTION) ++int i = 0; ++#endif ++ for (; n_packets && data->packets; --data->packets, --n_packets) ++ { ++ struct _MMEHelper_buffer *buffer; ++ unsigned int this_read = MIN (data->bytes, MME_STREAMING_BUFFERSIZE); ++ ++ ++currentbuffer; ++ currentbuffer %= MAX_STREAMING_COMMANDS; ++ ++ buffer = &data->SendDataBuffers[currentbuffer]; ++ ++ /* some checking - We've waited ... should we continue ... */ ++ if (data->decode_success == -1) ++ { ++ D_WARN ("(%5d) ImageProvider/%s: error sending data. Transform " ++ "error reported from callback", ++ direct_gettid (), data->name); ++ return DFB_FAILURE; ++ } ++ ++ /* if we are allocating a new buffer, we don't have to wait on the ++ semaphore, as the new buffer will not yet be known to mme, and thus ++ not in use, of course */ ++ if (!buffer->buffer) ++ { ++#ifdef MME_OOM ++if (++i == 4) ++ { ++ fprintf (stderr, "emulating MME_AllocDataBuffer() failure (MME OOM)\n"); ++ res = DFB_NOSYSTEMMEMORY; ++ } ++else ++#endif ++ res = _alloc_send_buffer (data->Handle, this_read, buffer); ++ if (res != DFB_OK) ++ return res; ++ } ++ else ++ { ++ /* wait for some buffer to be available */ ++ if (unlikely (sema_trywait (&buffer->sema) == -1)) ++ { ++ ++data->packets; ++ ++n_packets; ++ usleep (1); ++ continue; ++ } ++ } ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, " -> sending packet %u, using buffer %u @ %p (%p)\n", ++ orig_packets - n_packets, currentbuffer, buffer, ++ buffer->buffer); ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, " -> %u bytes remaining (this read: %u)\n", ++ data->bytes, this_read); ++ ++ /* lock access to hash, because otherwise the callback could be called ++ before we've had a chance to put the command id into the hash */ ++ /* it also locks acces to data->buffer, because otherwise the callback ++ might determine we ran out of data if called between fetch_data() ++ and actually sending the MME_SendCommand() below. */ ++ D_ASSERT (data->pending_commands != NULL); ++ pthread_mutex_lock (&data->pending_commands_lock); ++ ++ /* don't move the abort out of the pending_commands lock! The JPEG ++ transformer might deadlock otherwise */ ++ if (data->decode_success == 1) ++ { ++ /* corrupt data -> file can be bigger than actual JPEG data */ ++ pthread_mutex_unlock (&data->pending_commands_lock); ++ return DFB_OK; ++ } ++ ++#ifdef MME_IOERR ++if (++i == 8) ++ { ++ fprintf (stderr, "emulating IO (read) error\n"); ++ res = DFB_FAILURE; ++ usleep (1 * 1000 * 1000); ++ } ++else ++#endif ++ res = fetch_data (data->base.buffer, buffer->buffer, this_read); ++ if (res != DFB_OK) ++ { ++ pthread_mutex_unlock (&data->pending_commands_lock); ++ ++ D_WARN ("(%5d) Fetching %u bytes of data failed: res: %d", ++ direct_gettid (), this_read, res); ++ sema_signal_event (&buffer->sema); ++ /* hm, DirectFB (always?) returns DFB_FAILURE here... */ ++ return DFB_IO; ++ } ++#ifdef MME_DATA_CORRUPTION ++if (++i == 2) ++ { ++ fprintf (stderr, "emulating data corruption\n"); ++ memset (&buffer->buffer->ScatterPages_p[0].Page_p[15], 0x15, 10); ++ } ++#endif ++ ++ /* we just read data, nobody should have determined that we ran into ++ an EOF! */ ++ D_ASSERT (data->decode_success != -2); ++ ++ data->bytes -= this_read; ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, " -> sending command in buffer %u\n", ++ currentbuffer); ++ ++ /* send the command */ ++#ifdef MME_SENDFAIL ++if (++i == 4) ++ { ++ fprintf (stderr, "emulating MME_SendCommand() failure\n"); ++ mme_res = MME_NOMEM; ++ } ++else ++#endif ++ mme_res = MME_SendCommand (data->Handle, &buffer->command); ++ if (mme_res != MME_SUCCESS) ++ { ++ pthread_mutex_unlock (&data->pending_commands_lock); ++ ++ D_WARN ("(%5d) send DataCommand failed: %s", ++ direct_gettid (), get_mme_error_string (mme_res)); ++ res = DFB_FAILURE; ++ return DFB_FAILURE; ++ } ++ ++ res = DFB_OK; ++ ++ direct_hash_insert (data->pending_commands, ++ buffer->command.CmdStatus.CmdId, (void *) 1); ++ ++data->n_pending_buffers; ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "sent packet's CmdId is %u (%.8x), %u packets pending now\n", ++ buffer->command.CmdStatus.CmdId, ++ buffer->command.CmdStatus.CmdId, ++ data->n_pending_buffers); ++ pthread_mutex_unlock (&data->pending_commands_lock); ++ } ++ ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "done sending packets (%u remaining)\n", ++ data->packets); ++ ++ return res; ++} ++ ++ ++static DFBResult ++__attribute__((unused)) ++mme_helper_stretch_blit (struct _MMECommon * const data, ++ CoreSurface * const src, ++ CoreSurface * const dst, ++ DFBRectangle * const dst_rect) ++{ ++ CardState state; ++ DFBRectangle src_rect; ++ ++ dfb_state_init (&state, data->base.core); ++ ++ /* set clipping and sizes */ ++ state.clip.x1 = 0; ++ state.clip.y1 = 0; ++ state.clip.x2 = dst_rect->w - 1; ++ state.clip.y2 = dst_rect->h - 1; ++ ++ state.modified |= SMF_CLIP; ++ ++ src_rect.x = 0; ++ src_rect.y = 0; ++ src_rect.w = data->width; ++ src_rect.h = data->height; ++ ++ dfb_state_set_source (&state, src); ++ dfb_state_set_destination (&state, dst); ++ ++ extern const char *dfb_pixelformat_name( DFBSurfacePixelFormat format ); ++ D_DEBUG_AT (MME_DEBUG_DOMAIN, "StretchBlit %dx%d (%dx%d) -> %dx%d (%s -> %s)\n", ++ data->width, data->height, src_rect.w, src_rect.h, ++ dst_rect->w, dst_rect->h, ++ dfb_pixelformat_name (src->config.format), ++ dfb_pixelformat_name (dst->config.format)); ++ ++ /* thankfully this is intelligent enough to do a simple blit if possible */ ++ dfb_gfxcard_stretchblit (&src_rect, dst_rect, &state); ++ data->serial = state.serial; ++ ++ /* remove the state */ ++ dfb_state_set_source (&state, NULL); ++ dfb_state_set_destination (&state, NULL); ++ dfb_state_destroy (&state); ++ ++ return DFB_OK; ++} ++#endif /* USE_MME */ ++ ++ ++#endif /* __MME_HELPER_H__ */ +diff --git a/interfaces/IDirectFBImageProvider/sema_helper.h b/interfaces/IDirectFBImageProvider/sema_helper.h +new file mode 100644 +index 0000000..31b2b30 +--- /dev/null ++++ b/interfaces/IDirectFBImageProvider/sema_helper.h +@@ -0,0 +1,61 @@ ++#ifndef __SEMA_HELPER_H__ ++#define __SEMA_HELPER_H__ ++ ++#include ++ ++ ++static inline unsigned int ++__attribute__((warn_unused_result)) ++sema_get_event_val (sem_t * const sema) ++{ ++ int semval; ++ ++ sem_getvalue (sema, &semval); ++ ++ return semval; ++} ++ ++static inline int ++__attribute__((warn_unused_result)) ++sema_wait_event (sem_t * const sema) ++{ ++ D_DEBUG_AT (SEMA_DEBUG_DOMAIN, "waiting on %p (val: %u)\n", sema, sema_get_event_val (sema)); ++ ++ return sem_wait (sema); ++} ++ ++static inline int ++__attribute__((warn_unused_result)) ++sema_trywait (sem_t * const sema) ++{ ++ D_DEBUG_AT (SEMA_DEBUG_DOMAIN, "trywait on %p (val: %u)\n", sema, sema_get_event_val (sema)); ++ ++ return sem_trywait (sema); ++} ++ ++static inline void ++sema_signal_event (sem_t * const sema) ++{ ++ D_DEBUG_AT (SEMA_DEBUG_DOMAIN, "signalling %p (val: %u)\n", sema, sema_get_event_val (sema)); ++ ++ sem_post (sema); ++} ++ ++static inline void ++sema_init_event (sem_t * const sema, ++ unsigned int val) ++{ ++ D_DEBUG_AT (SEMA_DEBUG_DOMAIN, "init'ing sema %p to %u\n", sema, val); ++ ++ sem_init (sema, 0, val); ++} ++ ++static inline void ++sema_close_event (sem_t * const sema) ++{ ++ D_DEBUG_AT (SEMA_DEBUG_DOMAIN, "destroying sema %p\n", sema); ++ ++ sem_destroy (sema); ++} ++ ++#endif /* __SEMA_HELPER_H__ */ +diff --git a/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_gif.c b/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_gif.c +index aeb9e82..4266115 100644 +--- a/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_gif.c ++++ b/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_gif.c +@@ -32,7 +32,9 @@ + #include + #include + #include ++#include + #include ++#include + + #include + +@@ -60,7 +62,7 @@ + static DFBResult Probe( IDirectFBVideoProvider_ProbeContext *ctx ); + + static DFBResult Construct( IDirectFBVideoProvider *thiz, +- IDirectFBDataBuffer *buffer ); ++ ... ); + + + #include +@@ -93,19 +95,28 @@ typedef struct { + IDirectFBSurface *destination; + IDirectFBSurface_data *dst_data; + DFBRectangle dst_rect; +- +- u32 *image; +- ++ ++ DFBColor palette[MAXCOLORMAPSIZE]; ++ ++ CoreSurface *decode_surface; ++ CoreSurfaceBufferLock buffer_lock; ++ + DirectThread *thread; + pthread_mutex_t lock; + pthread_cond_t cond; + ++ int paused; ++ + DFBVideoProviderStatus status; + DFBVideoProviderPlaybackFlags flags; + double speed; + + unsigned int start_pos; + ++ unsigned int frame; ++ unsigned int target_frame; /* only in DVPLAY_PACED */ ++ unsigned int last_frame; /* only in DVPLAY_PACED */ ++ + char Version[4]; + unsigned int Width; + unsigned int Height; +@@ -133,6 +144,8 @@ typedef struct { + + DVFrameCallback callback; + void *callback_ctx; ++ ++ CoreDFB *core; + } IDirectFBVideoProvider_GIF_data; + + #define GIFERRORMSG(x, ...) \ +@@ -167,7 +180,7 @@ FetchData( IDirectFBDataBuffer *buffer, void *data, unsigned int len ) + } + + static int ReadColorMap( IDirectFBDataBuffer *buffer, int number, +- u8 buf[3][MAXCOLORMAPSIZE] ) ++ DFBColor palette[MAXCOLORMAPSIZE] ) + { + int i; + u8 rgb[3*number]; +@@ -178,9 +191,10 @@ static int ReadColorMap( IDirectFBDataBuffer *buffer, int number, + } + + for (i = 0; i < number; ++i) { +- buf[CM_RED][i] = rgb[i*3+0]; +- buf[CM_GREEN][i] = rgb[i*3+1]; +- buf[CM_BLUE][i] = rgb[i*3+2]; ++ palette[i].r = rgb[i*3+0]; ++ palette[i].g = rgb[i*3+1]; ++ palette[i].b = rgb[i*3+2]; ++ palette[i].a = 0xff; + } + + return 0; +@@ -403,12 +417,13 @@ static int LWZReadByte( IDirectFBVideoProvider_GIF_data *data, int flag, int inp + + static int ReadImage( IDirectFBVideoProvider_GIF_data *data, + int left, int top, int width, int height, +- u8 cmap[3][MAXCOLORMAPSIZE], bool interlace, bool ignore ) ++ int pitch, DFBColor palette[MAXCOLORMAPSIZE], ++ bool interlace, bool ignore ) + { + u8 c; + int v; + int xpos = 0, ypos = 0, pass = 0; +- u32 *image, *dst; ++ u32 *image = image, *dst = dst; + + /* + ** Initialize the decompression routines +@@ -422,7 +437,7 @@ static int ReadImage( IDirectFBVideoProvider_GIF_data *data, + /* + ** If this is an "uninteresting picture" ignore it. + */ +- if (ignore) { ++ if (ignore && !data->disposal) { + GIFDEBUGMSG("skipping image..."); + + while (LWZReadByte( data, false, c ) >= 0) +@@ -432,8 +447,7 @@ static int ReadImage( IDirectFBVideoProvider_GIF_data *data, + + switch (data->disposal) { + case 2: +- GIFDEBUGMSG("restoring to background color..."); +- memset( data->image, 0, data->Width * data->Height * 4 ); ++ GIFDEBUGMSG("restoring to background color is unsupported"); + break; + case 3: + GIFERRORMSG("restoring to previous frame is unsupported"); +@@ -442,17 +456,18 @@ static int ReadImage( IDirectFBVideoProvider_GIF_data *data, + break; + } + +- dst = image = data->image + (top * data->Width + left); ++ dst = image = ((u32 *)(data->buffer_lock.addr) ++ + (top * (pitch / 4) + left)); + + GIFDEBUGMSG("reading %dx%d at %dx%d %sGIF image", + width, height, left, top, interlace ? " interlaced " : "" ); + + while ((v = LWZReadByte( data, false, c )) >= 0 ) { + if (v != data->transparent) { +- dst[xpos] = (0xFF000000 | +- cmap[CM_RED][v] << 16 | +- cmap[CM_GREEN][v] << 8 | +- cmap[CM_BLUE][v]); ++ dst[xpos] = (0xFF000000 | ++ palette[v].r << 16 | ++ palette[v].g << 8 | ++ palette[v].b); + } + + ++xpos; +@@ -492,8 +507,10 @@ static int ReadImage( IDirectFBVideoProvider_GIF_data *data, + else { + ++ypos; + } +- dst = image + ypos * data->Width; +- } ++ ++ dst = image + ypos * (pitch >> 2); ++ } ++ + if (ypos >= height) { + break; + } +@@ -515,9 +532,6 @@ static void GIFReset( IDirectFBVideoProvider_GIF_data *data ) + data->delayTime = 1000000; /* default: 1s */ + data->inputFlag = -1; + data->disposal = 0; +- +- if (data->image) +- memset( data->image, 0, data->Width*data->Height*4 ); + } + + static DFBResult GIFReadHeader( IDirectFBVideoProvider_GIF_data *data ) +@@ -557,7 +571,7 @@ static DFBResult GIFReadHeader( IDirectFBVideoProvider_GIF_data *data ) + data->AspectRatio = (data->Width << 8) / data->Height; + + if (BitSet(buf[4], LOCALCOLORMAP)) { /* Global Colormap */ +- if (ReadColorMap( data->buffer, data->BitPixel, data->ColorMap )) { ++ if (ReadColorMap( data->buffer, data->BitPixel, data->palette )) { + GIFERRORMSG("error reading global colormap"); + return DFB_FAILURE; + } +@@ -571,8 +585,10 @@ static DFBResult GIFReadFrame( IDirectFBVideoProvider_GIF_data *data ) + u8 buf[16], c; + int top, left; + int width, height; +- u8 localColorMap[3][MAXCOLORMAPSIZE]; ++ DFBColor local_palette[MAXCOLORMAPSIZE]; + bool useGlobalColormap; ++ int ignore = 0; ++ int num_frames = 0; + + data->curbit = data->lastbit = data->done = data->last_byte = 0; + +@@ -582,21 +598,41 @@ static DFBResult GIFReadFrame( IDirectFBVideoProvider_GIF_data *data ) + data->firstcode = data->oldcode = + data->clear_code = data->end_code = 0; + +- for (;;) { ++ dfb_surface_lock_buffer( data->decode_surface, ++ CSBR_BACK, CSAID_CPU, CSAF_WRITE, ++ &data->buffer_lock ); ++ ++ if (data->flags & DVPLAY_PACED ++ && data->target_frame != -1) { ++ ignore = data->target_frame != (data->frame + 1); ++ num_frames = data->target_frame - data->frame - 1; ++ } ++ ++ if (!data->frame) ++ num_frames++; ++ ++ for (; num_frames >= 0;) { + DFBResult ret; + + ret = FetchData( data->buffer, &c, 1); + if (ret) { + GIFERRORMSG("EOF / read error on image data" ); ++ dfb_surface_unlock_buffer( data->decode_surface, ++ &data->buffer_lock ); + return DFB_EOF; + } + +- if (c == ';') /* GIF terminator */ ++ if (c == ';') { /* GIF terminator */ ++ dfb_surface_unlock_buffer( data->decode_surface, ++ &data->buffer_lock ); + return DFB_EOF; ++ } + + if (c == '!') { /* Extension */ + if (FetchData( data->buffer, &c, 1)) { + GIFERRORMSG("EOF / read error on extention function code"); ++ dfb_surface_unlock_buffer( data->decode_surface, ++ &data->buffer_lock ); + return DFB_EOF; + } + DoExtension( data, c ); +@@ -611,6 +647,8 @@ static DFBResult GIFReadFrame( IDirectFBVideoProvider_GIF_data *data ) + ret = FetchData( data->buffer, buf, 9 ); + if (ret) { + GIFERRORMSG("couldn't read left/top/width/height"); ++ dfb_surface_unlock_buffer( data->decode_surface, ++ &data->buffer_lock ); + return ret; + } + +@@ -623,21 +661,28 @@ static DFBResult GIFReadFrame( IDirectFBVideoProvider_GIF_data *data ) + + if (!useGlobalColormap) { + int bitPixel = 2 << (buf[8] & 0x07); +- if (ReadColorMap( data->buffer, bitPixel, localColorMap )) ++ if (ReadColorMap( data->buffer, bitPixel, local_palette )) + GIFERRORMSG("error reading local colormap"); + } + ++ data->frame++; ++ num_frames--; ++ ++ + if (ReadImage( data, left, top, width, height, +- (useGlobalColormap ? +- data->ColorMap : localColorMap), +- BitSet( buf[8], INTERLACE ), 0 )) { ++ data->buffer_lock.pitch, ++ (useGlobalColormap ? ++ data->palette : local_palette), ++ BitSet( buf[8], INTERLACE ), ignore )) { + GIFERRORMSG("error reading image"); ++ dfb_surface_unlock_buffer( data->decode_surface, ++ &data->buffer_lock ); + return DFB_FAILURE; + } +- +- break; + } + ++ dfb_surface_unlock_buffer( data->decode_surface, &data->buffer_lock ); ++ + return DFB_OK; + } + +@@ -649,13 +694,31 @@ IDirectFBVideoProvider_GIF_Destruct( IDirectFBVideoProvider *thiz ) + IDirectFBVideoProvider_GIF_data *data = thiz->priv; + + thiz->Stop( thiz ); +- +- if (data->image) +- D_FREE( data->image ); +- ++ ++ if (data->thread) { ++ direct_thread_cancel( data->thread ); ++ pthread_mutex_lock( &data->lock ); ++ pthread_cond_signal( &data->cond ); ++ pthread_mutex_unlock( &data->lock ); ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ data->thread = NULL; ++ } ++ + if (data->buffer) + data->buffer->Release( data->buffer ); +- ++ ++ if (data->destination) { ++ data->destination->Release( data->destination ); ++ data->destination = NULL; ++ data->dst_data = NULL; ++ } ++ ++ if (data->decode_surface) { ++ dfb_surface_unref( data->decode_surface ); ++ data->decode_surface = NULL; ++ } ++ + pthread_cond_destroy( &data->cond ); + pthread_mutex_destroy( &data->lock ); + +@@ -705,12 +768,11 @@ IDirectFBVideoProvider_GIF_GetSurfaceDescription( IDirectFBVideoProvider *thiz, + + if (!desc) + return DFB_INVARG; +- +- desc->flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; +- desc->width = data->Width; +- desc->height = data->Height; +- desc->pixelformat = DSPF_ARGB; + ++ desc->width = data->Width; ++ desc->height = data->Height; ++ desc->pixelformat = DSPF_ARGB; ++ + return DFB_OK; + } + +@@ -738,19 +800,58 @@ IDirectFBVideoProvider_GIF_GetStreamDescription( IDirectFBVideoProvider *thiz, + return DFB_OK; + } + ++static void ++clear_decode_surface(IDirectFBVideoProvider_GIF_data *data) ++{ ++ CardState state; ++ DFBRectangle rect = { .x = 0, ++ .y = 0, ++ .w = data->Width, ++ .h = data->Height }; ++ ++ DFBColor color = { .r = 0, ++ .g = 0, ++ .b = 0, ++ .a = 0 }; ++ ++ DFBRegion clip = { .x1 = 0, ++ .y1 = 0, ++ .x2 = data->Width - 1, ++ .y2 = data->Height - 1 }; ++ ++ /* init a fillrect state */ ++ dfb_state_init( &state, data->core ); ++ dfb_state_set_color( &state, &color ); ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, data->decode_surface ); ++ dfb_state_set_clip( &state, &clip ); ++ ++ dfb_gfxcard_fillrectangles( &rect, 1, &state ); ++ ++ /* wait for the h/w to complete */ ++ dfb_gfxcard_wait_serial( &state.serial ); ++ ++ /* remove the state */ ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, NULL ); ++ dfb_state_destroy( &state ); ++} ++ + static void* + GIFVideo( DirectThread *self, void *arg ) + { + IDirectFBVideoProvider_GIF_data *data = arg; + + pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, NULL ); +- ++ ++ data->frame = 0; ++ ++ clear_decode_surface( data ); ++ + while (!direct_thread_is_canceled( self )) { + DFBResult ret; + DFBRectangle rect; + DFBRegion clip; +- CoreSurface *surface; +- CoreSurfaceBufferLock lock; + + pthread_mutex_lock( &data->lock ); + +@@ -759,10 +860,36 @@ GIFVideo( DirectThread *self, void *arg ) + break; + } + ++ /* check if the requested frame doesn't exist */ ++ if (data->flags & DVPLAY_PACED ++ && data->last_frame ++ && data->target_frame > data->last_frame) { ++ /* notify the caller */ ++ data->target_frame = -1; ++ data->callback( data->callback_ctx ); ++ /* wait for the next call */ ++ data->status = DVSTATE_STOP; ++ pthread_cond_wait( &data->cond, &data->lock ); ++ pthread_mutex_unlock( &data->lock ); ++ continue; ++ } ++ ++ /* restart decoding if the newly requested frame precedes or is ++ the last decoded one when in DVPLAY_PACED mode */ ++ if (data->flags & DVPLAY_PACED ++ && data->target_frame != -1 ++ && data->target_frame < data->frame) { ++ GIFReset( data ); ++ data->frame = 0; ++ data->buffer->SeekTo( data->buffer, data->start_pos ); ++ } ++ + ret = GIFReadFrame( data ); + if (ret) { + if (ret == DFB_EOF) { ++ data->last_frame = data->frame; + GIFReset( data ); ++ data->frame = 0; + if (data->flags & DVPLAY_LOOPING) { + data->buffer->SeekTo( data->buffer, data->start_pos ); + } +@@ -772,6 +899,15 @@ GIFVideo( DirectThread *self, void *arg ) + break; + } + } ++ /* bail out if stream is invalid */ ++ if (data->flags & DVPLAY_PACED) { ++ /* notify the caller */ ++ data->target_frame = -1; /* error */ ++ data->callback( data->callback_ctx ); ++ /* wait for the next call */ ++ data->status = DVSTATE_STOP; ++ pthread_cond_wait( &data->cond, &data->lock ); ++ } + pthread_mutex_unlock( &data->lock ); + continue; + } +@@ -780,41 +916,58 @@ GIFVideo( DirectThread *self, void *arg ) + ? data->dst_data->area.wanted : data->dst_rect; + dfb_region_from_rectangle( &clip, &data->dst_data->area.current ); + +- surface = data->dst_data->surface; +- D_MAGIC_ASSERT( surface, CoreSurface ); +- +- if (dfb_rectangle_region_intersects( &rect, &clip ) && +- dfb_surface_lock_buffer( surface, CSBR_BACK, CSAID_CPU, CSAF_WRITE, &lock ) == DFB_OK) ++ CardState state; ++ CoreSurface *dst_surface; ++ DFBRectangle srect = { .x = 0, ++ .y = 0, ++ .w = data->Width, ++ .h = data->Height, }; ++ ++ dst_surface = data->dst_data->surface; ++ D_MAGIC_ASSERT( dst_surface, CoreSurface ); ++ ++ /* init a state, so that we can use gfxcard/blit to do the ++ format conversion. */ ++ dfb_state_init( &state, data->core ); ++ dfb_state_set_source( &state, data->decode_surface ); ++ dfb_state_set_destination( &state, dst_surface ); ++ dfb_state_set_clip( &state, &clip ); ++ ++ dfb_gfxcard_stretchblit( &srect, &rect, &state ); ++ ++ /* remove the state */ ++ dfb_state_set_source( &state, NULL ); ++ dfb_state_set_destination( &state, NULL ); ++ dfb_state_destroy( &state ); ++ ++ if (data->callback) ++ data->callback( data->callback_ctx ); ++ ++ if (!(data->flags & DVPLAY_PACED)) + { +- dfb_scale_linear_32( data->image, data->Width, data->Height, +- lock.addr, lock.pitch, &rect, data->dst_data->surface, &clip ); +- +- dfb_surface_unlock_buffer( surface, &lock ); +- +- if (data->callback) +- data->callback( data->callback_ctx ); +- } ++ if (!data->speed) ++ pthread_cond_wait( &data->cond, &data->lock ); ++ else { ++ struct timespec ts; ++ struct timeval tv; ++ unsigned long us; ++ ++ gettimeofday( &tv, NULL ); + +- if (!data->speed) { ++ us = data->delayTime; ++ if (data->speed != 1.0) ++ us = ((double)us / data->speed + .5); ++ us += tv.tv_usec; ++ ++ ts.tv_sec = tv.tv_sec + us/1000000; ++ ts.tv_nsec = (us%1000000) * 1000; ++ ++ pthread_cond_timedwait( &data->cond, &data->lock, &ts ); ++ } ++ } else { ++ data->status = DVSTATE_STOP; + pthread_cond_wait( &data->cond, &data->lock ); + } +- else { +- struct timespec ts; +- struct timeval tv; +- unsigned long us; +- +- gettimeofday( &tv, NULL ); +- +- us = data->delayTime; +- if (data->speed != 1.0) +- us = ((double)us / data->speed + .5); +- us += tv.tv_usec; +- +- ts.tv_sec = tv.tv_sec + us/1000000; +- ts.tv_nsec = (us%1000000) * 1000; +- +- pthread_cond_timedwait( &data->cond, &data->lock, &ts ); +- } + + pthread_mutex_unlock( &data->lock ); + } +@@ -832,7 +985,10 @@ IDirectFBVideoProvider_GIF_PlayTo( IDirectFBVideoProvider *thiz, + IDirectFBSurface_data *dst_data; + DFBRectangle rect = { 0, 0, 0, 0 }; + DFBResult ret; +- ++ ++ DFBVideoProviderPacedPlaybackCtx *Ctx = ++ (DFBVideoProviderPacedPlaybackCtx *)ctx; ++ + DIRECT_INTERFACE_GET_DATA( IDirectFBVideoProvider_GIF ) + + if (!destination) +@@ -841,7 +997,7 @@ IDirectFBVideoProvider_GIF_PlayTo( IDirectFBVideoProvider *thiz, + dst_data = destination->priv; + if (!dst_data || !dst_data->surface) + return DFB_DESTROYED; +- ++ + if (dest_rect) { + if (dest_rect->w < 1 || dest_rect->h < 1) + return DFB_INVARG; +@@ -851,6 +1007,11 @@ IDirectFBVideoProvider_GIF_PlayTo( IDirectFBVideoProvider *thiz, + rect.y += dst_data->area.wanted.y; + } + ++ if (data->flags & DVPLAY_PACED) { ++ if (!Ctx || !callback) ++ return DFB_INVARG; ++ } ++ + pthread_mutex_lock( &data->lock ); + + if (data->status == DVSTATE_FINISHED) { +@@ -862,14 +1023,6 @@ IDirectFBVideoProvider_GIF_PlayTo( IDirectFBVideoProvider *thiz, + } + data->status = DVSTATE_PLAY; + +- if (!data->image) { +- data->image = D_CALLOC( 4, data->Width * data->Height ); +- if (!data->image) { +- pthread_mutex_unlock( &data->lock ); +- return D_OOM(); +- } +- } +- + if (data->destination) + data->destination->Release( data->destination ); + +@@ -877,10 +1030,32 @@ IDirectFBVideoProvider_GIF_PlayTo( IDirectFBVideoProvider *thiz, + data->destination = destination; + data->dst_data = dst_data; + data->dst_rect = rect; +- ++ + data->callback = callback; + data->callback_ctx = ctx; ++ if (data->flags & DVPLAY_PACED) ++ data->target_frame = Ctx->num_frame; + ++ if (!data->decode_surface) { ++ ret = dfb_surface_create_simple( data->core, ++ data->Width, data->Height, ++ DSPF_ARGB, DSCS_RGB, ++ DSCAPS_NONE, CSTF_NONE, 0, ++ NULL, &data->decode_surface ); ++ if (ret != DFB_OK) { ++ pthread_mutex_unlock( &data->lock ); ++ return ret; ++ } ++ } ++ ++ /* Playback has already been started by a previous call to PlayTo() */ ++ if (data->thread && (data->flags & DVPLAY_PACED)) { ++ data->paused = 0; ++ pthread_cond_signal( &data->cond ); ++ pthread_mutex_unlock( &data->lock ); ++ return DFB_OK; ++ } ++ + if (!data->thread) { + data->thread = direct_thread_create( DTT_DEFAULT, GIFVideo, + (void*)data, "GIF Video" ); +@@ -895,25 +1070,33 @@ static DFBResult + IDirectFBVideoProvider_GIF_Stop( IDirectFBVideoProvider *thiz ) + { + DIRECT_INTERFACE_GET_DATA( IDirectFBVideoProvider_GIF ) +- +- if (data->thread) { +- direct_thread_cancel( data->thread ); +- pthread_mutex_lock( &data->lock ); +- pthread_cond_signal( &data->cond ); +- pthread_mutex_unlock( &data->lock ); +- direct_thread_join( data->thread ); +- direct_thread_destroy( data->thread ); +- data->thread = NULL; +- } +- +- if (data->destination) { +- data->destination->Release( data->destination ); +- data->destination = NULL; +- data->dst_data = NULL; ++ ++ if (data->flags & DVPLAY_PACED) { ++ /* sync with the decoding thread */ ++ pthread_mutex_lock( &data->lock ); ++ assert( data->status == DVSTATE_STOP ); ++ pthread_mutex_unlock( &data->lock ); ++ return DFB_OK; ++ } else { ++ if (data->thread) { ++ direct_thread_cancel( data->thread ); ++ pthread_mutex_lock( &data->lock ); ++ pthread_cond_signal( &data->cond ); ++ pthread_mutex_unlock( &data->lock ); ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ data->thread = NULL; ++ } ++ ++ if (data->destination) { ++ data->destination->Release( data->destination ); ++ data->destination = NULL; ++ data->dst_data = NULL; ++ } ++ ++ data->status = DVSTATE_STOP; + } + +- data->status = DVSTATE_STOP; +- + return DFB_OK; + } + +@@ -977,11 +1160,14 @@ IDirectFBVideoProvider_GIF_SetPlaybackFlags( IDirectFBVideoProvider *thiz + { + DIRECT_INTERFACE_GET_DATA( IDirectFBVideoProvider_GIF ) + +- if (flags & ~DVPLAY_LOOPING) ++ if (flags & ~(DVPLAY_LOOPING | DVPLAY_PACED)) + return DFB_UNSUPPORTED; + + if (flags & DVPLAY_LOOPING && !data->seekable) + return DFB_UNSUPPORTED; ++ ++ if (flags & DVPLAY_PACED) ++ data->target_frame = -1; + + data->flags = flags; + +@@ -1033,12 +1219,22 @@ Probe( IDirectFBVideoProvider_ProbeContext *ctx ) + + static DFBResult + Construct( IDirectFBVideoProvider *thiz, +- IDirectFBDataBuffer *buffer ) ++ ... ) + { + DFBResult ret; + ++ IDirectFBDataBuffer *buffer; ++ CoreDFB *core; ++ va_list tag; ++ + DIRECT_ALLOCATE_INTERFACE_DATA( thiz, IDirectFBVideoProvider_GIF ) + ++ va_start( tag, thiz ); ++ buffer = va_arg( tag, IDirectFBDataBuffer * ); ++ core = va_arg( tag, CoreDFB * ); ++ va_end( tag ); ++ ++ data->core = core; + data->ref = 1; + data->status = DVSTATE_STOP; + data->buffer = buffer; +@@ -1056,9 +1252,13 @@ Construct( IDirectFBVideoProvider *thiz, + + data->buffer->GetPosition( data->buffer, &data->start_pos ); + +- direct_util_recursive_pthread_mutex_init( &data->lock ); ++ pthread_mutex_init( &data->lock, NULL ); + pthread_cond_init( &data->cond, NULL ); + ++ data->paused = 0; ++ data->decode_surface = NULL; ++ data->last_frame = 0; ++ + thiz->AddRef = IDirectFBVideoProvider_GIF_AddRef; + thiz->Release = IDirectFBVideoProvider_GIF_Release; + thiz->GetCapabilities = IDirectFBVideoProvider_GIF_GetCapabilities; +diff --git a/lib/direct/clock.c b/lib/direct/clock.c +index d8f1ec0..e394c6a 100644 +--- a/lib/direct/clock.c ++++ b/lib/direct/clock.c +@@ -36,28 +36,28 @@ D_LOG_DOMAIN( Direct_Clock, "Direct/Clock", "Time measurement etc." ); + + /**********************************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + long long + direct_clock_get_micros( void ) + { + return direct_clock_get_time( DIRECT_CLOCK_SESSION ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + long long + direct_clock_get_millis( void ) + { + return direct_clock_get_time( DIRECT_CLOCK_SESSION ) / 1000LL; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + long long + direct_clock_get_abs_micros( void ) + { + return direct_clock_get_time( DIRECT_CLOCK_REALTIME ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + long long + direct_clock_get_abs_millis( void ) + { +diff --git a/lib/direct/debug.c b/lib/direct/debug.c +index 2fd2072..1117e7e 100644 +--- a/lib/direct/debug.c ++++ b/lib/direct/debug.c +@@ -48,7 +48,7 @@ + + #if DIRECT_BUILD_DEBUGS /* Build with debug support? */ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_debug_log( DirectLogDomain *domain, + unsigned int debug_level, /* 1-9, 0 = info */ +@@ -63,7 +63,7 @@ direct_debug_log( DirectLogDomain *domain, + va_end( ap ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_debug_at( DirectLogDomain *domain, + const char *format, ... ) +@@ -77,7 +77,7 @@ direct_debug_at( DirectLogDomain *domain, + + #endif /* DIRECT_BUILD_DEBUGS */ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_debug_at_always( DirectLogDomain *domain, + const char *format, ... ) +@@ -93,7 +93,7 @@ direct_debug_at_always( DirectLogDomain *domain, + + #if DIRECT_BUILD_DEBUGS /* Build with debug support? */ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_break( const char *func, + const char *file, +@@ -123,7 +123,7 @@ direct_break( const char *func, + direct_trap( "Break", SIGABRT ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_assertion( const char *exp, + const char *func, +@@ -144,7 +144,7 @@ direct_assertion( const char *exp, + direct_trap( "Assertion", SIGTRAP ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_assumption( const char *exp, + const char *func, +diff --git a/lib/direct/interface.c b/lib/direct/interface.c +index 1a5a926..faaecd5 100644 +--- a/lib/direct/interface.c ++++ b/lib/direct/interface.c +@@ -522,7 +522,7 @@ direct_print_interface_leaks( void ) + + /**************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static InterfaceDesc * + allocate_interface_desc( void ) + { +@@ -543,7 +543,7 @@ allocate_interface_desc( void ) + return &alloc_list[alloc_count++]; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static __inline__ void + fill_interface_desc( InterfaceDesc *desc, + const void *interface_ptr, +@@ -565,7 +565,7 @@ fill_interface_desc( InterfaceDesc *desc, + + /**************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_dbg_interface_add( const char *func, + const char *file, +@@ -586,7 +586,7 @@ direct_dbg_interface_add( const char *func, + direct_mutex_unlock( &alloc_lock ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_dbg_interface_remove( const char *func, + const char *file, +diff --git a/lib/direct/log.c b/lib/direct/log.c +index 4645939..0ec9189 100644 +--- a/lib/direct/log.c ++++ b/lib/direct/log.c +@@ -128,7 +128,7 @@ direct_log_destroy( DirectLog *log ) + return DR_OK; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + DirectResult + direct_log_printf( DirectLog *log, + const char *format, ... ) +@@ -197,7 +197,7 @@ direct_log_set_default( DirectLog *log ) + return DR_OK; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_log_lock( DirectLog *log ) + { +@@ -211,7 +211,7 @@ direct_log_lock( DirectLog *log ) + direct_mutex_lock( &log->lock ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_log_unlock( DirectLog *log ) + { +@@ -262,7 +262,7 @@ direct_log_flush( DirectLog *log, + + /**********************************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + DirectLog * + direct_log_default( void ) + { +diff --git a/lib/direct/log_domain.c b/lib/direct/log_domain.c +index dcadbed..cf2c94c 100644 +--- a/lib/direct/log_domain.c ++++ b/lib/direct/log_domain.c +@@ -69,7 +69,7 @@ __D_log_domain_deinit() + + /**********************************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static __inline__ LogDomainEntry * + lookup_domain( const char *name, bool sub ); + +@@ -104,7 +104,7 @@ lookup_domain( const char *name, bool sub ) + return NULL; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static DirectLogLevel + check_domain( DirectLogDomain *domain ); + +@@ -199,7 +199,7 @@ direct_log_domain_check( DirectLogDomain *domain ) + /* FIXME: merge following */ + + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + DirectResult + direct_log_domain_vprintf( DirectLogDomain *domain, + DirectLogLevel level, +@@ -260,7 +260,7 @@ direct_log_domain_vprintf( DirectLogDomain *domain, + return DR_OK; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + DirectResult + direct_log_domain_log( DirectLogDomain *domain, + DirectLogLevel level, +diff --git a/lib/direct/mem.c b/lib/direct/mem.c +index 401e4c8..ac064da 100644 +--- a/lib/direct/mem.c ++++ b/lib/direct/mem.c +@@ -121,7 +121,7 @@ direct_print_memleaks( void ) + + /**********************************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static __inline__ MemDesc * + fill_mem_desc( MemDesc *desc, int bytes, const char *func, const char *file, int line, DirectTraceBuffer *trace ) + { +diff --git a/lib/direct/messages.c b/lib/direct/messages.c +index 0331e68..be3148b 100644 +--- a/lib/direct/messages.c ++++ b/lib/direct/messages.c +@@ -40,7 +40,7 @@ + + #if DIRECT_BUILD_TEXT + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_info( const char *format, ... ) + { +@@ -57,7 +57,7 @@ direct_messages_info( const char *format, ... ) + direct_log_printf( NULL, "(*) %s", buf ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_error( const char *format, ... ) + { +@@ -76,7 +76,7 @@ direct_messages_error( const char *format, ... ) + direct_trace_print_stack( NULL ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_derror( DirectResult result, const char *format, ... ) + { +@@ -95,7 +95,7 @@ direct_messages_derror( DirectResult result, const char *format, ... ) + direct_trace_print_stack( NULL ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_perror( int erno, const char *format, ... ) + { +@@ -114,7 +114,7 @@ direct_messages_perror( int erno, const char *format, ... ) + direct_trace_print_stack( NULL ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_dlerror( const char *dlerr, const char *format, ... ) + { +@@ -133,7 +133,7 @@ direct_messages_dlerror( const char *dlerr, const char *format, ... ) + direct_trace_print_stack( NULL ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_once( const char *func, + const char *file, +@@ -155,7 +155,7 @@ direct_messages_once( const char *func, + direct_trace_print_stack( NULL ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_unimplemented( const char *func, + const char *file, +@@ -166,7 +166,7 @@ direct_messages_unimplemented( const char *func, + direct_trace_print_stack( NULL ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_bug( const char *func, + const char *file, +@@ -188,7 +188,7 @@ direct_messages_bug( const char *func, + direct_trace_print_stack( NULL ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_messages_warn( const char *func, + const char *file, +diff --git a/lib/direct/os/linux/glibc/types.h b/lib/direct/os/linux/glibc/types.h +index 55c570b..c7e0f94 100644 +--- a/lib/direct/os/linux/glibc/types.h ++++ b/lib/direct/os/linux/glibc/types.h +@@ -74,7 +74,7 @@ typedef int64_t s64; + + #define __inline__ inline + #define D_UNUSED __attribute__((unused)) +-#define __no_instrument_function__ __attribute__((no_instrument_function)) ++#define __dfb_no_instrument_function__ __attribute__((no_instrument_function)) + #define __constructor__ __attribute__((constructor)) + #define __destructor__ __attribute__((destructor)) + #define __typeof__(x) __typeof__(x) +diff --git a/lib/direct/os/linux/glibc/waitqueue.h b/lib/direct/os/linux/glibc/waitqueue.h +index 9ba37e9..f861f11 100644 +--- a/lib/direct/os/linux/glibc/waitqueue.h ++++ b/lib/direct/os/linux/glibc/waitqueue.h +@@ -68,14 +68,12 @@ direct_waitqueue_wait( DirectWaitQueue *queue, DirectMutex *mutex ) + static inline DirectResult + direct_waitqueue_wait_timeout( DirectWaitQueue *queue, DirectMutex *mutex, unsigned long micros ) + { +- struct timeval now; + struct timespec timeout; +- long int nano_seconds = micros * 1000; + +- gettimeofday( &now, NULL ); ++ clock_gettime( CLOCK_REALTIME, &timeout ); + +- timeout.tv_sec = now.tv_sec; +- timeout.tv_nsec = (now.tv_usec * 1000) + nano_seconds; ++ timeout.tv_sec += micros/1000000; ++ timeout.tv_nsec += (micros % 1000000) * 1000000000; + + timeout.tv_sec += timeout.tv_nsec / 1000000000; + timeout.tv_nsec %= 1000000000; +diff --git a/lib/direct/os/tls.h b/lib/direct/os/tls.h +index 3fef22c..ad08543 100644 +--- a/lib/direct/os/tls.h ++++ b/lib/direct/os/tls.h +@@ -33,17 +33,17 @@ + + /**********************************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static __inline__ void * direct_tls_get ( DirectTLS *tls ); + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static __inline__ DirectResult direct_tls_set ( DirectTLS *tls, + void *value ); + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static __inline__ DirectResult direct_tls_register ( DirectTLS *tls, void (*destructor)( void* ) ); + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static __inline__ DirectResult direct_tls_unregister( DirectTLS *tls ); + + #endif +diff --git a/lib/direct/os/win32/clock_win32.c b/lib/direct/os/win32/clock_win32.c +index 5043843..3bc098d 100644 +--- a/lib/direct/os/win32/clock_win32.c ++++ b/lib/direct/os/win32/clock_win32.c +@@ -40,7 +40,7 @@ static long long session_clock_offset; + + /**********************************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + long long + direct_clock_get_time( DirectClockType type ) + { +diff --git a/lib/direct/os/win32/log_win32.c b/lib/direct/os/win32/log_win32.c +index ef9d948..a6ce5b3 100644 +--- a/lib/direct/os/win32/log_win32.c ++++ b/lib/direct/os/win32/log_win32.c +@@ -33,7 +33,7 @@ + + /**********************************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static DirectResult + log_write( DirectLog *log, + const char *buffer, +@@ -47,7 +47,7 @@ log_write( DirectLog *log, + + /**********************************************************************************************************************/ + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + DirectResult + direct_log_init( DirectLog *log, + const char *param ) +diff --git a/lib/direct/os/win32/mem_win32.c b/lib/direct/os/win32/mem_win32.c +index d374db1..eacb3cb 100644 +--- a/lib/direct/os/win32/mem_win32.c ++++ b/lib/direct/os/win32/mem_win32.c +@@ -43,7 +43,7 @@ + #define TOTAL_SENTINEL ((PREFIX_SENTINEL) + (SUFFIX_SENTINEL)) + + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static inline void + install_sentinels( void *p, size_t size ) + { +@@ -63,7 +63,7 @@ install_sentinels( void *p, size_t size ) + suffix[i] = i; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static inline void + remove_sentinels( void *p ) + { +@@ -79,7 +79,7 @@ remove_sentinels( void *p ) + suffix[i] = 0; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + static inline void + check_sentinels( void *p ) + { +@@ -102,7 +102,7 @@ check_sentinels( void *p ) + } + + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void * + direct_malloc( size_t bytes ) + { +@@ -116,7 +116,7 @@ direct_malloc( size_t bytes ) + return p + PREFIX_SENTINEL; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void * + direct_calloc( size_t count, size_t bytes) + { +@@ -130,7 +130,7 @@ direct_calloc( size_t count, size_t bytes) + return p + PREFIX_SENTINEL; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void * + direct_realloc( void *mem, size_t bytes ) + { +@@ -156,7 +156,7 @@ direct_realloc( void *mem, size_t bytes ) + return p + PREFIX_SENTINEL; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + char * + direct_strdup( const char *str ) + { +@@ -173,7 +173,7 @@ direct_strdup( const char *str ) + return p + PREFIX_SENTINEL; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_free( void *mem ) + { +@@ -192,35 +192,35 @@ direct_free( void *mem ) + + #else + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void * + direct_malloc( size_t bytes ) + { + return malloc( bytes ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void * + direct_calloc( size_t count, size_t bytes) + { + return calloc( count, bytes ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void * + direct_realloc( void *mem, size_t bytes ) + { + return realloc( mem, bytes ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + char * + direct_strdup( const char *str ) + { + return _strdup( str ); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + void + direct_free( void *mem ) + { +diff --git a/lib/direct/os/win32/system_win32.c b/lib/direct/os/win32/system_win32.c +index cbed316..250b06f 100644 +--- a/lib/direct/os/win32/system_win32.c ++++ b/lib/direct/os/win32/system_win32.c +@@ -67,7 +67,7 @@ direct_getpid( void ) + return GetCurrentThreadId(); + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + pid_t + direct_gettid( void ) + { +diff --git a/lib/direct/os/win32/thread_win32.c b/lib/direct/os/win32/thread_win32.c +index 67774b8..b5a2a61 100644 +--- a/lib/direct/os/win32/thread_win32.c ++++ b/lib/direct/os/win32/thread_win32.c +@@ -126,7 +126,7 @@ direct_thread_self( void ) + return NULL; + } + +-__no_instrument_function__ ++__dfb_no_instrument_function__ + const char * + direct_thread_self_name( void ) + { +diff --git a/lib/direct/os/win32/types.h b/lib/direct/os/win32/types.h +index 55790f6..e88cdab 100644 +--- a/lib/direct/os/win32/types.h ++++ b/lib/direct/os/win32/types.h +@@ -89,7 +89,7 @@ struct timespec { + + #define __inline__ __inline + #define D_UNUSED //__attribute__((unused)) +-#define __no_instrument_function__ //__attribute__((no_instrument_function)) ++#define __dfb_no_instrument_function__ //__attribute__((no_instrument_function)) + #define __constructor__ //__attribute__((constructor)) + #define __destructor__ //__attribute__((destructor)) + #define __typeof__(x) void* +diff --git a/lib/direct/util.c b/lib/direct/util.c +index e9fccc3..8ec8fa9 100644 +--- a/lib/direct/util.c ++++ b/lib/direct/util.c +@@ -110,7 +110,7 @@ direct_strerror( int erno ) + /* + * translates errno to DirectResult + */ +-__no_instrument_function__ ++__dfb_no_instrument_function__ + DirectResult + errno2result( int erno ) + { +diff --git a/lib/fusion/fusion.c b/lib/fusion/fusion.c +index 29e37c0..58a16f7 100644 +--- a/lib/fusion/fusion.c ++++ b/lib/fusion/fusion.c +@@ -453,8 +453,13 @@ map_shared_root( void *shm_base, + + + ++#if defined(__SH4__) ++# define shm_align_mask (0x3fff) ++#else ++# define shm_align_mask (0xffff) ++#endif + /* Map shared area. */ +- map = mmap( shm_base + 0x10000 * world_index, sizeof(FusionWorldShared), ++ map = mmap( shm_base + (shm_align_mask + 1) * world_index, sizeof(FusionWorldShared), + prot, MAP_FIXED | MAP_SHARED, fd, 0 ); + if (map == MAP_FAILED) { + ret = errno2result(errno); +diff --git a/lib/fusion/ref.c b/lib/fusion/ref.c +index 0679e2f..739b23a 100644 +--- a/lib/fusion/ref.c ++++ b/lib/fusion/ref.c +@@ -848,7 +848,7 @@ fusion_ref_down (FusionRef *ref, bool global) + FusionCall *call = ref->single.call; + + if (call->handler) { +- fusion_call_execute( call, FCEF_NODIRECT | FCEF_ONEWAY, ref->single.call_arg, NULL, NULL ); ++ fusion_call_execute( call, FCEF_ONEWAY, ref->single.call_arg, NULL, NULL ); + + direct_mutex_unlock( &ref->single.lock ); + +diff --git a/lib/fusion/shm/heap.c b/lib/fusion/shm/heap.c +index 2c08c1d..65e569f 100644 +--- a/lib/fusion/shm/heap.c ++++ b/lib/fusion/shm/heap.c +@@ -653,7 +653,7 @@ __shmalloc_init_heap( FusionSHM *shm, + goto error; + } + +- D_DEBUG_AT( Fusion_SHMHeap, " -> mmaping shared memory file... (%d bytes)\n", size ); ++ D_DEBUG_AT( Fusion_SHMHeap, " -> mmaping shared memory file... (%p %d bytes)\n", addr_base, size ); + + /* map it shared */ + heap = mmap( addr_base, size + space, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0 ); +diff --git a/lib/fusion/shm/pool.c b/lib/fusion/shm/pool.c +index af5de6f..b960718 100644 +--- a/lib/fusion/shm/pool.c ++++ b/lib/fusion/shm/pool.c +@@ -712,7 +712,12 @@ init_pool( FusionSHM *shm, + BLOCKALIGN( (max_size + BLOCKSIZE-1) / BLOCKSIZE * sizeof(shmalloc_info) ); + + pool_addr_base = world->shared->pool_base; +- world->shared->pool_base += ((pool_max_size + page_size - 1) & ~(page_size - 1)) + page_size; ++#ifdef __SH4__ ++ #define SHM_ALIGN_SIZE 0x4000 ++#else ++ #define SHM_ALIGN_SIZE page_size ++#endif ++ world->shared->pool_base += ((pool_max_size + page_size - 1) & ~(SHM_ALIGN_SIZE - 1)) + SHM_ALIGN_SIZE; + /* Exceeded limit? */ + if (world->shared->pool_base > world->shared->pool_max) + return DR_NOSHAREDMEMORY; +diff --git a/src/core/gfxcard.c b/src/core/gfxcard.c +index 5394748..d808964 100644 +--- a/src/core/gfxcard.c ++++ b/src/core/gfxcard.c +@@ -4027,7 +4027,8 @@ dfb_gfxcard_calc_buffer_size( CoreGraphicsDevice *device, + buffer, &pitch, &length ); + } + +- if (ret != DFB_OK) { ++ if (ret != DFB_OK ++ && surface->config.format != DSPF_BYTE) { + /* calculate the required length depending on limitations */ + pitch = MAX( surface->config.size.w, surface->config.min_size.w ); + +@@ -4060,6 +4061,12 @@ dfb_gfxcard_calc_buffer_size( CoreGraphicsDevice *device, + } + } + ++ if (ret != DFB_OK ++ && surface->config.format == DSPF_BYTE) { ++ pitch = 1; ++ length = surface->config.size.w * surface->config.size.h; ++ } ++ + if (ret_pitch) + *ret_pitch = pitch; + +diff --git a/src/core/surface.c b/src/core/surface.c +index b84fa50..03870af 100644 +--- a/src/core/surface.c ++++ b/src/core/surface.c +@@ -258,6 +258,9 @@ dfb_surface_create( CoreDFB *core, + if (surface->config.caps & DSCAPS_SHARED) + surface->type |= CSTF_SHARED; + ++ if (surface->config.format == DSPF_BYTE) ++ surface->type |= CSTF_BUFFEROBJECT; ++ + surface->resource_id = resource_id; + + if (surface->config.caps & DSCAPS_TRIPLE) +@@ -430,6 +433,8 @@ dfb_surface_create_simple ( CoreDFB *core, + config.colorspace = colorspace; + config.caps = caps; + ++ type |= (format == DSPF_BYTE) ? CSTF_BUFFEROBJECT : 0; ++ + return CoreDFB_CreateSurface( core, &config, type, resource_id, palette, ret_surface ); + } + +@@ -1306,6 +1311,7 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + char head[30]; + bool rgb = false; + bool alpha = false; ++ bool IsYCbCrMb = false; + #ifdef USE_ZLIB + gzFile gz_p = NULL, gz_g = NULL; + static const char *gz_ext = ".gz"; +@@ -1351,6 +1357,7 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + + /* Check pixel format. */ + switch (lock.buffer->format) { ++ case DSPF_LUT4: + case DSPF_LUT8: + palette = surface->palette; + +@@ -1390,6 +1397,7 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + case DSPF_RGB332: + case DSPF_RGB16: + case DSPF_RGB24: ++ case DSPF_BGR24: + case DSPF_RGB32: + case DSPF_YUY2: + case DSPF_UYVY: +@@ -1399,10 +1407,16 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + case DSPF_RGB555: + case DSPF_BGR555: + case DSPF_YUV444P: ++ case DSPF_NV24: + case DSPF_VYU: + rgb = true; + break; + ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ IsYCbCrMb = true; ++ break; ++ + + default: + D_ERROR( "DirectFB/core/surfaces: surface dump for format " +@@ -1482,6 +1496,24 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + } + } + ++ /* Create a .gam file for Omega2 MB buffers. */ ++ if (IsYCbCrMb) { ++ if (prefix) ++ snprintf( filename, len, "%s/%s_%04d.gam", path, prefix, num ); ++ else ++ snprintf( filename, len, "%s.gam", path ); ++ ++ fd_p = open( filename, O_EXCL | O_CREAT | O_WRONLY, 0644 ); ++ if (fd_p < 0) { ++ D_PERROR("DirectFB/core/surfaces: " ++ "could not open %s!\n", filename); ++ dfb_surface_buffer_unlock( &lock ); ++ if (palette) ++ dfb_palette_unref( palette ); ++ return DFB_IO; ++ } ++ } ++ + #ifdef USE_ZLIB + if (rgb) + gz_p = gzdopen( fd_p, "wb" ); +@@ -1512,12 +1544,47 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + #endif + } + ++ /* Write the .gam header. */ ++ if (IsYCbCrMb) { ++ struct GamPictureHeader { ++ uint16_t header_size; ++ uint16_t signature; ++ uint16_t type; ++ uint16_t properties; ++ uint32_t pictureWidth; ++ uint32_t pictureHeight; ++ uint32_t lumaSize; ++ uint32_t chromaSize; ++ } header; ++ ++ unsigned int chromaHeight = surface->config.size.h; ++ if (lock.buffer->format == DSPF_NV12MB) ++ chromaHeight >>= 1; ++ ++ header.header_size = 0x6; ++ header.signature = (lock.buffer->format == DSPF_NV12MB) ? 0x420f : 0x422f; ++ header.type = (lock.buffer->format == DSPF_NV12MB) ? 0x94 : 0x95; ++ header.properties = 0x10; ++ header.pictureWidth = surface->config.size.w; ++ header.pictureHeight = surface->config.size.h; ++ header.lumaSize = surface->config.size.w * surface->config.size.h; ++ header.chromaSize = surface->config.size.w * chromaHeight; ++ ++ res = write( fd_p, &header, sizeof(header) ); ++ } ++ + /* Write the pixmap (and graymap) data. */ + for (i=0; iconfig.size.h; i++) { + int n3; + + /* Prepare one row. */ +- u8 *src8 = dfb_surface_data_offset( surface, lock.addr, lock.pitch, 0, i ); ++ u8 *srces[3]; ++ int pitches[3]; ++ u8 *src8; ++ ++ dfb_surface_get_data_offsets( &surface->config, lock.addr, lock.pitch, 0, i, ++ 3, srces, pitches ); ++ src8 = srces[0]; + + /* Write color buffer to pixmap file. */ + if (rgb) { +@@ -1530,8 +1597,23 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + buf_p[n3+2] = palette->entries[src8[n]].b; + } + } ++ else if (lock.buffer->format == DSPF_LUT4) { ++ for (n=0, n3=0; n<(surface->config.size.w>>1); n+=1, n3+=6) { ++ int i = src8[n] & 0xf; /* 4 lsbs */ ++ buf_p[n3+0] = palette->entries[i].r; ++ buf_p[n3+1] = palette->entries[i].g; ++ buf_p[n3+2] = palette->entries[i].b; ++ i = src8[n] >> 4; /* 4 msbs */ ++ buf_p[n3+3] = palette->entries[i].r; ++ buf_p[n3+4] = palette->entries[i].g; ++ buf_p[n3+5] = palette->entries[i].b; ++ } ++ } + else +- dfb_convert_to_rgb24( lock.buffer->format, src8, lock.pitch, surface->config.size.h, ++ dfb_convert_to_rgb24( lock.buffer->format, ++ srces[0], pitches[0], ++ srces[1], pitches[1], srces[2], pitches[2], ++ surface->config.size.h, + buf_p, surface->config.size.w * 3, surface->config.size.w, 1 ); + #ifdef USE_ZLIB + gzwrite( gz_p, buf_p, surface->config.size.w * 3 ); +@@ -1548,8 +1630,16 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + for (n=0; nconfig.size.w; n++) + buf_g[n] = palette->entries[src8[n]].a; + } ++ else if (lock.buffer->format == DSPF_LUT4) { ++ for (n=0; n<(surface->config.size.w>>1); n++) { ++ int i = src8[n] & 0xf; /* 4 lsbs */ ++ buf_g[2 * n] = palette->entries[i].a; ++ i = src8[n] >> 4; /* 4 msbs */ ++ buf_g[2 * n + 1] = palette->entries[i].a; ++ } ++ } + else +- dfb_convert_to_a8( lock.buffer->format, src8, lock.pitch, surface->config.size.h, ++ dfb_convert_to_a8( lock.buffer->format, srces[0], pitches[0], surface->config.size.h, + buf_g, surface->config.size.w, surface->config.size.w, 1 ); + #ifdef USE_ZLIB + gzwrite( gz_g, buf_g, surface->config.size.w ); +@@ -1557,6 +1647,20 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + res = write( fd_g, buf_g, surface->config.size.w ); + #endif + } ++ ++ /* Write luma data. */ ++ if (IsYCbCrMb) ++ res = write( fd_p, src8, surface->config.size.w ); ++ } ++ ++ /* Write chroma data. */ ++ if (IsYCbCrMb) { ++ unsigned int chroma_height = surface->config.size.h; ++ if (lock.buffer->format == DSPF_NV12MB) ++ chroma_height >>= 1; ++ res = write( fd_p, ++ lock.addr + lock.pitch * surface->config.size.h, ++ lock.pitch * chroma_height ); + } + + /* Unlock the surface buffer. */ +@@ -1582,6 +1686,10 @@ dfb_surface_dump_buffer2( CoreSurface *surface, + if (alpha) + close( fd_g ); + ++ /* Close the .gam file. */ ++ if (IsYCbCrMb) ++ close( fd_p ); ++ + return DFB_OK; + } + +diff --git a/src/core/surface.h b/src/core/surface.h +index 6172d13..dba8d8a 100644 +--- a/src/core/surface.h ++++ b/src/core/surface.h +@@ -113,7 +113,9 @@ typedef enum { + + CSTF_PREALLOCATED = 0x00000400, /* preallocated memory */ + +- CSTF_ALL = 0x0000071F ++ CSTF_BUFFEROBJECT = 0x00000800, /* opaque buffer object */ ++ ++ CSTF_ALL = 0x00000F1F + } CoreSurfaceTypeFlags; + + typedef struct { +@@ -460,29 +462,152 @@ dfb_surface_get_buffer3( CoreSurface *surface, + return surface->right_buffers[ surface->buffer_indices[(flip_count + role) % surface->num_buffers] ]; + } + +-static __inline__ void * +-dfb_surface_data_offset( const CoreSurface *surface, +- void *data, +- int pitch, +- int x, +- int y ) ++static __inline__ void ++dfb_surface_get_data_offsets( const CoreSurfaceConfig * const config, ++ const void * const data, ++ int pitch, ++ int x, ++ int y, ++ unsigned int num, ++ u8 ** const pointers, ++ int * const pitches ) + { +- D_ASSERT( surface != NULL ); ++ D_ASSERT( config != NULL ); + D_ASSERT( data != NULL ); + D_ASSERT( pitch > 0 ); + D_ASSERT( x >= 0 ); +- D_ASSERT( x < surface->config.size.w ); ++ D_ASSERT( x < config->size.w ); + D_ASSERT( y >= 0 ); +- D_ASSERT( y < surface->config.size.h ); ++ D_ASSERT( y < config->size.h ); ++ D_ASSERT( !num ++ || (num && pointers && pitches) ); ++ ++ if (!num) ++ return; ++ ++ switch (config->format) { ++ case DSPF_NV12: ++ case DSPF_NV21: ++ case DSPF_NV16: ++ if (num < 2) ++ return; ++ break; ++ ++ case DSPF_I420: ++ case DSPF_YV12: ++ case DSPF_YV16: ++ case DSPF_YUV444P: ++ if (num < 3) ++ return; ++ break; + +- if (surface->config.caps & DSCAPS_SEPARATED) { ++ default: ++ if (num < 1) ++ return; ++ break; ++ } ++ ++ if (config->caps & DSCAPS_SEPARATED) { + if (y & 1) +- y += surface->config.size.h; ++ y += config->size.h; + + y >>= 1; + } + +- return (u8*)data + pitch * y + DFB_BYTES_PER_LINE( surface->config.format, x ); ++ switch (config->format) { ++ case DSPF_NV12: ++ case DSPF_NV21: ++ pitches[1] = pitch; ++ pointers[1] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[1] * y/2 ++ + DFB_BYTES_PER_LINE( config->format, x/2 ) ); ++ break; ++ ++ case DSPF_NV16: ++ pitches[1] = pitch; ++ pointers[1] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[1] * y ++ + DFB_BYTES_PER_LINE( config->format, x/2 ) ); ++ break; ++ ++ case DSPF_I420: ++ pitches[1] = pitches[2] = pitch / 2; ++ pointers[1] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[1] * y/2 ++ + DFB_BYTES_PER_LINE( config->format, x/2 ) ); ++ pointers[2] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[1] * config->size.h/2 ++ + pitches[2] * y/2 ++ + DFB_BYTES_PER_LINE( config->format, x/2 ) ); ++ break; ++ ++ case DSPF_YV12: ++ pitches[1] = pitches[2] = pitch / 2; ++ pointers[2] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[2] * y/2 ++ + DFB_BYTES_PER_LINE( config->format, x/2 ) ); ++ pointers[1] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[2] * config->size.h/2 ++ + pitches[1] * y/2 ++ + DFB_BYTES_PER_LINE( config->format, x/2 ) ); ++ break; ++ ++ case DSPF_YV16: ++ pitches[1] = pitches[2] = pitch / 2; ++ pointers[2] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[2] * y ++ + DFB_BYTES_PER_LINE( config->format, x/2 ) ); ++ pointers[1] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[2] * config->size.h ++ + pitches[1] * y ++ + DFB_BYTES_PER_LINE( config->format, x/2 ) ); ++ break; ++ ++ case DSPF_YUV444P: ++ pitches[1] = pitches[2] = pitch; ++ pointers[1] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[1] * y ++ + DFB_BYTES_PER_LINE( config->format, x ) ); ++ pointers[2] = ( (u8*)data ++ + pitch * config->size.h ++ + pitches[1] * config->size.h ++ + pitches[2] * y ++ + DFB_BYTES_PER_LINE( config->format, x ) ); ++ break; ++ ++ default: ++ break; ++ } ++ ++ pointers[0] = ( (u8*)data ++ + pitch * y ++ + DFB_BYTES_PER_LINE( config->format, x ) ); ++ pitches[0] = pitch; ++} ++ ++static __inline__ void * ++dfb_surface_data_offset( const CoreSurface *surface, ++ void *data, ++ int pitch, ++ int x, ++ int y ) ++{ ++ u8 *pointers[1]; ++ int pitches[1]; ++ ++ dfb_surface_get_data_offsets( &surface->config, data, pitch, x, y, ++ 1, pointers, pitches); ++ ++ return pointers[0]; + } + + static __inline__ void +diff --git a/src/core/surface_allocation.c b/src/core/surface_allocation.c +index 9773d30..0ef959e 100644 +--- a/src/core/surface_allocation.c ++++ b/src/core/surface_allocation.c +@@ -308,6 +308,15 @@ transfer_buffer( CoreSurfaceBuffer *buffer, + } + break; + ++ case DSPF_NV24: ++ for (i=0; iconfig.size.h; i++) { ++ direct_memcpy( dst, src, ++ DFB_BYTES_PER_LINE( buffer->format, surface->config.size.w ) * 2 ); ++ src += srcpitch; ++ dst += dstpitch; ++ } ++ break; ++ + case DSPF_YUV444P: + for (i=0; iconfig.size.h*2; i++) { + direct_memcpy( dst, src, +diff --git a/src/core/surface_buffer.c b/src/core/surface_buffer.c +index e67457e..a77d7c3 100644 +--- a/src/core/surface_buffer.c ++++ b/src/core/surface_buffer.c +@@ -681,6 +681,7 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + char head[30]; + bool rgb = false; + bool alpha = false; ++ bool IsYCbCrMb = false; + #ifdef USE_ZLIB + gzFile gz_p = NULL, gz_g = NULL; + static const char *gz_ext = ".gz"; +@@ -703,6 +704,7 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + + /* Check pixel format. */ + switch (buffer->format) { ++ case DSPF_LUT4: + case DSPF_LUT8: + palette = surface->palette; + +@@ -739,6 +741,7 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + case DSPF_RGB332: + case DSPF_RGB16: + case DSPF_RGB24: ++ case DSPF_BGR24: + case DSPF_RGB32: + case DSPF_YUY2: + case DSPF_UYVY: +@@ -748,10 +751,16 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + case DSPF_RGB555: + case DSPF_BGR555: + case DSPF_YUV444P: ++ case DSPF_NV24: + case DSPF_VYU: + rgb = true; + break; + ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ IsYCbCrMb = true; ++ break; ++ + + default: + D_ERROR( "DirectFB/core/surfaces: surface dump for format " +@@ -838,6 +847,24 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + } + } + ++ /* Create a .gam file for Omega2 MB buffers. */ ++ if (IsYCbCrMb) { ++ if (prefix) ++ snprintf( filename, len, "%s/%s_%04d.gam", directory, prefix, num ); ++ else ++ snprintf( filename, len, "%s.gam", directory ); ++ ++ fd_p = open( filename, O_EXCL | O_CREAT | O_WRONLY, 0644 ); ++ if (fd_p < 0) { ++ D_PERROR("DirectFB/core/surfaces: " ++ "could not open %s!\n", filename); ++ dfb_surface_buffer_unlock( &lock ); ++ if (palette) ++ dfb_palette_unref( palette ); ++ return DFB_IO; ++ } ++ } ++ + #ifdef USE_ZLIB + if (rgb) + gz_p = gzdopen( fd_p, "wb" ); +@@ -870,12 +897,47 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + #endif + } + ++ /* Write the .gam header. */ ++ if (IsYCbCrMb) { ++ struct GamPictureHeader { ++ uint16_t header_size; ++ uint16_t signature; ++ uint16_t type; ++ uint16_t properties; ++ uint32_t pictureWidth; ++ uint32_t pictureHeight; ++ uint32_t lumaSize; ++ uint32_t chromaSize; ++ } header; ++ ++ unsigned int chromaHeight = surface->config.size.h; ++ if (buffer->format == DSPF_NV12MB) ++ chromaHeight >>= 1; ++ ++ header.header_size = 0x6; ++ header.signature = (buffer->format == DSPF_NV12MB) ? 0x420f : 0x422f; ++ header.type = (buffer->format == DSPF_NV12MB) ? 0x94 : 0x95; ++ header.properties = 0x10; ++ header.pictureWidth = surface->config.size.w; ++ header.pictureHeight = surface->config.size.h; ++ header.lumaSize = surface->config.size.w * surface->config.size.h; ++ header.chromaSize = surface->config.size.w * chromaHeight; ++ ++ res = write( fd_p, &header, sizeof(header) ); ++ (void)res; ++ } ++ + /* Write the pixmap (and graymap) data. */ + for (i=0; iconfig.size.h; i++) { + int n3; + + /* Prepare one row. */ +- u8 *src8 = dfb_surface_data_offset( surface, lock.addr, lock.pitch, 0, i ); ++ u8 *srces[3]; ++ int pitches[3]; ++ u8 *src8; ++ dfb_surface_get_data_offsets( &surface->config, lock.addr, lock.pitch, 0, i, ++ 3, srces, pitches ); ++ src8 = srces[0]; + + /* Write color buffer to pixmap file. */ + if (rgb) { +@@ -888,8 +950,23 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + buf_p[n3+2] = palette->entries[src8[n]].b; + } + } ++ else if (buffer->format == DSPF_LUT4) { ++ for (n=0, n3=0; n<(surface->config.size.w>>1); n+=1, n3+=6) { ++ int i = src8[n] & 0xf; /* 4 lsbs */ ++ buf_p[n3+0] = palette->entries[i].r; ++ buf_p[n3+1] = palette->entries[i].g; ++ buf_p[n3+2] = palette->entries[i].b; ++ i = src8[n] >> 4; /* 4 msbs */ ++ buf_p[n3+3] = palette->entries[i].r; ++ buf_p[n3+4] = palette->entries[i].g; ++ buf_p[n3+5] = palette->entries[i].b; ++ } ++ } + else +- dfb_convert_to_rgb24( buffer->format, src8, lock.pitch, surface->config.size.h, ++ dfb_convert_to_rgb24( buffer->format, ++ srces[0], pitches[0], ++ srces[1], pitches[1], srces[2], pitches[2], ++ surface->config.size.h, + buf_p, surface->config.size.w * 3, surface->config.size.w, 1 ); + #ifdef USE_ZLIB + gzwrite( gz_p, buf_p, surface->config.size.w * 3 ); +@@ -907,8 +984,16 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + for (n=0; nconfig.size.w; n++) + buf_g[n] = palette->entries[src8[n]].a; + } ++ else if (buffer->format == DSPF_LUT4) { ++ for (n=0; n<(surface->config.size.w>>1); n++) { ++ int i = src8[n] & 0xf; /* 4 lsbs */ ++ buf_g[2 * n] = palette->entries[i].a; ++ i = src8[n] >> 4; /* 4 msbs */ ++ buf_g[2 * n + 1] = palette->entries[i].a; ++ } ++ } + else +- dfb_convert_to_a8( buffer->format, src8, lock.pitch, surface->config.size.h, ++ dfb_convert_to_a8( buffer->format, srces[0], pitches[0], surface->config.size.h, + buf_g, surface->config.size.w, surface->config.size.w, 1 ); + #ifdef USE_ZLIB + gzwrite( gz_g, buf_g, surface->config.size.w ); +@@ -917,6 +1002,23 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + (void)res; + #endif + } ++ ++ /* Write luma data. */ ++ if (IsYCbCrMb) { ++ res = write( fd_p, srces[0], surface->config.size.w ); ++ (void)res; ++ } ++ } ++ ++ /* Write chroma data. */ ++ if (IsYCbCrMb) { ++ unsigned int chroma_height = surface->config.size.h; ++ if (buffer->format == DSPF_NV12MB) ++ chroma_height >>= 1; ++ res = write( fd_p, ++ lock.addr + lock.pitch * surface->config.size.h, ++ lock.pitch * chroma_height ); ++ (void)res; + } + + /* Unlock the surface buffer. */ +@@ -942,6 +1044,10 @@ dfb_surface_buffer_dump( CoreSurfaceBuffer *buffer, + if (alpha) + close( fd_g ); + ++ /* Close the .gam file. */ ++ if (IsYCbCrMb) ++ close( fd_p ); ++ + return DFB_OK; + } + +diff --git a/src/core/surface_pool.c b/src/core/surface_pool.c +index f54c101..f31e8f7 100644 +--- a/src/core/surface_pool.c ++++ b/src/core/surface_pool.c +@@ -480,6 +480,9 @@ dfb_surface_pools_negotiate( CoreSurfaceBuffer *buffer, + + if (type & CSTF_PREALLOCATED) + D_DEBUG_AT( Core_SurfacePool, " -> PREALLOCATED\n" ); ++ ++ if (type & CSTF_BUFFEROBJECT) ++ D_DEBUG_AT( Core_SurfacePool, " -> BUFFEROBJECT\n" ); + #endif + + for (i=0; itype & CSTF_FONT) ? " FONT" : "", + (surface->type & CSTF_INTERNAL) ? " INTERNAL" : "", + (surface->type & CSTF_EXTERNAL) ? " EXTERNAL" : "", +- (surface->type & CSTF_PREALLOCATED) ? " PREALLOCATED" : "" ); ++ (surface->type & CSTF_PREALLOCATED) ? " PREALLOCATED" : "", ++ (surface->type & CSTF_BUFFEROBJECT) ? " BUFFEROBJECT" : ""); + + D_ASSERT( accessor >= CSAID_CPU ); + D_ASSUME( accessor < _CSAID_NUM ); +diff --git a/src/core/system.h b/src/core/system.h +index abb40d0..255eaaf 100644 +--- a/src/core/system.h ++++ b/src/core/system.h +@@ -51,7 +51,8 @@ typedef enum { + CORE_PVR2D, + CORE_CARE1, + CORE_ANDROID, +- CORE_EGL ++ CORE_EGL, ++ CORE_STMFBDEV + } CoreSystemType; + + typedef enum { +diff --git a/src/gfx/convert.c b/src/gfx/convert.c +index 538a31a..ab6acd7 100644 +--- a/src/gfx/convert.c ++++ b/src/gfx/convert.c +@@ -115,6 +115,7 @@ dfb_pixel_to_color( DFBSurfacePixelFormat format, + + case DSPF_ABGR: + ret_color->a = pixel >> 24; ++ case DSPF_BGR24: + ret_color->b = (pixel & 0xff0000) >> 16; + ret_color->g = (pixel & 0x00ff00) >> 8; + ret_color->r = (pixel & 0x0000ff); +@@ -204,6 +205,9 @@ dfb_pixel_from_color( DFBSurfacePixelFormat format, + case DSPF_RGB24: + return PIXEL_RGB32( color->r, color->g, color->b ) & 0xffffff; + ++ case DSPF_BGR24: ++ return PIXEL_RGB32( color->b, color->g, color->r ) & 0xffffff; ++ + case DSPF_RGB32: + return PIXEL_RGB32( color->r, color->g, color->b ) & 0xffffff; + +@@ -332,6 +336,7 @@ dfb_pixel_to_components( DFBSurfacePixelFormat format, + + case DSPF_ABGR: + *a = pixel >> 24; ++ case DSPF_BGR24: + *c0 = (pixel & 0xff0000) >> 16; + *c1 = (pixel & 0x00ff00) >> 8; + *c2 = (pixel & 0x0000ff); +@@ -392,6 +397,10 @@ void + dfb_convert_to_rgb16( DFBSurfacePixelFormat format, + const void *src, + int spitch, ++ const void *src_cb, ++ int scbpitch, ++ const void *src_cr, ++ int scrpitch, + int surface_height, + u16 *dst, + int dpitch, +@@ -433,6 +442,28 @@ dfb_convert_to_rgb16( DFBSurfacePixelFormat format, + } + break; + ++ case DSPF_NV24: ++ while (height--) { ++ const u8 *src8 = src; ++ const u16 *src16 = src + surface_height * spitch; ++ ++ for (x=0; x> 8, src16[x] & 0xff, r, g, b ); ++#else ++ YCBCR_TO_RGB( src8[x], src16[x] & 0xff, src16[x] >> 8, r, g, b ); ++#endif ++ ++ dst[x] = PIXEL_RGB16( r, g, b ); ++ } ++ ++ src += spitch; ++ dst += dp2; ++ } ++ break; ++ + case DSPF_UYVY: + while (height--) { + const u32 *src32 = src; +@@ -599,7 +630,11 @@ dfb_convert_to_rgb16( DFBSurfacePixelFormat format, + for (x=0,x3=0; x> 8, src16[x] & 0xff, r, g, b ); ++#else ++ YCBCR_TO_RGB( src8[x], src16[x] & 0xff, src16[x] >> 8, r, g, b ); ++#endif ++ ++ dst[x] = PIXEL_RGB555( r, g, b ); ++ } ++ ++ src += spitch; ++ dst += dp2; ++ } ++ break; ++ + case DSPF_RGB444: + case DSPF_ARGB4444: + while (height--) { +@@ -919,14 +978,15 @@ dfb_convert_to_rgb555( DFBSurfacePixelFormat format, + case DSPF_VYU: + while (height--) { + const u8 *src8 = src; ++ int x3; + +- for (x=0; x> 8, src16[x] & 0xff, r, g, b ); ++#else ++ YCBCR_TO_RGB( src8[x], src16[x] & 0xff, src16[x] >> 8, r, g, b ); ++#endif ++ ++ dst[x] = PIXEL_RGB32( r, g, b ); ++ } ++ ++ src += spitch; ++ dst += dp4; ++ } ++ break; ++ + case DSPF_RGB444: + case DSPF_ARGB4444: + while (height--) { +@@ -1222,14 +1326,15 @@ dfb_convert_to_rgb32( DFBSurfacePixelFormat format, + case DSPF_VYU: + while (height--) { + const u8 *src8 = src; ++ int x3; + +- for (x=0; x> 8, src16[x] & 0xff, r, g, b ); ++#else ++ YCBCR_TO_RGB( src8[x], src16[x] & 0xff, src16[x] >> 8, r, g, b ); ++#endif ++ ++ dst[x] = PIXEL_ARGB( 0xff, r, g, b ); ++ } ++ ++ src += spitch; ++ dst += dp4; ++ } ++ break; ++ + case DSPF_ARGB4444: + while (height--) { + const u16 *src16 = src; +@@ -1572,14 +1721,15 @@ dfb_convert_to_argb( DFBSurfacePixelFormat format, + case DSPF_VYU: + while (height--) { + const u8 *src8 = src; ++ int x3; + +- for (x=0; x> 16; + y = (src32[n] & 0x00ff00) >> 8; + cb = (src32[n] & 0x0000ff) >> 0; +-#ifdef WORDS_BIGENDIAN + YCBCR_TO_RGB (y, cb, cr, + dst[n3+0], dst[n3+1], dst[n3+2]); +-#else +- YCBCR_TO_RGB (y, cb, cr, +- dst[n3+2], dst[n3+1], dst[n3+0]); +-#endif + } + + src += spitch; +@@ -1940,19 +2107,12 @@ dfb_convert_to_rgb24( DFBSurfacePixelFormat format, + const u8 * __restrict src8 = src; + + for (n=0, n3=0; n> 8, cbcr[n] & 0xff, ++ dst[n3+0], dst[n3+1], dst[n3+2] ); ++#else ++ YCBCR_TO_RGB( src8[n], cbcr[n] & 0xff, cbcr[n] >> 8, ++ dst[n3+0], dst[n3+1], dst[n3+2] ); ++#endif ++ } ++ ++ src += spitch; ++ dst += dpitch; ++ } ++ break; + case DSPF_RGBA5551: + while (height--) { + const u16 *src16 = src; +@@ -2047,13 +2226,8 @@ dfb_convert_to_rgb24( DFBSurfacePixelFormat format, + const u8 * __restrict cr = src + 2 * surface_height * spitch; + + for (n=0, n3=0; nCop & 0xf) << 4) | (gfxs->Cop & 0xf); ++ memset( gfxs->Aop[0], color, gfxs->length >> 1 ); ++} ++ + static void Cop_to_Aop_8( GenefxState *gfxs ) + { + memset( gfxs->Aop[0], gfxs->Cop, gfxs->length ); +@@ -632,7 +661,7 @@ static void Cop_to_Aop_vyu( GenefxState *gfxs ) + u8 *D = gfxs->Aop[0]; + + while (--w) { +-#ifdef BIG_ENDIAN ++#ifdef WORDS_BIGENDIAN + D[0] = gfxs->CrCop; + D[1] = gfxs->YCop; + D[2] = gfxs->CbCop; +@@ -748,6 +777,18 @@ static void Cop_to_Aop_nv12( GenefxState *gfxs ) + } + } + ++static void Cop_to_Aop_nv24( GenefxState *gfxs ) ++{ ++ u16 *D = gfxs->Aop[1]; ++ int w = gfxs->length + 1; ++ u16 Cop = gfxs->CbCop | (gfxs->CrCop << 8); ++ ++ memset( gfxs->Aop[0], gfxs->YCop, gfxs->length ); ++ ++ while (--w) ++ *D++ = Cop; ++} ++ + static void Cop_to_Aop_nv21( GenefxState *gfxs ) + { + memset( gfxs->Aop[0], gfxs->YCop, gfxs->length ); +@@ -763,6 +804,14 @@ static void Cop_to_Aop_nv21( GenefxState *gfxs ) + } + } + ++static void Cop_to_Aop_nv12mb( GenefxState *gfxs ) ++{ ++ int y0 = (short)(((u32)gfxs->Aop[2] >> 16) & 0xffff); ++ ++ dfb_write_nv1xmb_span( NULL, gfxs->YCop, (u8**) gfxs->Aop, ++ gfxs->length, gfxs->AopY - y0 ); ++} ++ + static void Cop_to_Aop_yuv444p( GenefxState *gfxs ) + { + memset( gfxs->Aop[0], gfxs->YCop, gfxs->length ); +@@ -789,6 +838,7 @@ static GenefxFunc Cop_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = Cop_to_Aop_nv12, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = Cop_to_Aop_nv12, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = Cop_to_Aop_nv24, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Cop_to_Aop_16, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Cop_to_Aop_16, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Cop_to_Aop_16, +@@ -810,10 +860,36 @@ static GenefxFunc Cop_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Cop_to_Aop_vyu, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Cop_to_Aop_yv16, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Cop_to_Aop_4, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Cop_to_Aop_24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = Cop_to_Aop_nv12mb, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = Cop_to_Aop_nv12mb, + }; + + /********************************* Cop_toK_Aop_PFI ****************************/ + ++static void Cop_toK_Aop_4( GenefxState *gfxs ) ++{ ++ int w = (gfxs->length >> 1) + 1; ++ u8 *D = gfxs->Aop[0]; ++ u32 Cop = gfxs->Cop; ++ u32 Dkey = gfxs->Dkey; ++ u8 pixel; ++ ++ while (--w) { ++ pixel = *D; ++ ++ if (Dkey == (*D & 0x0F)) ++ pixel = Cop; ++ if (Dkey == (*D >> 4)) { ++ pixel &= 0x0F; ++ pixel |= (Cop << 4); ++ } ++ ++ *D++ = pixel; ++ } ++} ++ + static void Cop_toK_Aop_8( GenefxState *gfxs ) + { + int w = gfxs->length+1; +@@ -939,6 +1015,7 @@ static const GenefxFunc Cop_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Cop_toK_Aop_14, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Cop_toK_Aop_12, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Cop_toK_Aop_12vv, +@@ -960,6 +1037,10 @@ static const GenefxFunc Cop_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Cop_toK_Aop_24_24, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Cop_toK_Aop_4, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Cop_toK_Aop_24_24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_to_Aop_PFI *************************/ +@@ -1012,6 +1093,17 @@ static void Bop_NV_to_Aop( GenefxState *gfxs ) + direct_memmove( gfxs->Aop[1], gfxs->Bop[1], gfxs->length&~1 ); + } + ++static void Bop_NV24_to_Aop( GenefxState *gfxs ) ++{ ++ direct_memmove( gfxs->Aop[0], gfxs->Bop[0], gfxs->length ); ++ direct_memmove( gfxs->Aop[1], gfxs->Bop[1], gfxs->length * 2 ); ++} ++ ++static void Bop_nv12mb_to_Aop( GenefxState *gfxs ) ++{ ++ direct_memmove( gfxs->Aop[0], gfxs->Bop[0], gfxs->length ); ++} ++ + static void Bop_yuv444p_to_Aop( GenefxState *gfxs ) + { + direct_memmove( gfxs->Aop[0], gfxs->Bop[0], gfxs->length ); +@@ -1038,6 +1130,7 @@ static const GenefxFunc Bop_PFI_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = Bop_NV_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = Bop_NV_to_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = Bop_NV24_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_16_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_16_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_16_to_Aop, +@@ -1059,6 +1152,10 @@ static const GenefxFunc Bop_PFI_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Bop_yv16_to_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Bop_4_to_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_to_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = Bop_nv12mb_to_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = Bop_nv12mb_to_Aop, + }; + + /********************************* Bop_PFI_toR_Aop_PFI *************************/ +@@ -1192,6 +1289,22 @@ static void Bop_NV_toR_Aop( GenefxState *gfxs ) + } + } + ++static void Bop_NV24_toR_Aop( GenefxState *gfxs ) ++{ ++ int w = gfxs->length + 1; ++ int Dstep = gfxs->Astep; ++ u16 * S = gfxs->Bop[1]; ++ u16 * D = gfxs->Aop[1]; ++ ++ Bop_8_toR_Aop( gfxs ); ++ ++ while(--w) ++ { ++ *D = *S++; ++ D += Dstep; ++ } ++} ++ + static void Bop_yuv444p_toR_Aop( GenefxState *gfxs ) + { + int w = gfxs->length + 1; +@@ -1238,6 +1351,7 @@ static const GenefxFunc Bop_PFI_toR_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = Bop_NV_toR_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = Bop_NV_toR_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = Bop_NV24_toR_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_16_toR_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_16_toR_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_16_toR_Aop, +@@ -1259,10 +1373,20 @@ static const GenefxFunc Bop_PFI_toR_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_toR_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Bop_yv16_toR_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Bop_4_toR_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_toR_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_Kto_Aop_PFI ************************/ + ++static void Bop_lut4_Kto_Aop( GenefxState *gfxs ) ++{ ++ /* no color to key */ ++ direct_memmove( gfxs->Aop[0], gfxs->Bop[0], gfxs->length >> 1 ); ++} ++ + static void Bop_a8_Kto_Aop( GenefxState *gfxs ) + { + /* no color to key */ +@@ -1435,6 +1559,7 @@ static GenefxFunc Bop_PFI_Kto_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_14_Kto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_12_Kto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_12vv_Kto_Aop, +@@ -1456,6 +1581,10 @@ static GenefxFunc Bop_PFI_Kto_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_Kto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Bop_lut4_Kto_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_24_Kto_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_toK_Aop_PFI ************************/ +@@ -1557,6 +1686,29 @@ static void Bop_yuv444p_toK_Aop( GenefxState *gfxs ) + } + } + ++static void Bop_4_toK_Aop( GenefxState *gfxs ) ++{ ++ int w = (gfxs->length >> 1) + 1; ++ u8 *D = gfxs->Aop[0]; ++ u8 *S = gfxs->Bop[0]; ++ u8 Dkey = gfxs->Dkey; ++ u8 pixel; ++ ++ while (--w) { ++ pixel = *D; ++ ++ if (Dkey == (*D & 0x0F)) ++ pixel = *S & 0xF; ++ if (Dkey == (*D >> 4)) { ++ pixel &= 0x0F; ++ pixel |= *S & 0xF0; ++ } ++ ++ *D++ = pixel; ++ S++; ++ } ++} ++ + static void Bop_8_toK_Aop( GenefxState *gfxs ) + { + int w = gfxs->length+1; +@@ -1592,6 +1744,7 @@ static GenefxFunc Bop_PFI_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_14_toK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_12_toK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_12vv_toK_Aop, +@@ -1613,6 +1766,10 @@ static GenefxFunc Bop_PFI_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_toK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Bop_4_toK_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_24_toK_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_KtoK_Aop_PFI ***********************/ +@@ -1675,6 +1832,7 @@ static const GenefxFunc Bop_PFI_KtoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_14_KtoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_12_KtoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_12vv_KtoK_Aop, +@@ -1696,6 +1854,10 @@ static const GenefxFunc Bop_PFI_KtoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_KtoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_24_KtoK_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_Sto_Aop_PFI ************************/ +@@ -1940,6 +2102,25 @@ static void Bop_NV_Sto_Aop( GenefxState *gfxs ) + } + } + ++static void Bop_NV24_Sto_Aop( GenefxState *gfxs ) ++{ ++ int w = gfxs->length + 1; ++ int i = gfxs->Xphase; ++ u8 *Dy = gfxs->Aop[0]; ++ u8 *Sy = gfxs->Bop[0]; ++ int SperD = gfxs->SperD; ++ ++ u16 *Duv = gfxs->Aop[1]; ++ u16 *Suv = gfxs->Bop[1]; ++ ++ while (--w) { ++ *Dy++ = Sy[i>>16]; ++ *Duv++ = Suv[i>>16]; ++ ++ i += SperD; ++ } ++} ++ + static void Bop_yuv444p_Sto_Aop( GenefxState *gfxs ) + { + int w = gfxs->length + 1; +@@ -1984,6 +2165,7 @@ static GenefxFunc Bop_PFI_Sto_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = Bop_NV_Sto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = Bop_NV_Sto_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = Bop_NV24_Sto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_16_Sto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_16_Sto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_16_Sto_Aop, +@@ -2005,6 +2187,10 @@ static GenefxFunc Bop_PFI_Sto_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_Sto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Bop_yv16_Sto_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_Sto_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_SKto_Aop_PFI ***********************/ +@@ -2225,6 +2411,7 @@ static const GenefxFunc Bop_PFI_SKto_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_14_SKto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_12_SKto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_12vv_SKto_Aop, +@@ -2246,6 +2433,10 @@ static const GenefxFunc Bop_PFI_SKto_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_SKto_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_24_SKto_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_StoK_Aop_PFI ***********************/ +@@ -2302,6 +2493,7 @@ static const GenefxFunc Bop_PFI_StoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_14_StoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_12_StoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_12vv_StoK_Aop, +@@ -2323,6 +2515,10 @@ static const GenefxFunc Bop_PFI_StoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_StoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_24_StoK_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_SKtoK_Aop_PFI **********************/ +@@ -2381,6 +2577,7 @@ static const GenefxFunc Bop_PFI_SKtoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_14_SKtoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_12_SKtoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_12vv_SKtoK_Aop, +@@ -2402,6 +2599,10 @@ static const GenefxFunc Bop_PFI_SKtoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_24_SKtoK_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_24_SKtoK_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Bop_PFI_TEX_to_Aop_PFI ************************/ +@@ -2503,6 +2704,7 @@ static GenefxFunc Bop_PFI_TEX_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL,//Bop_NV_TEX_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL,//Bop_NV_TEX_to_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = NULL,//Bop_16_TEX_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = NULL,//Bop_16_TEX_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = NULL,//Bop_16_TEX_to_Aop, +@@ -2524,6 +2726,10 @@ static GenefxFunc Bop_PFI_TEX_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_24_TEX_to_Aop, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL,//Bop_yv16_TEX_to_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_24_TEX_to_Aop, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Sop_PFI_Sto_Dacc ***************************/ +@@ -2744,6 +2950,28 @@ static void Sop_nv12_Sto_Dacc( GenefxState *gfxs ) + } + } + ++static void Sop_nv24_Sto_Dacc( GenefxState *gfxs ) ++{ ++ int w = gfxs->length+1; ++ int i = gfxs->Xphase; ++ int SperD = gfxs->SperD; ++ ++ GenefxAccumulator *D = gfxs->Dacc; ++ u8 *Sy = gfxs->Sop[0]; ++ u16 *Suv = gfxs->Sop[1]; ++ ++ while (--w) { ++ D->YUV.a = 0xFF; ++ D->YUV.y = Sy[i>>16]; ++ D->YUV.u = Suv[i>>16] & 0xFF; ++ D->YUV.v = Suv[i>>16] >> 8; ++ ++ i += SperD; ++ ++ ++D; ++ } ++} ++ + static void Sop_nv21_Sto_Dacc( GenefxState *gfxs ) + { + int w = gfxs->length+1; +@@ -2912,6 +3140,7 @@ static GenefxFunc Sop_PFI_Sto_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = Sop_nv12_Sto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = Sop_nv12_Sto_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = Sop_nv24_Sto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sop_argb2554_Sto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sop_argb4444_Sto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sop_rgba4444_Sto_Dacc, +@@ -2933,6 +3162,10 @@ static GenefxFunc Sop_PFI_Sto_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sop_vyu_Sto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Sop_i420_Sto_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sop_bgr24_Sto_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Sop_PFI_SKto_Dacc **************************/ +@@ -3302,6 +3535,7 @@ static const GenefxFunc Sop_PFI_SKto_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sop_argb2554_SKto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sop_argb4444_SKto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sop_rgba4444_SKto_Dacc, +@@ -3323,6 +3557,10 @@ static const GenefxFunc Sop_PFI_SKto_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sop_vyu_SKto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sop_bgr24_SKto_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Sop_PFI_to_Dacc ****************************/ +@@ -3453,6 +3691,33 @@ static void Sop_uyvy_to_Dacc( GenefxState *gfxs ) + } + } + ++static void Sop_lut4_to_Dacc( GenefxState *gfxs ) ++{ ++ int w = (gfxs->length >> 1) + 1; ++ GenefxAccumulator *D = gfxs->Dacc; ++ u8 *S = gfxs->Sop[0]; ++ ++ DFBColor *entries = gfxs->Slut->entries; ++ ++ while (--w) { ++ u8 s = *S++; ++ ++ D->RGB.a = entries[s & 0xF].a; ++ D->RGB.r = entries[s & 0xF].r; ++ D->RGB.g = entries[s & 0xF].g; ++ D->RGB.b = entries[s & 0xF].b; ++ ++ D++; ++ ++ D->RGB.a = entries[s >> 4].a; ++ D->RGB.r = entries[s >> 4].r; ++ D->RGB.g = entries[s >> 4].g; ++ D->RGB.b = entries[s >> 4].b; ++ ++ D++; ++ } ++} ++ + static void Sop_lut8_to_Dacc( GenefxState *gfxs ) + { + int w = gfxs->length+1; +@@ -3538,6 +3803,88 @@ static void Sop_nv12_to_Dacc( GenefxState *gfxs ) + } + } + ++static void Sop_nv24_to_Dacc( GenefxState *gfxs ) ++{ ++ int w = gfxs->length+1; ++ GenefxAccumulator *D = gfxs->Dacc; ++ u8 *Sy = gfxs->Sop[0]; ++ u16 *Suv = gfxs->Sop[1]; ++ ++ while (--w) { ++ D[0].YUV.a = 0xFF; ++ D[0].YUV.y = *Sy++; ++ D[0].YUV.u = Suv[0] & 0xFF; ++ D[0].YUV.v = Suv[0] >> 8; ++ ++ ++Suv; ++ D++; ++ } ++} ++ ++static void Sop_nv12mb_to_Dacc( GenefxState *gfxs ) ++{ ++ int i, l, idx; ++ short dy; ++ u8 *d1, *dy1; ++ int y0; ++ ++ GenefxAccumulator *D = gfxs->Dacc; ++ ++ int y_offet_table[32] = { ++ 8, 72, 136, 200, 0, 64, 128, 192, 24, 88, 152, 216, 16, ++ 80, 144, 208, 40, 104, 168, 232, 32, 96, 160, 224, 56, 120, ++ 184, 248, 48, 112, 176, 240 ++ }; ++ ++ d1 = gfxs->Sop[0]; ++ ++ y0 = (short)(((u32)gfxs->Aop[2] >> 16) & 0xffff); ++ ++ if (gfxs->Sop == gfxs->Aop) ++ dy = gfxs->AopY - y0; ++ else ++ dy = gfxs->BopY - y0; ++ ++ idx = (dy % 16) * 2; ++ dy1 = d1 + y_offet_table[idx]; ++ ++ /* gfxs->length is assumed to be always even */ ++ for (i = 0, l = 0; i < (gfxs->length - 1); i += 2) ++ { ++ if (l == 16) { ++ d1 += 2 * 256; ++ ++ idx = (dy % 16) * 2; ++ dy1 = d1 + y_offet_table[idx]; ++ ++ l = 0; ++ } ++ ++ if (l < 8) { ++ D[0].YUV.y = dy1[7 - l]; ++ D[1].YUV.y = dy1[7 - (l + 1)]; ++ ++ D[0].YUV.u = D[1].YUV.u = 127; ++ D[0].YUV.v = D[1].YUV.v = 127; ++ D[0].YUV.a = D[1].YUV.a = 255; ++ } else { ++ if (l == 8) { ++ dy1 = d1 + y_offet_table[++idx]; ++ } ++ ++ D[0].YUV.y = dy1[15 - l]; ++ D[1].YUV.y = dy1[15 - (l + 1)]; ++ ++ D[0].YUV.u = D[1].YUV.u = 127; ++ D[0].YUV.v = D[1].YUV.v = 127; ++ D[0].YUV.a = D[1].YUV.a = 255; ++ } ++ ++ l += 2; ++ D += 2; ++ } ++} ++ + static void Sop_nv21_to_Dacc( GenefxState *gfxs ) + { + int w = (gfxs->length>>1)+1; +@@ -3657,6 +4004,7 @@ static GenefxFunc Sop_PFI_to_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = Sop_nv12_to_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = Sop_nv12_to_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = Sop_nv24_to_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sop_argb2554_to_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sop_argb4444_to_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sop_rgba4444_to_Dacc, +@@ -3678,6 +4026,10 @@ static GenefxFunc Sop_PFI_to_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sop_vyu_to_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Sop_i420_to_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Sop_lut4_to_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sop_bgr24_to_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = Sop_nv12mb_to_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = Sop_nv12mb_to_Dacc, + }; + + /********************************* Sop_PFI_Kto_Dacc ***************************/ +@@ -4033,6 +4385,7 @@ static const GenefxFunc Sop_PFI_Kto_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sop_argb2554_Kto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sop_argb4444_Kto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sop_rgba4444_Kto_Dacc, +@@ -4054,6 +4407,10 @@ static const GenefxFunc Sop_PFI_Kto_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sop_vyu_Kto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sop_bgr24_Kto_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Sacc_to_Aop_PFI ****************************/ +@@ -4209,6 +4566,35 @@ static void Sacc_to_Aop_uyvy( GenefxState *gfxs ) + } + } + ++static void Sacc_to_Aop_lut4( GenefxState *gfxs ) ++{ ++ int w = (gfxs->length >> 1) + 1; ++ GenefxAccumulator *S = gfxs->Sacc; ++ u8 *D = gfxs->Aop[0]; ++ u8 pixel; ++ ++ while (--w) { ++ pixel = 0; ++ if (!(S->RGB.a & 0xF000)) { ++ pixel = dfb_palette_search( gfxs->Alut, ++ (S->RGB.r & 0xFF00) ? 0xFF : S->RGB.r, ++ (S->RGB.g & 0xFF00) ? 0xFF : S->RGB.g, ++ (S->RGB.b & 0xFF00) ? 0xFF : S->RGB.b, ++ (S->RGB.a & 0xFF00) ? 0xFF : S->RGB.a ); ++ } ++ S++; ++ if (!(S->RGB.a & 0xF000)) { ++ pixel |= (dfb_palette_search( gfxs->Alut, ++ (S->RGB.r & 0xFF00) ? 0xFF : S->RGB.r, ++ (S->RGB.g & 0xFF00) ? 0xFF : S->RGB.g, ++ (S->RGB.b & 0xFF00) ? 0xFF : S->RGB.b, ++ (S->RGB.a & 0xFF00) ? 0xFF : S->RGB.a )) << 4; ++ } ++ *D++ = pixel; ++ S++; ++ } ++} ++ + static void Sacc_to_Aop_lut8( GenefxState *gfxs ) + { + int w = gfxs->length+1; +@@ -4401,6 +4787,96 @@ static void Sacc_to_Aop_nv12( GenefxState *gfxs ) + } + } + ++static void Sacc_to_Aop_nv24( GenefxState *gfxs ) ++{ ++ int w = gfxs->length+1; ++ GenefxAccumulator *S = gfxs->Sacc; ++ u8 *Dy = gfxs->Aop[0]; ++ u16 *Duv = gfxs->Aop[1]; ++ ++ while (--w) { ++ if (!(S->YUV.a & 0xF000)) ++ *Dy = (S->YUV.y & 0xFF00) ? 0xFF : S->YUV.y; ++ ++ ++S; ++ ++Dy; ++ } ++ ++ w = gfxs->length+1; ++ S = gfxs->Sacc; ++ ++ while (--w) { ++ u32 cb, cr; ++ ++ if (!(S[0].YUV.a & 0xF000)) { ++ cb = ((*Duv & 0xFF) + ((S[0].YUV.u & 0xFF00) ? 0xFF : S[0].YUV.u)) >> 1; ++ cr = ((*Duv >> 8) + ((S[0].YUV.v & 0xFF00) ? 0xFF : S[0].YUV.v)) >> 1; ++ *Duv = cb | (cr << 8); ++ } ++ ++ S++; ++ ++Duv; ++ } ++} ++ ++static void Sacc_to_Aop_nv12mb( GenefxState *gfxs ) ++{ ++ int i, l, idx; ++ short dy; ++ u8 *d1, *dy1; ++ int y0; ++ ++ GenefxAccumulator *src; ++ ++ int y_offet_table[32] = { ++ 8, 72, 136, 200, 0, 64, 128, 192, 24, 88, 152, 216, 16, ++ 80, 144, 208, 40, 104, 168, 232, 32, 96, 160, 224, 56, 120, ++ 184, 248, 48, 112, 176, 240 ++ }; ++ ++ d1 = gfxs->Aop[0]; ++ ++ y0 = (short)(((u32)gfxs->Aop[2] >> 16) & 0xffff); ++ dy = gfxs->AopY - y0; ++ ++ src = gfxs->Sacc; ++ ++ idx = (dy % 16) * 2; ++ dy1 = d1 + y_offet_table[idx]; ++ ++ /* gfxs->length is assumed to be always even */ ++ for (i = 0, l = 0; i < (gfxs->length - 1); i += 2) ++ { ++ int y0, y1; ++ ++ if (l == 16) { ++ d1 += 2 * 256; ++ ++ idx = (dy % 16) * 2; ++ dy1 = d1 + y_offet_table[idx]; ++ ++ l = 0; ++ } ++ ++ y0 = src[i + 0].YUV.y; ++ y1 = src[i + 1].YUV.y; ++ ++ if (l < 8) { ++ dy1[7 - l] = (y0 & 0xFF00) ? 0xFF : y0; ++ dy1[7 - (l + 1)] = (y1 & 0xFF00) ? 0xFF : y1; ++ } else { ++ if (l == 8) { ++ dy1 = d1 + y_offet_table[++idx]; ++ } ++ ++ dy1[15 - l] = (y0 & 0xFF00) ? 0xFF : y0; ++ dy1[15 - (l + 1)] = (y1 & 0xFF00) ? 0xFF : y1; ++ } ++ ++ l += 2; ++ } ++} ++ + static void Sacc_to_Aop_nv21( GenefxState *gfxs ) + { + int w = gfxs->length+1; +@@ -4586,6 +5062,7 @@ static GenefxFunc Sacc_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = Sacc_to_Aop_nv12, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = Sacc_to_Aop_nv12, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = Sacc_to_Aop_nv24, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sacc_to_Aop_argb2554, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sacc_to_Aop_argb4444, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sacc_to_Aop_rgba4444, +@@ -4607,6 +5084,10 @@ static GenefxFunc Sacc_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sacc_to_Aop_vyu, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Sacc_to_Aop_yv16, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = Sacc_to_Aop_lut4, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sacc_to_Aop_bgr24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = Sacc_to_Aop_nv12mb, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = Sacc_to_Aop_nv12mb, + }; + + /********************************* Sop_PFI_TEX_to_Dacc ****************************/ +@@ -4652,6 +5133,7 @@ static const GenefxFunc Sop_PFI_TEX_to_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sop_argb2554_TEX_to_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sop_argb4444_TEX_to_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sop_rgba4444_TEX_to_Dacc, +@@ -4673,6 +5155,10 @@ static const GenefxFunc Sop_PFI_TEX_to_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL,//Sop_vyu_TEX_to_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sop_bgr24_TEX_to_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Sop_PFI_TEX_Kto_Dacc ****************************/ +@@ -4697,6 +5183,7 @@ static const GenefxFunc Sop_PFI_TEX_Kto_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sop_argb2554_TEX_Kto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sop_argb4444_TEX_Kto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sop_rgba4444_TEX_Kto_Dacc, +@@ -4718,6 +5205,10 @@ static const GenefxFunc Sop_PFI_TEX_Kto_Dacc[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL,//Sop_vyu_TEX_Kto_Dacc, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sop_bgr24_TEX_Kto_Dacc, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Sacc_Sto_Aop_PFI ***************************/ +@@ -5118,6 +5609,44 @@ static void Sacc_Sto_Aop_nv12( GenefxState *gfxs ) + } + } + ++static void Sacc_Sto_Aop_nv24( GenefxState *gfxs ) ++{ ++ int i = gfxs->Xphase; ++ int w = gfxs->length+1; ++ GenefxAccumulator *Sacc = gfxs->Sacc; ++ u8 *Dy = gfxs->Aop[0]; ++ int SperD = gfxs->SperD; ++ ++ while (--w) { ++ GenefxAccumulator *S = &Sacc[i>>16]; ++ ++ if (!(S->YUV.a & 0xF000)) ++ *Dy = (S->YUV.y & 0xFF00) ? 0xFF : S->YUV.y; ++ ++ ++Dy; ++ i += SperD; ++ } ++ ++ u16 *Duv = gfxs->Aop[1]; ++ ++ w = gfxs->length+1; ++ i = gfxs->Xphase; ++ ++ while (--w) { ++ GenefxAccumulator *S0 = &Sacc[i>>16]; ++ u32 cb, cr; ++ ++ if (!(S0->YUV.a & 0xF000)) { ++ cb = ((*Duv & 0xFF) + ((S0->YUV.u & 0xFF00) ? 0xFF : S0->YUV.u)) >> 1; ++ cr = ((*Duv >> 8) + ((S0->YUV.v & 0xFF00) ? 0xFF : S0->YUV.v)) >> 1; ++ *Duv = cb | (cr << 8); ++ } ++ ++ ++Duv; ++ i += SperD; ++ } ++} ++ + static void Sacc_Sto_Aop_nv21( GenefxState *gfxs ) + { + int i = gfxs->Xphase; +@@ -5177,6 +5706,69 @@ static void Sacc_Sto_Aop_nv21( GenefxState *gfxs ) + } + } + ++static void Sacc_Sto_Aop_nv12mb( GenefxState *gfxs ) ++{ ++ int i, l, idx; ++ short dy; ++ u8 *d1, *dy1; ++ int SperD, phase; ++ int y0; ++ ++ GenefxAccumulator *src; ++ ++ int y_offet_table[32] = { ++ 8, 72, 136, 200, 0, 64, 128, 192, 24, 88, 152, 216, 16, ++ 80, 144, 208, 40, 104, 168, 232, 32, 96, 160, 224, 56, 120, ++ 184, 248, 48, 112, 176, 240 ++ }; ++ ++ d1 = gfxs->Aop[0]; ++ ++ y0 = (short)(((u32)gfxs->Aop[2] >> 16) & 0xffff); ++ dy = gfxs->AopY - y0; ++ ++ src = gfxs->Sacc; ++ ++ SperD = gfxs->SperD; ++ phase = gfxs->Xphase; ++ ++ idx = (dy % 16) * 2; ++ dy1 = d1 + y_offet_table[idx]; ++ ++ /* gfxs->length is assumed to be always even */ ++ for (i = 0, l = 0; i < (gfxs->length - 1); i += 2) ++ { ++ int y0, y1; ++ ++ if (l == 16) { ++ d1 += 2 * 256; ++ ++ idx = (dy % 16) * 2; ++ dy1 = d1 + y_offet_table[idx]; ++ ++ l = 0; ++ } ++ ++ y0 = src[(phase >> 16)].YUV.y; ++ y1 = src[(phase + SperD) >> 16].YUV.y; ++ ++ if (l < 8) { ++ dy1[7 - l] = (y0 & 0xFF00) ? 0xFF : y0; ++ dy1[7 - (l + 1)] = (y1 & 0xFF00) ? 0xFF : y1; ++ } else { ++ if (l == 8) { ++ dy1 = d1 + y_offet_table[++idx]; ++ } ++ ++ dy1[15 - l] = (y0 & 0xFF00) ? 0xFF : y0; ++ dy1[15 - (l + 1)] = (y1 & 0xFF00) ? 0xFF : y1; ++ } ++ ++ l += 2; ++ phase += (2 * SperD); ++ } ++} ++ + static void Sacc_Sto_Aop_ayuv( GenefxState *gfxs ) + { + int w = gfxs->length+1; +@@ -5263,7 +5855,7 @@ static void Sacc_Sto_Aop_vyu( GenefxState *gfxs ) + u8 u = (S->YUV.u & 0xFF00) ? 0xFF : S->YUV.u; + u8 v = (S->YUV.v & 0xFF00) ? 0xFF : S->YUV.v; + +-#ifdef BIG_ENDIAN ++#ifdef WORDS_BIGENDIAN + D[0] = v; + D[1] = y; + D[2] = u; +@@ -5299,6 +5891,7 @@ static GenefxFunc Sacc_Sto_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = Sacc_Sto_Aop_nv12, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = Sacc_Sto_Aop_nv12, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = Sacc_Sto_Aop_nv24, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sacc_Sto_Aop_argb2554, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sacc_Sto_Aop_argb4444, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sacc_Sto_Aop_rgba4444, +@@ -5320,6 +5913,10 @@ static GenefxFunc Sacc_Sto_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sacc_Sto_Aop_vyu, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = Sacc_Sto_Aop_yv16, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sacc_Sto_Aop_bgr24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = Sacc_Sto_Aop_nv12mb, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = Sacc_Sto_Aop_nv12mb, + }; + + /********************************* Sacc_toK_Aop_PFI ***************************/ +@@ -5641,6 +6238,7 @@ static const GenefxFunc Sacc_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sacc_toK_Aop_argb2554, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sacc_toK_Aop_argb4444, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sacc_toK_Aop_rgba4444, +@@ -5662,6 +6260,10 @@ static const GenefxFunc Sacc_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sacc_toK_Aop_vyu, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sacc_toK_Aop_bgr24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /********************************* Sacc_StoK_Aop_PFI **************************/ +@@ -5776,6 +6378,7 @@ static const GenefxFunc Sacc_StoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Sacc_StoK_Aop_argb2554, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Sacc_StoK_Aop_argb4444, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Sacc_StoK_Aop_rgba4444, +@@ -5797,6 +6400,10 @@ static const GenefxFunc Sacc_StoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Sacc_StoK_Aop_vyu, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Sacc_StoK_Aop_bgr24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /************** Bop_a8_set_alphapixel_Aop_PFI *********************************/ +@@ -6087,6 +6694,42 @@ static void Bop_a8_set_alphapixel_Aop_rgb24( GenefxState *gfxs ) + #undef SET_PIXEL + } + ++static void Bop_a8_set_alphapixel_Aop_bgr24( GenefxState *gfxs ) ++{ ++ int w = gfxs->length; ++ u8 *S = gfxs->Bop[0]; ++ u8 *D = gfxs->Aop[0]; ++ DFBColor color = gfxs->color; ++ ++#define SET_PIXEL(d,r,g,b,a)\ ++ switch (a) {\ ++ case 0xff:\ ++ d[0] = r;\ ++ d[1] = g;\ ++ d[2] = b;\ ++ case 0: break;\ ++ default: {\ ++ register u16 s = a+1;\ ++ d[0] = ((r-d[0]) * s + (d[0] << 8)) >> 8;\ ++ d[1] = ((g-d[1]) * s + (d[1] << 8)) >> 8;\ ++ d[2] = ((b-d[2]) * s + (d[2] << 8)) >> 8;\ ++ }\ ++ } ++ ++ while (w>4) { ++ SET_PIXEL( D, color.r, color.g, color.b, *S ); D+=3; S++; ++ SET_PIXEL( D, color.r, color.g, color.b, *S ); D+=3; S++; ++ SET_PIXEL( D, color.r, color.g, color.b, *S ); D+=3; S++; ++ SET_PIXEL( D, color.r, color.g, color.b, *S ); D+=3; S++; ++ w-=4; ++ } ++ while (w--) { ++ SET_PIXEL( D, color.r, color.g, color.b, *S ); D+=3, S++; ++ } ++ ++#undef SET_PIXEL ++} ++ + static void Bop_a8_set_alphapixel_Aop_rgb32( GenefxState *gfxs ) + { + int w = gfxs->length; +@@ -6497,6 +7140,7 @@ static const GenefxFunc Bop_a8_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = NULL, +@@ -6518,6 +7162,10 @@ static const GenefxFunc Bop_a8_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = Bop_a8_set_alphapixel_Aop_vyu, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_a8_set_alphapixel_Aop_bgr24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /************** Bop_a1_set_alphapixel_Aop_PFI *********************************/ +@@ -6673,6 +7321,25 @@ static void Bop_a1_set_alphapixel_Aop_rgb24( GenefxState *gfxs ) + } + } + ++static void Bop_a1_set_alphapixel_Aop_bgr24( GenefxState *gfxs ) ++{ ++ int i; ++ int w = gfxs->length; ++ u8 *S = gfxs->Bop[0]; ++ u8 *D = gfxs->Aop[0]; ++ DFBColor color = gfxs->color; ++ ++ for (i=0; i>3] & (0x80 >> (i&7))) { ++ D[0] = color.r; ++ D[1] = color.g; ++ D[2] = color.b; ++ } ++ ++ D += 3; ++ } ++} ++ + static void Bop_a1_set_alphapixel_Aop_rgb32( GenefxState *gfxs ) + { + int i; +@@ -6881,6 +7548,7 @@ static const GenefxFunc Bop_a1_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_a1_set_alphapixel_Aop_argb2554, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_a1_set_alphapixel_Aop_argb4444, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = Bop_a1_set_alphapixel_Aop_rgba4444, +@@ -6902,6 +7570,10 @@ static const GenefxFunc Bop_a1_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_a1_set_alphapixel_Aop_bgr24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /************** Bop_a1_lsb_set_alphapixel_Aop_PFI *********************************/ +@@ -7016,6 +7688,25 @@ static void Bop_a1_lsb_set_alphapixel_Aop_rgb24( GenefxState *gfxs ) + } + } + ++static void Bop_a1_lsb_set_alphapixel_Aop_bgr24( GenefxState *gfxs ) ++{ ++ int i; ++ int w = gfxs->length; ++ u8 *S = gfxs->Bop[0]; ++ u8 *D = gfxs->Aop[0]; ++ DFBColor color = gfxs->color; ++ ++ for (i=0; i>3] & (1 << (i&7))) { ++ D[0] = color.r; ++ D[1] = color.g; ++ D[2] = color.b; ++ } ++ ++ D += 3; ++ } ++} ++ + static void Bop_a1_lsb_set_alphapixel_Aop_rgb32( GenefxState *gfxs ) + { + int i; +@@ -7192,6 +7883,7 @@ static const GenefxFunc Bop_a1_lsb_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = Bop_a1_lsb_set_alphapixel_Aop_argb2554, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = Bop_a1_lsb_set_alphapixel_Aop_argb4444, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = NULL, +@@ -7213,6 +7905,10 @@ static const GenefxFunc Bop_a1_lsb_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = Bop_a1_lsb_set_alphapixel_Aop_bgr24, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /**************************** Bop_translate_to_Aop ****************************/ +@@ -8050,6 +8746,7 @@ static const GenefxFunc Bop_argb_blend_alphachannel_src_invsrc_Aop_PFI[DFB_NUM_P + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = NULL, +@@ -8071,6 +8768,10 @@ static const GenefxFunc Bop_argb_blend_alphachannel_src_invsrc_Aop_PFI[DFB_NUM_P + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /**********************************************************************************************************************/ +@@ -8129,6 +8830,7 @@ static const GenefxFunc Bop_argb_blend_alphachannel_one_invsrc_Aop_PFI[DFB_NUM_P + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = NULL, +@@ -8150,6 +8852,10 @@ static const GenefxFunc Bop_argb_blend_alphachannel_one_invsrc_Aop_PFI[DFB_NUM_P + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /**********************************************************************************************************************/ +@@ -8213,6 +8919,7 @@ static const GenefxFunc Bop_argb_blend_alphachannel_one_invsrc_premultiply_Aop_P + [DFB_PIXELFORMAT_INDEX(DSPF_A1)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV12)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_NV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB2554)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_ARGB4444)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_RGBA4444)] = NULL, +@@ -8234,6 +8941,10 @@ static const GenefxFunc Bop_argb_blend_alphachannel_one_invsrc_premultiply_Aop_P + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, + }; + + /**********************************************************************************************************************/ +@@ -8674,6 +9385,9 @@ gAcquireSetup( CardState *state, DFBAccelerationMask accel ) + case DSPF_NV12: + case DSPF_NV21: + case DSPF_NV16: ++ case DSPF_NV24: ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: + gfxs->dst_org[1] = gfxs->dst_org[0] + gfxs->dst_height * gfxs->dst_pitch; + break; + case DSPF_YUV444P: +@@ -8717,6 +9431,9 @@ gAcquireSetup( CardState *state, DFBAccelerationMask accel ) + case DSPF_NV12: + case DSPF_NV21: + case DSPF_NV16: ++ case DSPF_NV24: ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: + gfxs->src_org[1] = gfxs->src_org[0] + gfxs->src_height * gfxs->src_pitch; + break; + case DSPF_YUV444P: +@@ -8759,6 +9476,9 @@ gAcquireSetup( CardState *state, DFBAccelerationMask accel ) + case DSPF_RGB24: + gfxs->Cop = PIXEL_RGB32( color.r, color.g, color.b ); + break; ++ case DSPF_BGR24: ++ gfxs->Cop = PIXEL_RGB32( color.b, color.g, color.r ); ++ break; + case DSPF_RGB32: + gfxs->Cop = PIXEL_RGB32( color.r, color.g, color.b ); + break; +@@ -8803,18 +9523,18 @@ gAcquireSetup( CardState *state, DFBAccelerationMask accel ) + case DSPF_YV12: + case DSPF_YV16: + case DSPF_NV12: ++ case DSPF_NV21: + case DSPF_NV16: ++ case DSPF_NV24: ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: + case DSPF_YUV444P: + RGB_TO_YCBCR( color.r, color.g, color.b, + gfxs->YCop, gfxs->CbCop, gfxs->CrCop ); + gfxs->Cop = gfxs->YCop; + break; +- case DSPF_NV21: +- RGB_TO_YCBCR( color.r, color.g, color.b, +- gfxs->YCop, gfxs->CrCop, gfxs->CbCop ); +- gfxs->Cop = gfxs->YCop; +- break; + case DSPF_LUT2: ++ case DSPF_LUT4: + case DSPF_LUT8: + gfxs->Cop = state->color_index; + gfxs->Alut = destination->palette; +@@ -8875,6 +9595,7 @@ gAcquireSetup( CardState *state, DFBAccelerationMask accel ) + if (DFB_BLITTING_FUNCTION( accel )) { + switch (gfxs->src_format) { + case DSPF_LUT2: ++ case DSPF_LUT4: + case DSPF_LUT8: + case DSPF_ALUT44: + gfxs->Blut = source->palette; +@@ -8889,6 +9610,7 @@ gAcquireSetup( CardState *state, DFBAccelerationMask accel ) + case DSPF_RGB16: + case DSPF_RGB18: + case DSPF_RGB24: ++ case DSPF_BGR24: + case DSPF_RGB32: + case DSPF_ARGB: + case DSPF_ABGR: +@@ -8917,6 +9639,9 @@ gAcquireSetup( CardState *state, DFBAccelerationMask accel ) + case DSPF_NV12: + case DSPF_NV21: + case DSPF_NV16: ++ case DSPF_NV24: ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: + if (state->blittingflags & DSBLIT_SRC_COLORKEY) + return false; + case DSPF_YUY2: +diff --git a/src/gfx/generic/generic_stretch_blit.c b/src/gfx/generic/generic_stretch_blit.c +index e642d4c..869e672 100644 +--- a/src/gfx/generic/generic_stretch_blit.c ++++ b/src/gfx/generic/generic_stretch_blit.c +@@ -295,6 +295,11 @@ static const StretchFunctionTable *stretch_tables[DFB_NUM_PIXELFORMATS] = { + [DFB_PIXELFORMAT_INDEX(DSPF_VYU)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_A1_LSB)] = NULL, + [DFB_PIXELFORMAT_INDEX(DSPF_YV16)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_LUT4)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_BGR24)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV12MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV16MB)] = NULL, ++ [DFB_PIXELFORMAT_INDEX(DSPF_NV24)] = NULL, + }; + + /**********************************************************************************************************************/ +diff --git a/src/gfx/generic/generic_util.c b/src/gfx/generic/generic_util.c +index 644008d..5a686d9 100644 +--- a/src/gfx/generic/generic_util.c ++++ b/src/gfx/generic/generic_util.c +@@ -106,7 +106,14 @@ void Genefx_Aop_xy( GenefxState *gfxs, int x, int y ) + case DSPF_NV16: + x &= ~1; + break; ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ y &= ~31L; ++ x &= ~31L; ++ gfxs->AopY = y; ++ break; + case DSPF_YUV444P: /* nothing to adjust */ ++ case DSPF_NV24: + default: + break; + } +@@ -121,6 +128,25 @@ void Genefx_Aop_xy( GenefxState *gfxs, int x, int y ) + + gfxs->Aop[1] += y * pitch + x; + gfxs->Aop[2] += y * pitch + x; ++ ++ switch (gfxs->dst_format) { ++ /* overwrite Aop[] when dst_format is a DSPF_NV1xMB */ ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ gfxs->Aop[0] = RASTER_TO_NV1xMB_ADDR(gfxs->dst_org[0], ++ pitch, x, y, 0); ++ /* we don't handle chroma yet */ ++ gfxs->Aop[1] = 0; ++ /* orignal signed coordinates */ ++ gfxs->Aop[2] = (void*)(((y & 0xffff) << 16) | (x & 0xffff)); ++ break; ++ case DSPF_NV24: ++ /* adjust again as chroma is fully sampled */ ++ gfxs->Aop[1] += y * pitch + x; ++ break; ++ default: ++ break; ++ } + } + } + +@@ -215,6 +241,18 @@ void Genefx_Aop_next( GenefxState *gfxs ) + gfxs->Aop[2] += pitch; + } + } ++ else if (gfxs->dst_format == DSPF_NV12MB ++ || gfxs->dst_format == DSPF_NV16MB) { ++ int x0 = ((u32)gfxs->Aop[2] & 0xffff); ++ int y0 = (short)(((u32)gfxs->Aop[2] >> 16) & 0xffff); ++ gfxs->Aop[0] = RASTER_TO_NV1xMB_ADDR(gfxs->dst_org[0], pitch, ++ x0, (gfxs->AopY + 1), ++ (gfxs->AopY + 1) - y0); ++ gfxs->Aop[1] = 0; ++ } ++ else if (gfxs->dst_format == DSPF_NV24) { ++ gfxs->Aop[1] += pitch * 2; ++ } + else { /* NV16 */ + if (gfxs->dst_caps & DSCAPS_SEPARATED) { + if (gfxs->Aop_field & 1) +@@ -310,6 +348,18 @@ void Genefx_Aop_prev( GenefxState *gfxs ) + gfxs->Aop[2] -= pitch; + } + } ++ else if (gfxs->dst_format == DSPF_NV12MB ++ || gfxs->dst_format == DSPF_NV16MB) { ++ int x0 = ((u32)gfxs->Aop[2] & 0xffff); ++ int y0 = (short)(((u32)gfxs->Aop[2] >> 16) & 0xffff); ++ gfxs->Aop[0] = RASTER_TO_NV1xMB_ADDR(gfxs->dst_org[0], pitch, ++ x0, (gfxs->AopY - 1), ++ (gfxs->AopY - 1) - y0); ++ gfxs->Aop[1] = 0; ++ } ++ else if (gfxs->dst_format == DSPF_NV24) { ++ gfxs->Aop[1] -= pitch * 2; ++ } + else { /* NV16 */ + if (gfxs->dst_caps & DSCAPS_SEPARATED) { + if (gfxs->Aop_field & 1) +@@ -369,7 +419,14 @@ void Genefx_Bop_xy( GenefxState *gfxs, int x, int y ) + case DSPF_NV16: + x &= ~1; + break; ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ y &= ~31L; ++ x &= ~31L; ++ gfxs->BopY = y; ++ break; + case DSPF_YUV444P: /* nothing to adjust */ ++ case DSPF_NV24: + default: + break; + } +@@ -384,6 +441,25 @@ void Genefx_Bop_xy( GenefxState *gfxs, int x, int y ) + + gfxs->Bop[1] += y * pitch + x; + gfxs->Bop[2] += y * pitch + x; ++ ++ switch (gfxs->src_format) { ++ /* overwrite Aop[] when dst_format is & DSPF_NV1xMB */ ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ gfxs->Bop[0] = RASTER_TO_NV1xMB_ADDR(gfxs->src_org[0], ++ pitch, x, y, 0); ++ /* we don't handle chroma yet */ ++ gfxs->Bop[1] = 0; ++ /* orignal signed coordinates */ ++ gfxs->Bop[2] = (void*)(((y & 0xffff) << 16) | (x & 0xffff)); ++ break; ++ case DSPF_NV24: ++ /* adjust again as chroma is fully sampled */ ++ gfxs->Bop[1] += y * pitch + x; ++ break; ++ default: ++ break; ++ } + } + } + +@@ -466,6 +542,18 @@ void Genefx_Bop_next( GenefxState *gfxs ) + gfxs->Bop[2] += pitch; + } + } ++ else if (gfxs->src_format == DSPF_NV12MB ++ || gfxs->src_format == DSPF_NV16MB) { ++ int x0 = ((u32)gfxs->Bop[2] & 0xffff); ++ int y0 = (short)(((u32)gfxs->Bop[2] >> 16) & 0xffff); ++ gfxs->Bop[0] = RASTER_TO_NV1xMB_ADDR(gfxs->src_org[0], pitch, ++ x0, (gfxs->BopY + 1), ++ (gfxs->BopY + 1) - y0); ++ gfxs->Bop[1] = 0; ++ } ++ else if (gfxs->src_format == DSPF_NV24) { ++ gfxs->Bop[1] += pitch * 2; ++ } + else { /* NV16 */ + if (gfxs->src_caps & DSCAPS_SEPARATED) { + if (gfxs->Bop_field & 1) +@@ -561,6 +649,18 @@ void Genefx_Bop_prev( GenefxState *gfxs ) + gfxs->Bop[2] -= pitch; + } + } ++ else if (gfxs->src_format == DSPF_NV12MB ++ || gfxs->src_format == DSPF_NV16MB) { ++ int x0 = ((u32)gfxs->Bop[2] & 0xffff); ++ int y0 = (short)(((u32)gfxs->Bop[2] >> 16) & 0xffff); ++ gfxs->Bop[0] = RASTER_TO_NV1xMB_ADDR(gfxs->src_org[0], pitch, ++ x0, (gfxs->BopY - 1), ++ (gfxs->BopY - 1) - y0); ++ gfxs->Bop[1] = 0; ++ } ++ else if (gfxs->src_format == DSPF_NV24) { ++ gfxs->Bop[1] -= pitch * 2; ++ } + else { /* NV16 */ + if (gfxs->src_caps & DSCAPS_SEPARATED) { + if (gfxs->Bop_field & 1) +diff --git a/src/idirectfb.c b/src/idirectfb.c +index 72da997..59d3dba 100644 +--- a/src/idirectfb.c ++++ b/src/idirectfb.c +@@ -660,11 +660,13 @@ IDirectFB_CreateSurface( IDirectFB *thiz, + case DSPF_AiRGB: + case DSPF_I420: + case DSPF_LUT2: ++ case DSPF_LUT4: + case DSPF_LUT8: + case DSPF_ALUT44: + case DSPF_RGB16: + case DSPF_RGB18: + case DSPF_RGB24: ++ case DSPF_BGR24: + case DSPF_RGB32: + case DSPF_RGB332: + case DSPF_UYVY: +@@ -680,6 +682,19 @@ IDirectFB_CreateSurface( IDirectFB *thiz, + case DSPF_BGR555: + case DSPF_RGBAF88871: + case DSPF_YUV444P: ++ case DSPF_NV24: ++ break; ++ ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ if ((width & 31L) || (height & 31L) ++ || (caps & (DSCAPS_SEPARATED ++ | DSCAPS_INTERLACED))) ++ return DFB_INVARG; ++ break; ++ case DSPF_BYTE: ++ if (caps != DSCAPS_VIDEOONLY) ++ return DFB_INVARG; + break; + + default: +@@ -894,7 +909,8 @@ IDirectFB_CreateSurface( IDirectFB *thiz, + if ((caps & DSCAPS_FLIPPING) == DSCAPS_FLIPPING) + caps &= ~DSCAPS_TRIPLE; + +- config.surface_caps = DSCAPS_NONE; ++ if (!(config.flags & DLCONF_SURFACE_CAPS)) ++ config.surface_caps = DSCAPS_NONE; + + if (caps & DSCAPS_PREMULTIPLIED) { + config.flags |= DLCONF_SURFACE_CAPS; +@@ -1054,6 +1070,7 @@ IDirectFB_CreateSurface( IDirectFB *thiz, + } + else { + CoreSurfaceConfig config; ++ CoreSurfaceTypeFlags type; + + config.flags = CSCONF_SIZE | CSCONF_FORMAT | CSCONF_COLORSPACE | CSCONF_CAPS; + config.size.w = width; +@@ -1062,7 +1079,9 @@ IDirectFB_CreateSurface( IDirectFB *thiz, + config.colorspace = colorspace; + config.caps = caps; + +- ret = CoreDFB_CreateSurface( data->core, &config, CSTF_NONE, resource_id, NULL, &surface ); ++ type = (format == DSPF_BYTE) ? CSTF_BUFFEROBJECT : 0; ++ ++ ret = CoreDFB_CreateSurface( data->core, &config, CSTF_NONE | type, resource_id, NULL, &surface ); + if (ret) + return ret; + } +diff --git a/src/media/idirectfbimageprovider.c b/src/media/idirectfbimageprovider.c +index a4e5a4f..e4d472e 100644 +--- a/src/media/idirectfbimageprovider.c ++++ b/src/media/idirectfbimageprovider.c +@@ -123,6 +123,16 @@ static DFBResult + IDirectFBImageProvider_SetRenderFlags( IDirectFBImageProvider *thiz, + DIRenderFlags flags ) + { ++ if (flags == DIRENDER_NONE) ++ return DFB_OK; ++ ++ return DFB_UNIMPLEMENTED; ++} ++ ++static DFBResult ++IDirectFBImageProvider_Sync( IDirectFBImageProvider *thiz, ++ DFBImageProviderSyncFlags flags ) ++{ + return DFB_UNIMPLEMENTED; + } + +@@ -145,6 +155,7 @@ IDirectFBImageProvider_Construct( IDirectFBImageProvider *thiz ) + thiz->RenderTo = IDirectFBImageProvider_RenderTo; + thiz->SetRenderCallback = IDirectFBImageProvider_SetRenderCallback; + thiz->SetRenderFlags = IDirectFBImageProvider_SetRenderFlags; ++ thiz->Sync = IDirectFBImageProvider_Sync; + thiz->WriteBack = IDirectFBImageProvider_WriteBack; + } + +diff --git a/src/misc/gfx_util.c b/src/misc/gfx_util.c +index f948e3d..166349b 100644 +--- a/src/misc/gfx_util.c ++++ b/src/misc/gfx_util.c +@@ -76,6 +76,68 @@ struct _PixopsFilter { + }; + + ++/* Only write to the 4:2:x Omega2 MB buffer's luma channel */ ++void dfb_write_nv1xmb_span( u32 *src, u8 color, u8 *dst[], int len, int dy ) ++{ ++ int i, l, idx; ++ u8 *d1, *dy1; ++ ++ static const int y_offet_table[32] = { ++ 8, 72, 136, 200, 0, 64, 128, 192, 24, 88, ++ 152, 216, 16, 80, 144, 208, 40, 104, 168, 232, ++ 32, 96, 160, 224, 56, 120, 184, 248, 48, 112, ++ 176, 240 ++ }; ++ ++ d1 = dst[0]; ++ ++ idx = (dy % 16) * 2; ++ dy1 = d1 + y_offet_table[idx]; ++ ++ /* len is assumed to be always even */ ++ for (i = 0, l = 0; i < (len - 1); i += 2) { ++ u32 y0, u0, v0; ++ u32 y1, u1, v1; ++ ++ if (l == 16) { ++ d1 += 2 * 256; ++ ++ idx = (dy % 16) * 2; ++ dy1 = d1 + y_offet_table[idx]; ++ ++ l = 0; ++ } ++ ++ if (src) { ++ RGB_TO_YCBCR( (src[i + 0] >> 16) & 0xff, ++ (src[i + 0] >> 8) & 0xff, ++ (src[i + 0] ) & 0xff, y0, u0, v0 ); ++ RGB_TO_YCBCR( (src[i + 1] >> 16) & 0xff, ++ (src[i + 1] >> 8) & 0xff, ++ (src[i + 1] ) & 0xff, y1, u1, v1 ); ++ /* we currently only handle luma */ ++ (void) u0; ++ (void) v0; ++ (void) u1; ++ (void) v1; ++ } else ++ y0 = y1 = color; ++ ++ if (l < 8) { ++ dy1[7 - l] = y0; ++ dy1[7 - (l + 1)] = y1; ++ } else { ++ if (l == 8) ++ dy1 = d1 + y_offet_table[++idx]; ++ ++ dy1[15 - l] = y0; ++ dy1[15 - (l + 1)] = y1; ++ } ++ ++ l += 2; ++ } ++} ++ + static void write_argb_span (u32 *src, u8 *dst[], int len, + int dx, int dy, CoreSurface *dst_surface, + bool premultiply) +@@ -263,6 +325,20 @@ static void write_argb_span (u32 *src, u8 *dst[], int len, + } + break; + ++ case DSPF_BGR24: ++ for (i = 0; i < len; i++) { ++#ifdef WORDS_BIGENDIAN ++ *d++ = src[i]; ++ *d++ = src[i] >> 8; ++ *d++ = src[i] >> 16; ++#else ++ *d++ = src[i] >> 16; ++ *d++ = src[i] >> 8; ++ *d++ = src[i]; ++#endif ++ } ++ break; ++ + case DSPF_RGB32: + case DSPF_ARGB: + direct_memcpy( d, src, len*4 ); +@@ -278,6 +354,25 @@ static void write_argb_span (u32 *src, u8 *dst[], int len, + ((u32*)d)[i] = src[i] ^ 0xff000000; + break; + ++ case DSPF_LUT4: ++ if (palette) { ++ for (i = 0; i < len; i += 2) { ++ u8 pixel = 0; ++ pixel = dfb_palette_search( palette, ++ (src[i] >> 16) & 0xff, ++ (src[i] >> 8) & 0xff, ++ (src[i] ) & 0xff, ++ (src[i] >> 24) & 0xff ); ++ pixel |= (dfb_palette_search( palette, ++ (src[i + 1] >> 16) & 0xff, ++ (src[i + 1] >> 8) & 0xff, ++ (src[i + 1] ) & 0xff, ++ (src[i + 1] >> 24) & 0xff )) << 4; ++ d[i] = pixel; ++ } ++ } ++ break; ++ + case DSPF_LUT8: + if (palette) { + for (i = 0; i < len; i++) { +@@ -523,6 +618,26 @@ static void write_argb_span (u32 *src, u8 *dst[], int len, + } + break; + ++ case DSPF_NV24: ++ d1 = dst[1]; ++ for (i = 0; i < len; i++) { ++ u32 y0, u0, v0; ++ ++ RGB_TO_YCBCR( (src[i+0] >> 16) & 0xff, ++ (src[i+0] >> 8) & 0xff, ++ (src[i+0] ) & 0xff, y0, u0, v0 ); ++ ++ d[i + 0] = y0; ++ d1[2 * i + 0] = u0; ++ d1[2 * i + 1] = v0; ++ } ++ break; ++ ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ dfb_write_nv1xmb_span( src, 0, dst, len, dy ); ++ break; ++ + case DSPF_NV21: + d1 = dst[1]; + for (i = 0; i < (len-1); i += 2) { +@@ -723,6 +838,34 @@ void dfb_copy_buffer_32( u32 *src, + } + break; + ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: ++ dst1 = dst + dpitch * dst_surface->config.size.h; ++ ++ if ((x & 31L) || (drect->y & 31L) ++ || (drect->h & 31L) || (drect->w & 15L)) { ++ D_WARN ("nv1xmb copy not performed because of a non 32 pixels aligned offsets."); ++ break; ++ } ++ ++ /* Clear the chroma channel for 4:2:x Omega2 MB buffers */ ++ if (dst_surface->config.format == DSPF_NV12MB) ++ memset(dst1, 127, dpitch * (dst_surface->config.size.h >> 1)); ++ if (dst_surface->config.format == DSPF_NV16MB) ++ memset(dst1, 127, dpitch * dst_surface->config.size.h); ++ ++ for (y = drect->y; y < drect->y + drect->h; y++) { ++ u8 *d[2]; ++ ++ d[0] = RASTER_TO_NV1xMB_ADDR( dst, dpitch, drect->x, ++ y, y - drect->y ); ++ ++ write_argb_span( src, d, drect->w, x, y - drect->y, dst_surface, true ); ++ ++ src += sw; ++ } ++ break; ++ + case DSPF_NV16: + dst1 = (u8*)dst + dpitch * dst_surface->config.size.h; + +@@ -740,6 +883,23 @@ void dfb_copy_buffer_32( u32 *src, + } + break; + ++ case DSPF_NV24: ++ dst1 = (u8*)dst + dpitch * dst_surface->config.size.h; ++ ++ for (y = drect->y; y < drect->y + drect->h; y++) { ++ u8 *d[2]; ++ ++ d[0] = LINE_PTR( dst, dst_surface->config.caps, y, ++ dst_surface->config.size.h, dpitch ) + x; ++ d[1] = LINE_PTR( dst1, dst_surface->config.caps, y, ++ dst_surface->config.size.h, dpitch * 2 ) + x * 2; ++ ++ write_argb_span( src, d, drect->w, x, y, dst_surface, true ); ++ ++ src += sw; ++ } ++ break; ++ + case DSPF_YUV444P: + dst1 = (u8*)dst + dpitch * dst_surface->config.size.h; + dst2 = dst1 + dpitch * dst_surface->config.size.h; +@@ -1027,8 +1187,11 @@ void dfb_scale_linear_32( u32 *src, int sw, int sh, + dst1 = dst2 + dpitch/2 * dst_surface->config.size.h; + break; + case DSPF_NV12: ++ case DSPF_NV12MB: ++ case DSPF_NV16MB: + case DSPF_NV21: + case DSPF_NV16: ++ case DSPF_NV24: + dst1 = (u8*)dst + dpitch * dst_surface->config.size.h; + break; + case DSPF_YUV444P: +@@ -1039,6 +1202,12 @@ void dfb_scale_linear_32( u32 *src, int sw, int sh, + break; + } + ++ /* Clear the chroma channel for 4:2:x Omega2 MB buffers */ ++ if (dst_surface->config.format == DSPF_NV12MB) ++ memset(dst1, 127, dpitch * (dst_surface->config.size.h >> 1)); ++ if (dst_surface->config.format == DSPF_NV16MB) ++ memset(dst1, 127, dpitch * dst_surface->config.size.h); ++ + buf = (u32*) alloca( drect->w * 4 ); + + for (i = drect->y; i < drect->y + drect->h; i++) { +@@ -1126,6 +1295,15 @@ void dfb_scale_linear_32( u32 *src, int sw, int sh, + d[1] = LINE_PTR( dst1, dst_surface->config.caps, i, + dst_surface->config.size.h, dpitch ) + (drect->x&~1); + break; ++ case DSPF_NV24: ++ d[1] = LINE_PTR( dst1, dst_surface->config.caps, i, ++ dst_surface->config.size.h, dpitch * 2 ) + (drect->x * 2); ++ break; ++ case DSPF_NV16MB: ++ case DSPF_NV12MB: ++ d[0] = RASTER_TO_NV1xMB_ADDR( dst, dpitch, drect->x, ++ i, i - drect->y ); ++ break; + case DSPF_YUV444P: + d[1] = LINE_PTR( dst1, dst_surface->config.caps, i, + dst_surface->config.size.h, dpitch ) + drect->x; +@@ -1136,7 +1314,11 @@ void dfb_scale_linear_32( u32 *src, int sw, int sh, + break; + } + +- write_argb_span( buf, d, drect->w, drect->x, i, dst_surface, false ); ++ if ((dst_surface->config.format == DSPF_NV12MB) ++ || (dst_surface->config.format == DSPF_NV16MB)) ++ write_argb_span( buf, d, drect->w, drect->x, i - drect->y, dst_surface, false ); ++ else ++ write_argb_span( buf, d, drect->w, drect->x, i, dst_surface, false ); + } + + D_FREE(filter.weights); +diff --git a/src/misc/gfx_util.h b/src/misc/gfx_util.h +index 56b7944..68cbe7b 100644 +--- a/src/misc/gfx_util.h ++++ b/src/misc/gfx_util.h +@@ -44,5 +44,11 @@ void dfb_scale_linear_32( u32 *src, int sw, int sh, + void *dst, int dpitch, DFBRectangle *drect, + CoreSurface *dst_surface, const DFBRegion *dst_clip ); + ++#define RASTER_TO_NV1xMB_ADDR( dst, pitch, dx, y, dy ) \ ++ (dst + ((y / 32) * (pitch / 16) * 256 * 2) \ ++ + (((dy / 16) & 1L) ? ((dx / 16) * 2 + 1) * 256 \ ++ : (dx / 16) * 2 * 256)) ++ ++void dfb_write_nv1xmb_span( u32 *src, u8 color, u8 *dst[], int len, int dy ); + + #endif +diff --git a/src/misc/util.c b/src/misc/util.c +index 2fbefed..9ad9670 100644 +--- a/src/misc/util.c ++++ b/src/misc/util.c +@@ -464,6 +464,8 @@ dfb_pixelformat_for_depth( int depth ) + switch (depth) { + case 2: + return DSPF_LUT2; ++ case 4: ++ return DSPF_LUT4; + case 8: + return DSPF_LUT8; + case 12: +diff --git a/systems/Makefile.am b/systems/Makefile.am +index 163acdc..e379afe 100644 +--- a/systems/Makefile.am ++++ b/systems/Makefile.am +@@ -60,6 +60,12 @@ else + VNC_DIR = + endif + ++if STMFBDEV_CORE ++STMFBDEV_DIR = stmfbdev ++else ++STMFBDEV_DIR = ++endif ++ + + SUBDIRS = \ + android \ +@@ -73,4 +79,5 @@ SUBDIRS = \ + $(X11VDPAU_DIR) \ + $(SDL_DIR) \ + $(OSX_DIR) \ +- $(VNC_DIR) ++ $(VNC_DIR) \ ++ $(STMFBDEV_DIR) +diff --git a/systems/fbdev/fbdev_surface_pool.c b/systems/fbdev/fbdev_surface_pool.c +index 0d5742b..adad130 100644 +--- a/systems/fbdev/fbdev_surface_pool.c ++++ b/systems/fbdev/fbdev_surface_pool.c +@@ -112,7 +112,7 @@ fbdevInitPool( CoreDFB *core, + ret_desc->caps = CSPCAPS_PHYSICAL | CSPCAPS_VIRTUAL; + ret_desc->access[CSAID_CPU] = CSAF_READ | CSAF_WRITE | CSAF_SHARED; + ret_desc->access[CSAID_GPU] = CSAF_READ | CSAF_WRITE | CSAF_SHARED; +- ret_desc->types = CSTF_LAYER | CSTF_WINDOW | CSTF_CURSOR | CSTF_FONT | CSTF_SHARED | CSTF_EXTERNAL; ++ ret_desc->types = CSTF_LAYER | CSTF_WINDOW | CSTF_CURSOR | CSTF_FONT | CSTF_SHARED | CSTF_EXTERNAL | CSTF_BUFFEROBJECT; + ret_desc->priority = CSPP_DEFAULT; + + /* For hardware layers */ +diff --git a/systems/sdl/primary.c b/systems/sdl/primary.c +index 6848bc8..7551515 100644 +--- a/systems/sdl/primary.c ++++ b/systems/sdl/primary.c +@@ -334,7 +334,8 @@ update_screen( int x, int y, int w, int h ) + #if 0 + int i, n; + void *dst; +- void *src; ++ u8 *srces[3]; ++ int pitches[3]; + DFBResult ret; + CoreSurface *surface; + CoreSurfaceBuffer *buffer; +@@ -385,23 +386,25 @@ update_screen( int x, int y, int w, int h ) + return ret; + } + +- src = lock.addr; + dst = screen->pixels; +- +- src += DFB_BYTES_PER_LINE( surface->config.format, x ) + y * lock.pitch; + dst += DFB_BYTES_PER_LINE( surface->config.format, x ) + y * screen->pitch; + ++ dfb_surface_get_data_offsets( surface->data, lock.addr, lock.pitch, x, y, ++ 3, srces, pitches ); ++ + D_DEBUG_AT( SDL_Updates, " -> copying pixels...\n" ); + + switch (screen->format->BitsPerPixel) { + case 16: + dfb_convert_to_rgb16( surface->config.format, +- src, lock.pitch, surface->config.size.h, ++ srces[0], pitches[0], ++ srces[1], pitches[1], srces[2], pitches[2], ++ surface->config.size.h, + dst, screen->pitch, w, h ); + break; + + default: +- direct_memcpy( dst, src, DFB_BYTES_PER_LINE( surface->config.format, w ) ); ++ direct_memcpy( dst, srces[0], DFB_BYTES_PER_LINE( surface->config.format, w ) ); + } + + D_DEBUG_AT( SDL_Updates, " -> unlocking dfb surface...\n" ); +diff --git a/systems/stmfbdev/Makefile.am b/systems/stmfbdev/Makefile.am +new file mode 100644 +index 0000000..3df3151 +--- /dev/null ++++ b/systems/stmfbdev/Makefile.am +@@ -0,0 +1,55 @@ ++## Makefile.am for DirectFB/systems/stmfbdev ++ ++if STMFBDEV_USE_OWN_HEADERS ++STMFB_INCLUDE_PATH = -I$(srcdir)/include ++else ++STMFB_INCLUDE_PATH = ++endif ++ ++INCLUDES = \ ++ -I$(top_builddir)/include \ ++ -I$(top_builddir)/lib \ ++ -I$(top_srcdir)/include \ ++ -I$(top_srcdir)/lib \ ++ -I$(top_srcdir)/src \ ++ $(STMFB_INCLUDE_PATH) ++ ++ ++internalincludedir = $(INTERNALINCLUDEDIR)/stmfbdev ++ ++internalinclude_HEADERS = \ ++ fb.h \ ++ vt.h \ ++ surfacemanager.h \ ++ stmfbdev.h ++ ++systemsdir = $(MODULEDIR)/systems ++ ++if BUILD_STATIC ++systems_DATA = libdirectfb_stmfbdev.o ++endif ++systems_LTLIBRARIES = libdirectfb_stmfbdev.la ++ ++libdirectfb_stmfbdev_la_LDFLAGS = \ ++ -avoid-version \ ++ -module ++ ++libdirectfb_stmfbdev_la_SOURCES = \ ++ vt.c \ ++ \ ++ stmfbdev_screen.c \ ++ stmfbdev_layer.c \ ++ \ ++ surfacemanager.c \ ++ stmfbdev_surface_pool.c \ ++ stmfb_aux_surface_pool.c \ ++ \ ++ stmfbdev.c ++ ++libdirectfb_stmfbdev_la_LIBADD = \ ++ $(top_builddir)/lib/direct/libdirect.la \ ++ $(top_builddir)/lib/fusion/libfusion.la \ ++ $(top_builddir)/src/libdirectfb.la ++ ++ ++include $(top_srcdir)/rules/libobject.make +diff --git a/systems/stmfbdev/fb.h b/systems/stmfbdev/fb.h +new file mode 120000 +index 0000000..887b227 +--- /dev/null ++++ b/systems/stmfbdev/fb.h +@@ -0,0 +1 @@ ++../fbdev/fb.h +\ No newline at end of file +diff --git a/systems/stmfbdev/include/linux/stmfb.h b/systems/stmfbdev/include/linux/stmfb.h +new file mode 100644 +index 0000000..e65f4c9 +--- /dev/null ++++ b/systems/stmfbdev/include/linux/stmfb.h +@@ -0,0 +1,785 @@ ++/*********************************************************************** ++ * ++ * File: linux/kernel/drivers/video/stmfb.h ++ * Copyright (c) 2000, 2004, 2005 STMicroelectronics Limited. ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file COPYING in the main directory of this archive for ++ * more details. ++ * ++\***********************************************************************/ ++ ++#ifndef _STMFB_H ++#define _STMFB_H ++ ++/* ++ * Surface definitions for usermode, in the kernel driver they are ++ * already defined internally as part of the generic framework. ++ */ ++#if !defined(__KERNEL__) ++#include ++typedef enum ++{ ++ SURF_NULL_PAD, ++ SURF_RGB565 , ++ SURF_RGB888 , ++ SURF_ARGB8565, ++ SURF_ARGB8888, ++ SURF_ARGB1555, ++ SURF_ARGB4444, ++ SURF_CRYCB888, /* Note the order of the components */ ++ SURF_YCBCR422R, ++ SURF_YCBCR422MB, ++ SURF_YCBCR420MB, ++ SURF_ACRYCB8888, /* Note the order, not compatible with DirectFB's AYUV */ ++ SURF_CLUT1, ++ SURF_CLUT2, ++ SURF_CLUT4, ++ SURF_CLUT8, ++ SURF_ACLUT44, ++ SURF_ACLUT88, ++ SURF_A1, ++ SURF_A8, ++ SURF_BGRA8888, /* Bigendian ARGB */ ++ SURF_YUYV, /* 422R with luma and chroma byteswapped */ ++ SURF_YUV420, /* Planar YUV with 1/2 horizontal and vertical chroma */ ++ /* in three separate buffers Y,Cb then Cr */ ++ SURF_YVU420, /* Planar YUV with 1/2 horizontal and vertical chroma */ ++ /* in three separate buffers Y,Cr then Cb */ ++ SURF_YUV422P, /* Planar YUV with 1/2 horizontal chroma */ ++ /* in three separate buffers Y,Cb then Cr */ ++ ++ SURF_RLD_BD, /* RLE Decoding controlled by setting source format */ ++ SURF_RLD_H2, ++ SURF_RLD_H8, ++ SURF_CLUT8_ARGB4444_ENTRIES, /* For cursor plane support */ ++ SURF_YCbCr420R2B, /* fourCC: NV12: 12 bit YCbCr (8 bit Y plane followed by ++ one 16 bit quarter size ++ Cb|Cr [7:0|7:0] plane) */ ++ SURF_YCbCr422R2B, /* fourCC: NV16: 16 bit YCbCr (8 bit Y plane followed by ++ one 16 bit half width ++ Cb|Cr [7:0|7:0] plane) */ ++ ++ SURF_END, ++ SURF_COUNT = SURF_END ++}stm_pixel_format_t; ++ ++typedef stm_pixel_format_t SURF_FMT; /*!< For backwards compatibility */ ++ ++#endif /* !__KERNEL__ */ ++ ++typedef enum ++{ ++ STMFBGP_FRAMEBUFFER, ++ ++ STMFBGP_GFX_FIRST, ++ STMFBGP_GFX0 = STMFBGP_GFX_FIRST, ++ STMFBGP_GFX1, ++ STMFBGP_GFX2, ++ STMFBGP_GFX3, ++ STMFBGP_GFX4, ++ STMFBGP_GFX_LAST = STMFBGP_GFX4 ++ ++} STMFB_GFXMEMORY_PARTITION; ++ ++ ++/* ++ * Defined for STMFBIO_CGMS_ANALOG (use as bitfield) ++ */ ++#define STMFBIO_CGMS_ANALOG_COPYRIGHT_ASSERTED 1 /* copyright bit */ ++#define STMFBIO_CGMS_ANALOG_COPYING_RESTRICTED 2 /* generation bit */ ++ ++ ++#define STMFBIO_COLOURKEY_FLAGS_ENABLE 0x00000001 ++#define STMFBIO_COLOURKEY_FLAGS_INVERT 0x00000002 ++ ++typedef enum { ++ STMFBIO_FF_OFF, ++ STMFBIO_FF_SIMPLE, ++ STMFBIO_FF_ADAPTIVE ++} stmfbio_ff_state; ++ ++ ++#define STMFBIO_VAR_CAPS_NONE (0) ++#define STMFBIO_VAR_CAPS_COLOURKEY (1L<<1) ++#define STMFBIO_VAR_CAPS_FLICKER_FILTER (1L<<2) ++#define STMFBIO_VAR_CAPS_PREMULTIPLIED (1L<<3) ++#define STMFBIO_VAR_CAPS_OPACITY (1L<<4) ++#define STMFBIO_VAR_CAPS_GAIN (1L<<5) ++#define STMFBIO_VAR_CAPS_BRIGHTNESS (1L<<6) ++#define STMFBIO_VAR_CAPS_SATURATION (1L<<7) ++#define STMFBIO_VAR_CAPS_CONTRAST (1L<<8) ++#define STMFBIO_VAR_CAPS_TINT (1L<<9) ++#define STMFBIO_VAR_CAPS_ALPHA_RAMP (1L<<10) ++#define STMFBIO_VAR_CAPS_ZPOSITION (1L<<11) ++#define STBFBIO_VAR_CAPS_RESCALE_COLOUR_TO_VIDEO_RANGE (1L<<12) ++ ++enum stmfbio_output_id { ++ STMFBIO_OUTPUTID_INVALID, ++ ++ STMFBIO_OUTPUTID_MAIN, ++}; ++ ++ ++typedef enum _stmfbio_activate { ++ STMFBIO_ACTIVATE_IMMEDIATE = 0x00000000, ++ STMFBIO_ACTIVATE_ON_NEXT_CHANGE = 0x00000001, ++ STMFBIO_ACTIVATE_TEST = 0x00000002, ++ STMFBIO_ACTIVATE_MASK = 0x0000000f, ++ ++ STMFBIO_ACTIVATE_VBL = 0x00000010, ++} stmfbio_activate; ++ ++ ++enum stmfbio_output_standard { ++ STMFBIO_STD_UNKNOWN, ++ /* */ ++ STMFBIO_STD_PAL_BDGHI = 0x4000000000000000LLU, ++ STMFBIO_STD_SECAM = 0x2000000000000000LLU, ++ ++ /* analogue standards are a mess - the following values ++ coincidentially coincide with the v4l2 defines... */ ++ STMFBIO_STD_PAL_M = 0x0000000000000100LLU, ++ STMFBIO_STD_PAL_N = 0x0000000000000200LLU, ++ STMFBIO_STD_PAL_Nc = 0x0000000000000400LLU, ++ STMFBIO_STD_PAL_60 = 0x0000000000000800LLU, ++ ++ STMFBIO_STD_NTSC_M = 0x0000000000001000LLU, ++ STMFBIO_STD_NTSC_M_JP = 0x0000000000002000LLU, ++ STMFBIO_STD_NTSC_443 = 0x0000000000004000LLU, ++ ++ /* */ ++ STMFBIO_STD_VGA_60 = 0x0000000100000000LLU, ++ STMFBIO_STD_VGA_59_94 = 0x0000000200000000LLU, ++ STMFBIO_STD_480P_60 = 0x0000000400000000LLU, ++ STMFBIO_STD_480P_59_94 = 0x0000000800000000LLU, ++ STMFBIO_STD_576P_50 = 0x0000001000000000LLU, ++ STMFBIO_STD_1080P_60 = 0x0000002000000000LLU, ++ STMFBIO_STD_1080P_59_94 = 0x0000004000000000LLU, ++ STMFBIO_STD_1080P_50 = 0x0000008000000000LLU, ++ STMFBIO_STD_1080P_23_976 = 0x0000010000000000LLU, ++ STMFBIO_STD_1080P_24 = 0x0000020000000000LLU, ++ STMFBIO_STD_1080P_25 = 0x0000040000000000LLU, ++ STMFBIO_STD_1080P_29_97 = 0x0000080000000000LLU, ++ STMFBIO_STD_1080P_30 = 0x0000100000000000LLU, ++ STMFBIO_STD_1080I_60 = 0x0000200000000000LLU, ++ STMFBIO_STD_1080I_59_94 = 0x0000400000000000LLU, ++ STMFBIO_STD_1080I_50 = 0x0000800000000000LLU, ++ STMFBIO_STD_720P_60 = 0x0001000000000000LLU, ++ STMFBIO_STD_720P_59_94 = 0x0002000000000000LLU, ++ STMFBIO_STD_720P_50 = 0x0004000000000000LLU, ++ ++ STMFBIO_STD_QFHD3660 = 0x0010000000000000LLU, ++ STMFBIO_STD_QFHD3650 = 0x0020000000000000LLU, ++ STMFBIO_STD_WQFHD5660 = 0x0040000000000000LLU, ++ STMFBIO_STD_WQFHD5650 = 0x0080000000000000LLU, ++ STMFBIO_STD_QFHD5660 = 0x0100000000000000LLU, ++ STMFBIO_STD_QFHD5650 = 0x0200000000000000LLU, ++ STMFBIO_STD_QFHD1830 = 0x0400000000000000LLU, ++ STMFBIO_STD_QFHD1825 = 0x0800000000000000LLU, ++ ++ STMFBIO_STD_XGA_60 = 0x1000000000000000LLU, ++ STMFBIO_STD_XGA_75 = 0x2000000000000000LLU, ++ STMFBIO_STD_XGA_85 = 0x4000000000000000LLU, ++}; ++ ++ ++#define STMFBIO_STD_NTSC (STMFBIO_STD_NTSC_M \ ++ | STMFBIO_STD_NTSC_M_JP) ++ ++#define STMFBIO_STD_PAL (STMFBIO_STD_PAL_BDGHI) ++ ++#define STMFBIO_STD_525_60 (STMFBIO_STD_PAL_M \ ++ | STMFBIO_STD_PAL_60 \ ++ | STMFBIO_STD_NTSC \ ++ | STMFBIO_STD_NTSC_443) ++#define STMFBIO_STD_625_50 (STMFBIO_STD_PAL \ ++ | STMFBIO_STD_PAL_N \ ++ | STMFBIO_STD_PAL_Nc \ ++ | STMFBIO_STD_SECAM) ++ ++#define STMFBIO_STD_SMPTE293M (STMFBIO_STD_480P_60 \ ++ | STMFBIO_STD_480P_59_94 \ ++ | STMFBIO_STD_576P_50) ++ ++#define STMFBIO_STD_SMPTE274M (STMFBIO_STD_1080P_60 \ ++ | STMFBIO_STD_1080P_59_94 \ ++ | STMFBIO_STD_1080P_50 \ ++ | STMFBIO_STD_1080P_23_976 \ ++ | STMFBIO_STD_1080P_24 \ ++ | STMFBIO_STD_1080P_25 \ ++ | STMFBIO_STD_1080P_29_97 \ ++ | STMFBIO_STD_1080P_30 \ ++ | STMFBIO_STD_1080I_60 \ ++ | STMFBIO_STD_1080I_59_94 \ ++ | STMFBIO_STD_1080I_50) ++ ++#define STMFBIO_STD_SMPTE296M (STMFBIO_STD_720P_60 \ ++ | STMFBIO_STD_720P_59_94 \ ++ | STMFBIO_STD_720P_50) ++ ++#define STMFBIO_STD_SD (STMFBIO_STD_525_60 \ ++ | STMFBIO_STD_625_50) ++ ++#define STMFBIO_STD_ED (STMFBIO_STD_SMPTE293M) ++ ++#define STMFBIO_STD_HD (STMFBIO_STD_SMPTE274M \ ++ | STMFBIO_STD_SMPTE296M) ++ ++#define STMFBIO_STD_VESA (STMFBIO_STD_VGA_60 \ ++ | STMFBIO_STD_VGA_59_94 \ ++ | STMFBIO_STD_XGA_60 \ ++ | STMFBIO_STD_XGA_75 \ ++ | STMFBIO_STD_XGA_85) ++ ++#define STMFBIO_STD_CEA861 (STMFBIO_STD_525_60 \ ++ | STMFBIO_STD_625_50 \ ++ | STMFBIO_STD_VGA_60 \ ++ | STMFBIO_STD_VGA_59_94 \ ++ | STMFBIO_STD_SMPTE293M \ ++ | STMFBIO_STD_SMPTE274M \ ++ | STMFBIO_STD_SMPTE296M) ++ ++#define STMFBIO_STD_NTG5 (STMFBIO_STD_QFHD3660 \ ++ | STMFBIO_STD_QFHD3650 \ ++ | STMFBIO_STD_WQFHD5660 \ ++ | STMFBIO_STD_WQFHD5650 \ ++ | STMFBIO_STD_QFHD5660 \ ++ | STMFBIO_STD_QFHD5650 \ ++ | STMFBIO_STD_QFHD1830 \ ++ | STMFBIO_STD_QFHD1825) ++ ++#define STMFBIO_STD_INTERLACED (STMFBIO_STD_525_60 \ ++ | STMFBIO_STD_625_50 \ ++ | STMFBIO_STD_1080I_60 \ ++ | STMFBIO_STD_1080I_59_94 \ ++ | STMFBIO_STD_1080I_50) ++ ++#define STMFBIO_STD_PROGRESSIVE (STMFBIO_STD_VGA_60 \ ++ | STMFBIO_STD_VGA_59_94 \ ++ | STMFBIO_STD_SMPTE293M \ ++ | STMFBIO_STD_1080P_60 \ ++ | STMFBIO_STD_1080P_59_94 \ ++ | STMFBIO_STD_1080P_50 \ ++ | STMFBIO_STD_1080P_23_976 \ ++ | STMFBIO_STD_1080P_24 \ ++ | STMFBIO_STD_1080P_25 \ ++ | STMFBIO_STD_1080P_29_97 \ ++ | STMFBIO_STD_1080P_30 \ ++ | STMFBIO_STD_SMPTE296M \ ++ | STMFBIO_STD_NTG5) ++ ++struct stmfbio_outputinfo ++{ ++ enum stmfbio_output_id outputid; ++ enum _stmfbio_activate activate; ++ enum stmfbio_output_standard standard; ++}; ++ ++struct stmfbio_outputstandards ++{ ++ enum stmfbio_output_id outputid; ++ enum stmfbio_output_standard all_standards; ++}; ++ ++struct stmfbio_plane_dimension { ++ __u32 w; ++ __u32 h; ++}; ++ ++struct stmfbio_plane_rect { ++ __u32 x; ++ __u32 y; ++ struct stmfbio_plane_dimension dim; ++}; ++ ++struct stmfbio_plane_config { ++ unsigned long baseaddr; ++ /* FIXME: the source API is incomplete! Should be updated to support a ++ real source 'viewport' inside a source surface. */ ++ struct stmfbio_plane_dimension source; /* resolution */ ++ struct stmfbio_plane_rect dest; ++ stm_pixel_format_t format; ++ __u32 pitch; /* desired pitch */ ++ ++ /* private */ ++ __u32 bitdepth; /* will be updated on successful return */ ++}; ++ ++struct stmfbio_planeinfo ++{ ++ __u32 layerid; /* must be 0 (for now) */ ++ enum _stmfbio_activate activate; ++ struct stmfbio_plane_config config; ++}; ++ ++struct stmfbio_plane_pan ++{ ++ __u32 layerid; /* must be 0 (for now) */ ++ enum _stmfbio_activate activate; ++ unsigned long baseaddr; ++}; ++ ++struct stmfbio_var_screeninfo_ex ++{ ++ /* ++ * Display layer to operate on, 0 is always the layer showing the framebuffer. ++ * No other layers have to be defined and the IOCTL will return ENODEV ++ * if given an invalid layerid. ++ */ ++ __u32 layerid; ++ __u32 caps; /* Valid entries in structure */ ++ __u32 failed; /* Indicates entries that failed during set */ ++ stmfbio_activate activate; ++ ++ /* ++ * STMFBIO_VAR_CAPS_COLOURKEY ++ */ ++ __u32 min_colour_key; ++ __u32 max_colour_key; ++ __u32 colourKeyFlags; ++ ++ stmfbio_ff_state ff_state; /* STMFBIO_VAR_CAPS_FLICKER_FILTER */ ++ ++ __u8 premultiplied_alpha; /* STMFBIO_VAR_CAPS_PREMULTIPLIED */ ++ __u8 rescale_colour_to_video_range; /* STBFBIO_VAR_CAPS_RESCALE_COLOUR_... */ ++ ++ __u8 opacity; /* STMFBIO_VAR_CAPS_OPACITY */ ++ __u8 gain; /* STMFBIO_VAR_CAPS_GAIN */ ++ __u8 brightness; /* STMFBIO_VAR_CAPS_BRIGHTNESS */ ++ __u8 saturation; /* STMFBIO_VAR_CAPS_SATURATION */ ++ __u8 contrast; /* STMFBIO_VAR_CAPS_CONTRAST */ ++ __u8 tint; /* STMFBIO_VAR_CAPS_HUE */ ++ __u8 alpha_ramp[2]; /* STMFBIO_CAR_CAPS_ALPHA_RAMP */ ++ ++ __u32 z_position; /* STMFBIO_VAR_CAPS_ZPOSITION */ ++}; ++ ++struct stmfbio_vps ++{ ++ __u8 vps_enable; ++ __u8 vps_data[6]; ++}; ++ ++/* ++ * Note: The standards are a bitfield in order to match the internal driver ++ * representation. Do not modify! ++ */ ++#define STMFBIO_OUTPUT_STD_PAL_BDGHI (1L<<0) ++#define STMFBIO_OUTPUT_STD_PAL_M (1L<<1) ++#define STMFBIO_OUTPUT_STD_PAL_N (1L<<2) ++#define STMFBIO_OUTPUT_STD_PAL_Nc (1L<<3) ++#define STMFBIO_OUTPUT_STD_NTSC_M (1L<<4) ++#define STMFBIO_OUTPUT_STD_NTSC_J (1L<<5) ++#define STMFBIO_OUTPUT_STD_NTSC_443 (1L<<6) ++#define STMFBIO_OUTPUT_STD_SECAM (1L<<7) ++#define STMFBIO_OUTPUT_STD_PAL_60 (1L<<8) ++ ++#define STMFBIO_OUTPUT_ANALOGUE_RGB (1L<<0) ++#define STMFBIO_OUTPUT_ANALOGUE_YPrPb (1L<<1) ++#define STMFBIO_OUTPUT_ANALOGUE_YC (1L<<2) ++#define STMFBIO_OUTPUT_ANALOGUE_CVBS (1L<<3) ++#define STMFBIO_OUTPUT_ANALOGUE_MASK (0xf) ++ ++#define STMFBIO_OUTPUT_ANALOGUE_CLIP_VIDEORANGE (0) ++#define STMFBIO_OUTPUT_ANALOGUE_CLIP_FULLRANGE (1L<<8) ++ ++#define STMFBIO_OUTPUT_ANALOGUE_COLORSPACE_AUTO (0) ++#define STMFBIO_OUTPUT_ANALOGUE_COLORSPACE_601 (1L<<9) ++#define STMFBIO_OUTPUT_ANALOGUE_COLORSPACE_709 (2L<<9) ++#define STMFBIO_OUTPUT_ANALOGUE_COLORSPACE_MASK (3L<<9) ++ ++ ++#define STMFBIO_OUTPUT_DVO_ENABLED (0) ++#define STMFBIO_OUTPUT_DVO_DISABLED (1L<<0) ++#define STMFBIO_OUTPUT_DVO_YUV_444_16BIT (0) ++#define STMFBIO_OUTPUT_DVO_YUV_444_24BIT (1L<<1) ++#define STMFBIO_OUTPUT_DVO_YUV_422_16BIT (2L<<1) ++#define STMFBIO_OUTPUT_DVO_ITUR656 (3L<<1) ++#define STMFBIO_OUTPUT_DVO_RGB_24BIT (4L<<1) ++#define STMFBIO_OUTPUT_DVO_MODE_MASK (7L<<1) ++ ++#define STMFBIO_OUTPUT_DVO_CLIP_VIDEORANGE (0) ++#define STMFBIO_OUTPUT_DVO_CLIP_FULLRANGE (1L<<8) ++#define STMFBIO_OUTPUT_DVO_CHROMA_FILTER_DISABLED (0) ++#define STMFBIO_OUTPUT_DVO_CHROMA_FILTER_ENABLED (1L<<9) ++ ++#define STMFBIO_OUTPUT_HDMI_ENABLED (0) ++#define STMFBIO_OUTPUT_HDMI_DISABLED (1L<<0) ++#define STMFBIO_OUTPUT_HDMI_RGB (0) ++#define STMFBIO_OUTPUT_HDMI_YUV (1L<<1) ++#define STMFBIO_OUTPUT_HDMI_444 (0) ++#define STMFBIO_OUTPUT_HDMI_422 (1L<<2) ++#define STMFBIO_OUTPUT_HDMI_COLOURDEPTH_SHIFT (3) ++#define STMFBIO_OUTPUT_HDMI_COLOURDEPTH_24BIT (0) ++#define STMFBIO_OUTPUT_HDMI_COLOURDEPTH_30BIT (1L< and should not be changed. ++ */ ++ ++/* ++ * The picture aspect ratio indicates the intended aspect ratio ++ * of the full content of a 720x480 or 720x576 picture being ++ * displayed on an SD/ED display, i.e. it is indicating the pixel aspect ratio ++ * of the image. It does not necessarily indicate (but in all probability is the ++ * same as) the aspect ratio of the display. ++ * ++ * HD pictures always have a pixel aspect ratio of 1:1, hence the picture ++ * aspect ratio should always match the display size ratio i.e. 16:9. ++ */ ++#define STMFBIO_PIC_PICTURE_ASPECT_UNKNOWN (0) ++#define STMFBIO_PIC_PICTURE_ASPECT_4_3 (1) ++#define STMFBIO_PIC_PICTURE_ASPECT_16_9 (2) ++ ++/* ++ * The video aspect indicates the actual aspect ratio of video contained in ++ * the picture on the display. ++ */ ++#define STMFBIO_PIC_VIDEO_ASPECT_UNKNOWN (0) ++#define STMFBIO_PIC_VIDEO_ASPECT_4_3 (1) ++#define STMFBIO_PIC_VIDEO_ASPECT_16_9 (2) ++#define STMFBIO_PIC_VIDEO_ASPECT_14_9 (3) ++#define STMFBIO_PIC_VIDEO_ASPECT_GT_16_9 (4) ++ ++/* ++ * When the picture aspect ratio and video aspect ratio do not match then ++ * the letterbox style indicates how the video is positioned inside the picture. ++ * See CEA-861 Annex H, or standards for analogue video VBI signals ++ * for details. ++ */ ++#define STMFBIO_PIC_LETTERBOX_NONE (0) ++#define STMFBIO_PIC_LETTERBOX_CENTER (1) ++#define STMFBIO_PIC_LETTERBOX_TOP (2) ++#define STMFBIO_PIC_LETTERBOX_SAP_14_9 (3) ++#define STMFBIO_PIC_LETTERBOX_SAP_4_3 (4) ++ ++#define STMFBIO_PIC_RESCALE_NONE (0) ++#define STMFBIO_PIC_RESCALE_HORIZONTAL (1) ++#define STMFBIO_PIC_RESCALE_VERTICAL (2) ++#define STMFBIO_PIC_RESCALE_BOTH (3) ++ ++#define STMFBIO_PIC_BAR_DISABLE (0) ++#define STMFBIO_PIC_BAR_ENABLE (1) ++ ++#define STMFBIO_PICTURE_FLAGS_PICUTRE_ASPECT (1L<<0) ++#define STMFBIO_PICTURE_FLAGS_VIDEO_ASPECT (1L<<1) ++#define STMFBIO_PICTURE_FLAGS_LETTERBOX (1L<<2) ++#define STMFBIO_PICTURE_FLAGS_RESCALE_INFO (1L<<3) ++#define STMFBIO_PICTURE_FLAGS_BAR_INFO (1L<<4) ++#define STMFBIO_PICTURE_FLAGS_BAR_INFO_ENABLE (1L<<5) ++ ++struct stmfbio_picture_configuration ++{ ++ /* Which fields in the structure should be changed */ ++ __u32 flags; ++ ++ /* ++ * {0,0} = immediate, otherwise this should be a time in the ++ * future based on clock_gettime(CLOCK_MONOTONIC,...), not gettimeofday() ++ */ ++ struct timeval timestamp; ++ ++ __u16 picture_aspect; ++ __u16 video_aspect; ++ __u16 letterbox_style; ++ ++ /* Indicate if the displayed image (usually video) has been rescaled */ ++ __u16 picture_rescale; ++ ++ /* ++ * Black bar information, in pixels/lines from the start of the active video ++ * area. The enable allows bar information to be switched on/off without ++ * changing the actual bar data. ++ */ ++ __u16 bar_enable; ++ __u16 top_bar_end; ++ __u16 bottom_bar_start; ++ __u16 left_bar_end; ++ __u16 right_bar_start; ++}; ++ ++ ++struct stmfbio_auxmem2 ++{ ++ __u32 index; ++ __u32 physical; ++ __u32 size; ++}; ++ ++ ++typedef enum stmfbio_3d_mode ++{ ++ /* No 3D i.e. 2D */ ++ STMFBIO_3D_NONE, ++ /* Sub-sampled 3D formats in a normal 2D frame */ ++ STMFBIO_3D_SBS_HALF, ++ STMFBIO_3D_TOP_BOTTOM, ++ /* Full frame 3D formats, double clocked */ ++ STMFBIO_3D_FRAME_PACKED, ++ STMFBIO_3D_FIELD_ALTERNATIVE, ++ /* TV panel specific 3D modes */ ++ STMFBIO_3D_FRAME_SEQUENTIAL, ++ STMFBIO_3D_LL_RR, ++ STMFBIO_LINE_ALTERNATIVE ++} stmfbio_3d_mode; ++ ++ ++enum stmfbio_3d_framebuffer_type ++{ ++ STMFBIO_3D_FB_MONO, /* Single 2D framebuffer (or packed 3D SbS Half/TopBottom) */ ++ STMFBIO_3D_FB_STEREO /* Stereo 3D framebuffer for framepacked/sequential style modes */ ++}; ++ ++ ++struct stmfbio_3d_configuration ++{ ++ enum stmfbio_output_id outputid; ++ enum _stmfbio_activate activate; ++ enum stmfbio_3d_mode mode; ++ enum stmfbio_3d_framebuffer_type framebuffer_type; ++ __s8 framebuffer_depth; ++}; ++ ++ ++/* ++ * non-standard ioctls to control the FB plane, although ++ * these can be used directly they are really provided for the DirectFB ++ * driver ++ */ ++#define STMFBIO_GET_OUTPUTSTANDARDS _IOWR('B', 0x10, struct stmfbio_outputstandards) ++#define STMFBIO_GET_OUTPUTINFO _IOWR('B', 0x11, struct stmfbio_outputinfo) ++#define STMFBIO_SET_OUTPUTINFO _IOWR('B', 0x12, struct stmfbio_outputinfo) ++#define STMFBIO_GET_PLANEMODE _IOWR('B', 0x11, struct stmfbio_planeinfo) ++#define STMFBIO_SET_PLANEMODE _IOW ('B', 0x12, struct stmfbio_planeinfo) ++#define STMFBIO_PAN_PLANE _IOW ('B', 0x10, struct stmfbio_planeinfo) ++ ++#define STMFBIO_GET_VAR_SCREENINFO_EX _IOR ('B', 0x12, struct stmfbio_var_screeninfo_ex) ++#define STMFBIO_SET_VAR_SCREENINFO_EX _IOWR('B', 0x13, struct stmfbio_var_screeninfo_ex) ++#define STMFBIO_GET_OUTPUT_CONFIG _IOR ('B', 0x14, struct stmfbio_output_configuration) ++#define STMFBIO_SET_OUTPUT_CONFIG _IOWR('B', 0x15, struct stmfbio_output_configuration) ++#define STMFBIO_GET_3D_CONFIG _IOWR('B', 0x20, struct stmfbio_3d_configuration) ++#define STMFBIO_SET_3D_CONFIG _IOW ('B', 0x21, struct stmfbio_3d_configuration) ++ ++#define STMFBIO_SET_PICTURE_CONFIG _IOWR('B', 0x16, struct stmfbio_picture_configuration) ++#define STMFBIO_GET_AUXMEMORY2 _IOWR('B', 0x17, struct stmfbio_auxmem2) ++ ++#define STMFBIO_SET_DAC_HD_POWER _IO ('B', 0xd) ++#define STMFBIO_SET_CGMS_ANALOG _IO ('B', 0xe) ++#define STMFBIO_SET_DAC_HD_FILTER _IO ('B', 0xf) ++#define STMFBIO_SET_VPS_ANALOG _IOW ('B', 0x1f, struct stmfbio_vps) ++ ++/* ++ * Implement the matrox FB extension for VSync synchronisation, again for ++ * DirectFB. ++ */ ++#ifndef FBIO_WAITFORVSYNC ++#define FBIO_WAITFORVSYNC _IOW('F', 0x20, u_int32_t) ++#endif ++ ++/* ++ * Implement panel configuration ++ */ ++ ++#define PANEL_IO ++ ++#ifdef PANEL_IO ++#define STMFBIO_SET_PANEL_CONFIG _IOWR('B', 0x18, struct stmfbio_panel_config) ++ ++typedef enum ++{ ++ STMFB_PANEL_DITHER_METHOD_NONE, ++ STMFB_PANEL_DITHER_METHOD_TRUNC, ++ STMFB_PANEL_DITHER_METHOD_ROUND, ++ STMFB_PANEL_DITHER_METHOD_RANDOM, ++ STMFB_PANEL_DITHER_METHOD_SPATIAL, ++}stmfbio_display_panel_dither_mode; ++ ++typedef enum ++{ ++ STMFB_PANEL_FREERUN, ++ STMFB_PANEL_FIXED_FRAME_LOCK, ++ STMFB_PANEL_DYNAMIC_FRAME_LOCK, ++ STMFB_PANEL_LOCK_LOAD, ++}stmfbio_display_panel_lock_method; ++ ++typedef enum stmfbio_display_panel_lvds_bus_width_select_e ++{ ++ STMFBIO_PANEL_LVDS_SINGLE, ++ STMFBIO_PANEL_LVDS_DUAL, ++ STMFBIO_PANEL_LVDS_QUAD, ++} stmfbio_display_panel_lvds_bus_width_select_t; ++ ++ ++typedef enum stmfbio_display_panel_lvds_bus_swap_e ++{ ++ STMFBIO_PANEL_LVDS_SWAP_AB = 1, ++ STMFBIO_PANEL_LVDS_SWAP_CD = 2, ++ STMFBIO_PANEL_LVDS_SWAP_AB_CD = 3 ++} stmfbio_display_panel_lvds_bus_swap_t; ++ ++ ++typedef enum stmfbio_display_panel_lvds_pair_swap_e ++{ ++ STMFBIO_PANEL_LVDS_SWAP_PAIR0_PN = (1L<<0), ++ STMFBIO_PANEL_LVDS_SWAP_PAIR1_PN = (1L<<1), ++ STMFBIO_PANEL_LVDS_SWAP_PAIR2_PN = (1L<<2), ++ STMFBIO_PANEL_LVDS_SWAP_PAIR3_PN = (1L<<3), ++ STMFBIO_PANEL_LVDS_SWAP_PAIR4_PN = (1L<<4), ++ STMFBIO_PANEL_LVDS_SWAP_PAIR5_PN = (1L<<5), ++ STMFBIO_PANEL_LVDS_SWAP_CLOCK_PN = (1L<<6), ++} stmfbio_display_panel_lvds_pair_swap_t; ++ ++ ++typedef struct stmfbio_display_panel_lvds_ch_swap_config_s ++{ ++ stmfbio_display_panel_lvds_bus_swap_t swap_options; ++ stmfbio_display_panel_lvds_pair_swap_t pair_swap_ch_a; ++ stmfbio_display_panel_lvds_pair_swap_t pair_swap_ch_b; ++ stmfbio_display_panel_lvds_pair_swap_t pair_swap_ch_c; ++ stmfbio_display_panel_lvds_pair_swap_t pair_swap_ch_d; ++}stmfbio_display_panel_lvds_ch_swap_config_t; ++ ++ ++typedef struct stmfbio_display_panel_lvds_signal_pol_config_s ++{ ++ __u8 hs_pol; /*!< hsync polarity */ ++ __u8 vs_pol; /*!< vsync polarity */ ++ __u8 de_pol; /*!< data enable polarity */ ++ __u8 odd_pol; /*!< odd not even field polarity */ ++} stmfbio_display_panel_lvds_signal_pol_config_t; ++ ++ ++typedef enum stmfbio_display_panel_lvds_map_e ++{ ++ STMFBIO_PANEL_LVDS_MAP_STANDARD1, ++ STMFBIO_PANEL_LVDS_MAP_STANDARD2, ++ STMFBIO_PANEL_LVDS_MAP_CUSTOM ++} stmfbio_display_panel_lvds_map_t; ++ ++ ++typedef enum stmfbio_display_lvds_common_mode_voltage_e ++{ ++ STMFBIO_PANEL_LVDS_1_25V, /*!< 1.25v */ ++ STMFBIO_PANEL_LVDS_1_10V, /*!< 1.10v */ ++ STMFBIO_PANEL_LVDS_1_35V /*!< 1.35v */ ++}stmfbio_display_lvds_common_mode_voltage_t; ++ ++ ++typedef enum stmfbio_display_lvds_bias_current_e ++{ ++ STMFBIO_PANEL_LVDS_0_5_MA, /*!< 0.5 mA */ ++ STMFBIO_PANEL_LVDS_1_0_MA, /*!< 1.0 mA */ ++ STMFBIO_PANEL_LVDS_1_5_MA, /*!< 1.5 mA */ ++ STMFBIO_PANEL_LVDS_2_0_MA, /*!< 2.0 mA */ ++ STMFBIO_PANEL_LVDS_2_5_MA, /*!< 2.5 mA */ ++ STMFBIO_PANEL_LVDS_3_0_MA, /*!< 3.0 mA */ ++ STMFBIO_PANEL_LVDS_3_5_MA, /*!< 3.5 mA */ ++ STMFBIO_PANEL_LVDS_4_0_MA /*!< 4.0 mA */ ++}stmfbio_display_lvds_bias_current_t; ++ ++ ++typedef struct stmfbio_display_panel_lvds_bias_control_s ++{ ++ stmfbio_display_lvds_common_mode_voltage_t common_mode_voltage; ++ stmfbio_display_lvds_bias_current_t bias_current; ++} stmfbio_display_panel_lvds_bias_control_t; ++ ++ ++typedef struct stmfbio_display_panel_lvds_config_s ++{ ++ stmfbio_display_panel_lvds_bus_width_select_t lvds_bus_width_sel; ++ stmfbio_display_panel_lvds_ch_swap_config_t swap_options; ++ stmfbio_display_panel_lvds_signal_pol_config_t signal_polarity; ++ stmfbio_display_panel_lvds_map_t lvds_signal_map; ++ __u32 custom_lvds_map[8]; ++ __u16 clock_data_adj; ++ stmfbio_display_panel_lvds_bias_control_t bias_control_value; ++} stmfbio_display_panel_lvds_config_t; ++ ++struct stmfbio_panel_config ++{ ++ __u32 lookup_table1_p; ++ __u32 lookup_table2_p; ++ __u32 linear_color_remap_table_p; ++ __u32 vertical_refresh_rate; /*!< Vertical refresh rate in mHz */ ++ __u32 active_area_width; /*!< */ ++ __u32 active_area_height; /*!< */ ++ __u32 active_area_start_pixel; /*!< Pixels are counted from 0 */ ++ __u32 active_area_start_line; /*!< Lines are counted from 1, starting ++ with the first vsync blanking line */ ++ __u32 pixels_per_line; /*!< Total number of pixels per line ++ including the blanking area */ ++ __u32 lines_per_frame; /*!< Total number of lines per progressive ++ frame or pair of interlaced fields ++ including the blanking area */ ++ __u32 pixel_clock_freq; /*!< In Hz, e.g. 27000000 (27MHz) */ ++ __u32 hsync_width; /*!< */ ++ __u32 vsync_width; /*!< */ ++ stmfbio_display_panel_dither_mode dither; ++ stmfbio_display_panel_lock_method lock_method; ++ __u16 pwr_to_de_delay_during_power_on; ++ __u16 de_to_bklt_on_delay_during_power_on; ++ __u16 bklt_to_de_off_delay_during_power_off; ++ __u16 de_to_pwr_delay_during_power_off; ++ __u8 enable_lut1; ++ __u8 enable_lut2; ++ __u8 afr_enable; ++ __u8 is_half_display_clock; ++ __u8 hsync_polarity; /*!< 0: Negative 1: Positive */ ++ __u8 vsync_polarity; /*!< 0: Negative 1: Positive */ ++// stmfbio_display_panel_lvds_config_t lvds_config; ++}; ++#endif ++ ++#endif /* _STMFB_H */ +diff --git a/systems/stmfbdev/stmfb_aux_surface_pool.c b/systems/stmfbdev/stmfb_aux_surface_pool.c +new file mode 100644 +index 0000000..9ec6e5d +--- /dev/null ++++ b/systems/stmfbdev/stmfb_aux_surface_pool.c +@@ -0,0 +1,675 @@ ++/* ++ ST Microelectronics system driver - surface pool memory (auxmem) ++ ++ (c) Copyright 2009-2012 STMicroelectronics Ltd. ++ ++ Written by André Draszik ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++ ++#include "stmfbdev.h" ++#include "surfacemanager.h" ++ ++#include ++#include "stmfb_aux_surface_pool.h" ++ ++#include ++#include ++ ++D_DEBUG_DOMAIN (STMfbdev_Surfaces_Aux, "STMfbdev/Surfaces/Aux", "STMfb Aux Surface Pool"); ++D_DEBUG_DOMAIN (STMfbdev_SurfLock_Aux, "STMfbdev/SurfLock/Aux", "STMfb Aux Surface Pool Locks"); ++ ++/****************************************************************************/ ++ ++typedef struct ++{ ++ int magic; ++ ++ SurfaceManager *manager; ++ ++ unsigned long part_base; ++ unsigned int aux_part; ++} STMFB_AuxSurfacePoolData; ++ ++typedef struct ++{ ++ int magic; ++ ++ CoreDFB *core; ++ void *mem; ++} STMFB_AuxSurfacePoolLocalData; ++ ++typedef struct ++{ ++ int magic; ++ ++ Chunk *chunk; ++} STMFB_AuxSurfacePoolAllocationData; ++ ++/****************************************************************************/ ++ ++static int ++stmfb_aux_PoolDataSize (void) ++{ ++ return sizeof (STMFB_AuxSurfacePoolData); ++} ++ ++static int ++stmfb_aux_PoolLocalDataSize (void) ++{ ++ return sizeof (STMFB_AuxSurfacePoolLocalData); ++} ++ ++static int ++stmfb_aux_AllocationDataSize (void) ++{ ++ return sizeof (STMFB_AuxSurfacePoolAllocationData); ++} ++ ++static DFBResult ++stmfb_aux_LeavePool (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local) ++{ ++ STMFB_AuxSurfacePoolData * const data = pool_data; ++ STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, "%s (%d)\n", __func__, data->aux_part); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_MAGIC_ASSERT (local, STMFB_AuxSurfacePoolLocalData); ++ ++ D_UNUSED_P (data); ++ ++ if (local->mem && local->mem != MAP_FAILED) ++ { ++ munmap (local->mem, pool->desc.size); ++ local->mem = NULL; ++ } ++ ++ D_MAGIC_CLEAR (local); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfb_aux_JoinPool (CoreDFB *core, ++ CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ void *system_data) ++{ ++ STMFB_AuxSurfacePoolData * const data = pool_data; ++ STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ STMfbdev * const stmfbdev = dfb_system_data (); ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, "%s (%d)\n", __func__, data->aux_part); ++ ++ D_ASSERT (core != NULL); ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_ASSERT (local != NULL); ++ ++ D_MAGIC_SET (local, STMFB_AuxSurfacePoolLocalData); ++ ++ local->mem = mmap (NULL, pool->desc.size, PROT_READ | PROT_WRITE, ++ MAP_SHARED, stmfbdev->fd, data->part_base); ++ if (local->mem == MAP_FAILED) ++ { ++ D_PERROR ("STMfbdev/Surfaces/Aux: Could not mmap gfx part %d!\n", ++ data->aux_part); ++ return DFB_INIT; ++ } ++ ++ local->core = core; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfb_aux_DestroyPool (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local) ++{ ++ STMFB_AuxSurfacePoolData * const data = pool_data; ++ STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, "%s (%d)\n", __func__, data->aux_part); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_MAGIC_ASSERT (local, STMFB_AuxSurfacePoolLocalData); ++ ++ D_UNUSED_P (local); ++ ++ stmfb_aux_LeavePool (pool, pool_data, pool_local); ++ ++ dfb_surfacemanager_destroy (data->manager); ++ ++ D_MAGIC_CLEAR (data); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfb_aux_InitPool (CoreDFB *core, ++ CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ void *system_data, ++ CoreSurfacePoolDescription *ret_desc) ++{ ++ DFBResult ret; ++ STMFB_AuxSurfacePoolData * const data = pool_data; ++ STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ const STMfbdev * const stmfbdev = dfb_system_data (); ++ struct stmfbio_auxmem2 auxmem; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, "%s (%d)\n", __func__, ++ stmfbdev->shared->aux_pool_index); ++ ++ D_ASSERT (core != NULL); ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_ASSERT (data != NULL); ++ D_ASSERT (local != NULL); ++ D_ASSERT (ret_desc != NULL); ++ ++ D_UNUSED_P (local); ++ ++ D_MAGIC_SET (data, STMFB_AuxSurfacePoolData); ++ ++ auxmem.index = stmfbdev->shared->aux_pool_index; ++ ++ snprintf (ret_desc->name, DFB_SURFACE_POOL_DESC_NAME_LENGTH, ++ "STMFB AuxMemory %d", auxmem.index); ++ ++ /* query auxmem */ ++ if (ioctl (stmfbdev->fd, STMFBIO_GET_AUXMEMORY2, &auxmem) != 0) ++ return DFB_IO; ++ ++ if (!auxmem.size) ++ return DFB_ITEMNOTFOUND; ++ ++ D_INFO ("STMfbdev/Surfaces/Aux: found auxmem @ %.8x (%ukB)!\n", ++ auxmem.physical, auxmem.size / 1024); ++ /* auxmem partitions will never cross a 64MB boundary, stmfb should make ++ sure that's the case. And it does in fact :-), which is why we don't need ++ to check for configuration errors. */ ++ ++ ret = dfb_surfacemanager_create (core, auxmem.size, &data->manager); ++ if (ret) ++ return ret; ++ ++ data->aux_part = auxmem.index; ++ data->part_base = auxmem.physical; ++ ++ ret_desc->caps = CSPCAPS_PHYSICAL | CSPCAPS_VIRTUAL; ++ ret_desc->access[CSAID_CPU] = CSAF_READ | CSAF_WRITE | CSAF_SHARED; ++ ret_desc->access[CSAID_GPU] = CSAF_READ | CSAF_WRITE | CSAF_SHARED; ++ ret_desc->types = (0 ++ | CSTF_WINDOW | CSTF_CURSOR | CSTF_FONT ++ | CSTF_SHARED | CSTF_EXTERNAL ++ | CSTF_BUFFEROBJECT ++ ); ++ ret_desc->priority = CSPP_PREFERED; ++ ret_desc->size = auxmem.size; ++ ++ /* other accelerators */ ++ ret_desc->access[CSAID_ACCEL0] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL1] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL2] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL3] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL4] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL5] = CSAF_READ | CSAF_WRITE; ++ ++#if 0 ++ /* FIXME: this depends on the hardware, but we have no interface at the ++ moment anyway... */ ++ ret_desc->access[CSAID_LAYER0] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER1] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER2] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER3] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER4] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER5] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER6] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER7] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER8] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER9] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER10] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER11] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER12] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER13] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER14] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER15] = CSAF_READ; ++#endif ++ ++ ret = stmfb_aux_JoinPool (core, pool, pool_data, pool_local, system_data); ++ if (ret) ++ { ++ stmfb_aux_DestroyPool (pool, pool_data, pool_local); ++ return ret; ++ } ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfb_aux_TestConfig (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceBuffer *buffer, ++ const CoreSurfaceConfig *config) ++{ ++ CoreSurface *surface; ++ STMFB_AuxSurfacePoolData * const data = pool_data; ++ STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ DFBResult ret; ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_MAGIC_ASSERT (local, STMFB_AuxSurfacePoolLocalData); ++ D_MAGIC_ASSERT (buffer, CoreSurfaceBuffer); ++ D_ASSERT (config != NULL); ++ ++ surface = buffer->surface; ++ D_MAGIC_ASSERT (surface, CoreSurface); ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, ++ "%s (part/buffer/type/id: %u/%p/0x%x/%lu)\n", ++ __func__, data->aux_part, buffer, ++ surface->type, surface->resource_id); ++ ++ /* FIXME: this depends on the hardware, but we have no interface at the ++ moment anyway... */ ++ if (surface->type & CSTF_LAYER) ++ return DFB_BUG; ++ ++ ret = dfb_surfacemanager_allocate (local->core, data->manager, ++ buffer, NULL, NULL, false); ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, " -> %s\n", DirectFBErrorString (ret)); ++ ++ return ret; ++} ++ ++static DFBResult ++stmfb_aux_AllocateBuffer (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceBuffer *buffer, ++ CoreSurfaceAllocation *allocation, ++ void *alloc_data) ++{ ++ CoreSurface *surface; ++ STMFB_AuxSurfacePoolData * const data = pool_data; ++ STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ STMFB_AuxSurfacePoolAllocationData * const alloc = alloc_data; ++ DFBResult ret; ++ Chunk *chunk; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, "%s (%d, %p)\n", __func__, ++ data->aux_part, buffer); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_MAGIC_ASSERT (local, STMFB_AuxSurfacePoolLocalData); ++ D_MAGIC_ASSERT (buffer, CoreSurfaceBuffer); ++ D_MAGIC_ASSERT (allocation, CoreSurfaceAllocation); ++ ++ surface = buffer->surface; ++ D_MAGIC_ASSERT (surface, CoreSurface); ++ ++ /* FIXME: this depends on the hardware, but we have no interface at the ++ moment anyway... */ ++ if (surface->type & CSTF_LAYER) ++ return DFB_BUG; ++ ++ ret = dfb_surfacemanager_allocate (local->core, data->manager, buffer, ++ allocation, &chunk, false); ++ if (ret) ++ return ret; ++ ++ D_MAGIC_ASSERT (chunk, Chunk); ++ ++ alloc->chunk = chunk; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, ++ " -> offset 0x%.8x (%u), format: %s, pitch %d, size %d\n", ++ chunk->offset, chunk->offset, ++ dfb_pixelformat_name (buffer->format), chunk->pitch, ++ chunk->length); ++ ++ allocation->size = chunk->length; ++ allocation->offset = chunk->offset; ++ ++#if STGFX_DRIVER == 2 ++ if (unlikely (buffer->format == DSPF_RGB32)) ++ { ++ /* for RGB32, we need to set the alpha to 0xff */ ++ /* FIXME: check if we can hook into dfb_gfx_clear() or ++ dfb_surface_clear_buffers() */ ++ STGFX2DriverData * const stdrv = dfb_gfxcard_get_driver_data (); ++ STGFX2DeviceData * const stdev = dfb_gfxcard_get_device_data (); ++ DFBRectangle rect = { .x = 0, .y = 0, ++ .w = buffer->surface->config.size.w, ++ .h = buffer->surface->config.size.h }; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, " -> rgb32 allocation!\n"); ++ ++ D_WARN ("STMfbdev/Surfaces/Aux: RGB32 support is experimental and slow!"); ++ ++ dfb_gfxcard_lock (GDLF_WAIT); ++ ++ _bdisp_aq_RGB32_init (stdrv, stdev, ++ data->part_base + chunk->offset, chunk->pitch, ++ &rect); ++ dfb_gfxcard_unlock (); ++ } ++#endif ++ ++ D_MAGIC_SET (alloc, STMFB_AuxSurfacePoolAllocationData); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfb_aux_DeallocateBuffer (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceBuffer *buffer, ++ CoreSurfaceAllocation *allocation, ++ void *alloc_data) ++{ ++ STMFB_AuxSurfacePoolData * const data = pool_data; ++ const STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ STMFB_AuxSurfacePoolAllocationData * const alloc = alloc_data; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, "%s (%d, %p)\n", __func__, ++ data->aux_part, buffer); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_MAGIC_ASSERT (local, STMFB_AuxSurfacePoolLocalData); ++ D_MAGIC_ASSERT (allocation, CoreSurfaceAllocation); ++ D_MAGIC_ASSERT (alloc, STMFB_AuxSurfacePoolAllocationData); ++ ++ (void) local; ++ ++ D_ASSERT (alloc->chunk != NULL); ++ dfb_surfacemanager_deallocate (data->manager, alloc->chunk); ++ ++ D_MAGIC_CLEAR (alloc); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfb_aux_MuckOut (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceBuffer *buffer ) ++{ ++ STMFB_AuxSurfacePoolData * const data = pool_data; ++ const STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Aux, "%s (%p)\n", __func__, buffer); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_MAGIC_ASSERT (local, STMFB_AuxSurfacePoolLocalData); ++ D_MAGIC_ASSERT (buffer, CoreSurfaceBuffer); ++ ++ return dfb_surfacemanager_displace (local->core, data->manager, buffer); ++} ++ ++static DFBResult ++stmfb_aux_Lock (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceAllocation *allocation, ++ void *alloc_data, ++ CoreSurfaceBufferLock *lock) ++{ ++ const STMFB_AuxSurfacePoolData * const data = pool_data; ++ const STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ const STMFB_AuxSurfacePoolAllocationData * const alloc = alloc_data; ++ const Chunk *chunk; ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_MAGIC_ASSERT (local, STMFB_AuxSurfacePoolLocalData); ++ D_MAGIC_ASSERT (allocation, CoreSurfaceAllocation); ++ D_MAGIC_ASSERT (alloc, STMFB_AuxSurfacePoolAllocationData); ++ D_MAGIC_ASSERT (lock, CoreSurfaceBufferLock); ++ ++ D_DEBUG_AT (STMfbdev_SurfLock_Aux, "%s (%d, %p)\n", __func__, ++ data->aux_part, lock->buffer); ++ ++ D_MAGIC_ASSERT (alloc->chunk, Chunk); ++ chunk = alloc->chunk; ++ ++ lock->pitch = chunk->pitch; ++ lock->offset = chunk->offset; ++ lock->addr = local->mem + chunk->offset; ++ lock->phys = data->part_base + chunk->offset; ++ ++ D_DEBUG_AT (STMfbdev_SurfLock_Aux, ++ " -> offset 0x%.8lx (%lu), pitch %d, addr %p, phys 0x%.8lx\n", ++ lock->offset, lock->offset, lock->pitch, lock->addr, lock->phys); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfb_aux_Unlock (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceAllocation *allocation, ++ void *alloc_data, ++ CoreSurfaceBufferLock *lock) ++{ ++ const STMFB_AuxSurfacePoolData * const data = pool_data; ++ const STMFB_AuxSurfacePoolLocalData * const local = pool_local; ++ const STMFB_AuxSurfacePoolAllocationData * const alloc = alloc_data; ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMFB_AuxSurfacePoolData); ++ D_MAGIC_ASSERT (local, STMFB_AuxSurfacePoolLocalData); ++ D_MAGIC_ASSERT (allocation, CoreSurfaceAllocation); ++ D_MAGIC_ASSERT (alloc, STMFB_AuxSurfacePoolAllocationData); ++ D_MAGIC_ASSERT (lock, CoreSurfaceBufferLock); ++ ++ D_DEBUG_AT (STMfbdev_SurfLock_Aux, "%s (%d, %p)\n", __func__, ++ data->aux_part, lock->buffer); ++ ++ D_UNUSED_P (data); ++ D_UNUSED_P (local); ++ D_UNUSED_P (alloc); ++ ++#if STGFX_DRIVER == 2 ++ if (unlikely (lock->buffer->format == DSPF_RGB32 ++ && lock->accessor != CSAID_GPU ++ && lock->access & CSAF_WRITE)) ++ { ++ /* if a non-GPU accessor did a write access to an RGB32 surface, we ++ should make sure the alpha is forced to 0xff, as the BDisp doesn't ++ support this format natively */ ++ STGFX2DriverData * const stdrv = dfb_gfxcard_get_driver_data (); ++ STGFX2DeviceData * const stdev = dfb_gfxcard_get_device_data (); ++ DFBRectangle rect = { .x = 0, .y = 0, ++ .w = lock->buffer->surface->config.size.w, ++ .h = lock->buffer->surface->config.size.h }; ++ ++ D_DEBUG_AT (STMfbdev_SurfLock_Aux, " -> rgb32 write release!\n"); ++ dfb_gfxcard_lock (GDLF_WAIT); ++ _bdisp_aq_RGB32_fixup (stdrv, stdev, ++ lock->phys, lock->pitch, ++ &rect); ++ dfb_gfxcard_unlock (); ++ } ++#endif ++ ++ return DFB_OK; ++} ++ ++static const SurfacePoolFuncs stmfb_aux_SurfacePoolFuncs = { ++ .PoolDataSize = stmfb_aux_PoolDataSize, ++ .PoolLocalDataSize = stmfb_aux_PoolLocalDataSize, ++ .AllocationDataSize = stmfb_aux_AllocationDataSize, ++ ++ .InitPool = stmfb_aux_InitPool, ++ .JoinPool = stmfb_aux_JoinPool, ++ .DestroyPool = stmfb_aux_DestroyPool, ++ .LeavePool = stmfb_aux_LeavePool, ++ ++ .TestConfig = stmfb_aux_TestConfig, ++ .AllocateBuffer = stmfb_aux_AllocateBuffer, ++ .DeallocateBuffer = stmfb_aux_DeallocateBuffer, ++ ++ .MuckOut = stmfb_aux_MuckOut, ++ ++ .Lock = stmfb_aux_Lock, ++ .Unlock = stmfb_aux_Unlock, ++}; ++ ++void ++stmfb_aux_surface_pools_init (CoreDFB * const core) ++{ ++ unsigned long total_auxmem = 0; ++ STMfbdev * const stmfbdev = dfb_system_data (); ++ struct stmfbio_auxmem2 auxmem; ++ int i; ++ ++ D_ASSERT (dfb_core_is_master (core)); ++ ++ D_ASSUME (D_ARRAY_SIZE (stmfbdev->shared->aux_pools) == ++ (STMFBGP_GFX_LAST - STMFBGP_GFX_FIRST + 1)); ++ ++ for (i = -1, auxmem.index = 0; ++ auxmem.index < D_ARRAY_SIZE (stmfbdev->shared->aux_pools); ++ ++auxmem.index) ++ { ++ CoreSurfacePool *pool; ++ ++ if (ioctl (stmfbdev->fd, STMFBIO_GET_AUXMEMORY2, &auxmem) != 0) ++ break; ++ ++ if (!auxmem.size) ++ continue; ++ ++ stmfbdev->shared->aux_pool_index = auxmem.index; ++ ++ if (dfb_surface_pool_initialize (core, ++ &stmfb_aux_SurfacePoolFuncs, &pool)) ++ continue; ++ ++ stmfbdev->shared->aux_pools[++i] = pool; ++ total_auxmem += pool->desc.size; ++ } ++ ++ stmfbdev->shared->aux_pool_index = -1; ++ ++ if (total_auxmem) ++ D_INFO ("STMfbdev/Surfaces/Aux: %lukB of auxmem!\n", total_auxmem / 1024); ++ else ++ D_INFO ("STMfbdev/Surfaces/Aux: no auxmem available!\n"); ++} ++ ++void ++stmfb_aux_surface_pools_destroy (CoreDFB * const core) ++{ ++ STMfbdev * const stmfbdev = dfb_system_data (); ++ int i; ++ ++ D_ASSERT (dfb_core_is_master (core)); ++ ++ for (i = 0; i < D_ARRAY_SIZE (stmfbdev->shared->aux_pools); ++i) ++ { ++ CoreSurfacePool * const pool = stmfbdev->shared->aux_pools[i]; ++ if (!pool) ++ continue; ++ ++ if (dfb_surface_pool_destroy (pool)) ++ continue; ++ ++ stmfbdev->shared->aux_pools[i] = NULL; ++ } ++} ++ ++void ++stmfb_aux_surface_pools_join (CoreDFB * const core) ++{ ++ STMfbdev * const stmfbdev = dfb_system_data (); ++ unsigned long total_auxmem = 0; ++ int i; ++ ++ D_ASSERT (!dfb_core_is_master (core)); ++ ++ for (i = 0; i < D_ARRAY_SIZE (stmfbdev->shared->aux_pools); ++i) ++ { ++ CoreSurfacePool * const pool = stmfbdev->shared->aux_pools[i]; ++ if (!pool) ++ continue; ++ ++ if (dfb_surface_pool_join (core, pool, &stmfb_aux_SurfacePoolFuncs)) ++ continue; ++ ++ total_auxmem += pool->desc.size; ++ } ++ ++ if (total_auxmem) ++ D_INFO ("STMfbdev/Surfaces/Aux: %lukB of auxmem!\n", total_auxmem / 1024); ++ else ++ D_INFO ("STMfbdev/Surfaces/Aux: no auxmem available!\n"); ++} ++ ++void ++stmfb_aux_surface_pools_leave (CoreDFB * const core) ++{ ++ STMfbdev * const stmfbdev = dfb_system_data (); ++ int i; ++ ++ D_ASSERT (!dfb_core_is_master (core)); ++ ++ for (i = 0; i < D_ARRAY_SIZE (stmfbdev->shared->aux_pools); ++i) ++ { ++ CoreSurfacePool * const pool = stmfbdev->shared->aux_pools[i]; ++ if (!pool) ++ continue; ++ ++ dfb_surface_pool_leave (pool); ++ } ++} +diff --git a/systems/stmfbdev/stmfb_aux_surface_pool.h b/systems/stmfbdev/stmfb_aux_surface_pool.h +new file mode 100644 +index 0000000..a253646 +--- /dev/null ++++ b/systems/stmfbdev/stmfb_aux_surface_pool.h +@@ -0,0 +1,42 @@ ++/* ++ ST Microelectronics BDispII driver - surface pool memory (auxmem) ++ ++ (c) Copyright 2009 STMicroelectronics Ltd. ++ ++ Written by André Draszik ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#ifndef __STMFB_AUX_SURFACE_POOL_H__ ++#define __STMFB_AUX_SURFACE_POOL_H__ ++ ++#include ++ ++extern void ++stmfb_aux_surface_pools_init (CoreDFB * const core); ++ ++extern void ++stmfb_aux_surface_pools_destroy (CoreDFB * const core); ++ ++extern void ++stmfb_aux_surface_pools_join (CoreDFB * const core); ++ ++extern void ++stmfb_aux_surface_pools_leave (CoreDFB * const core); ++ ++ ++#endif /* __STMFB_AUX_SURFACE_POOL_H__ */ +diff --git a/systems/stmfbdev/stmfbdev.c b/systems/stmfbdev/stmfbdev.c +new file mode 100644 +index 0000000..fc8f848 +--- /dev/null ++++ b/systems/stmfbdev/stmfbdev.c +@@ -0,0 +1,591 @@ ++/* ++ (c) Copyright 2010 STMicroelectronics (R&D) Ltd. ++ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by André Draszik . ++ ++ Based on work by Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "stmfbdev.h" ++#include "fb.h" ++ ++#include ++ ++#include "stmfb_aux_surface_pool.h" ++ ++DFB_CORE_SYSTEM( stmfbdev ) ++ ++D_DEBUG_DOMAIN( STMfbdev_System, "STMfbdev/System", "STMfb System Module" ); ++ ++/******************************************************************************/ ++ ++extern const SurfacePoolFuncs _g_stmfbdevSurfacePoolFuncs; ++extern ScreenFuncs _g_stmfbdevScreenFuncs; ++extern DisplayLayerFuncs _g_stmfbdevLayerFuncs; ++ ++/******************************************************************************/ ++ ++STMfbdev *dfb_stmfbdev; ++ ++/******************************************************************************/ ++ ++static DFBResult ++dfb_stmfbdev_open( STMfbdev * const stmfbdev ) ++{ ++ mode_t mode = O_RDWR; ++#ifdef O_CLOEXEC ++ /* should be closed automatically in children upon exec(...), but is ++ only available since Linux 2.6.23 */ ++ mode |= O_CLOEXEC; ++#endif ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_ASSERT( stmfbdev->fd < 0 ); ++ ++ if (dfb_config->fb_device) { ++ stmfbdev->fd = open( dfb_config->fb_device, mode ); ++ if (stmfbdev->fd < 0) { ++ D_PERROR( "DirectFB/STMfbdev: Error opening '%s'!\n", ++ dfb_config->fb_device); ++ ++ return errno2result( errno ); ++ } ++ } ++ else if (getenv( "FRAMEBUFFER" ) && *getenv( "FRAMEBUFFER" ) != '\0') { ++ stmfbdev->fd = open( getenv ( "FRAMEBUFFER" ), mode ); ++ if (stmfbdev->fd < 0) { ++ D_PERROR( "DirectFB/STMfbdev: Error opening '%s'!\n", ++ getenv( "FRAMEBUFFER" ) ); ++ ++ return errno2result( errno ); ++ } ++ } ++ else { ++ stmfbdev->fd = direct_try_open( "/dev/fb0", "/dev/fb/0", mode, true ); ++ if (stmfbdev->fd < 0) { ++ D_ERROR( "DirectFB/STMfbdev: Error opening framebuffer device!\n" ); ++ D_ERROR( "DirectFB/STMfbdev: Use 'fbdev' option or set FRAMEBUFFER environment variable.\n" ); ++ return DFB_INIT; ++ } ++ } ++ ++#ifndef O_CLOEXEC ++ if (fcntl( stmfbdev->fd, F_SETFD, FD_CLOEXEC ) < 0) { ++ D_PERROR( "DirectFB/STMfbdev: Setting FD_CLOEXEC flag failed!\n" ); ++ return errno2result( errno ); ++ } ++#endif ++ ++ return DFB_OK; ++} ++ ++ ++ ++ ++static void ++system_get_info( CoreSystemInfo *info ) ++{ ++ info->version.major = 0; ++ info->version.minor = 9; ++ ++ info->type = CORE_STMFBDEV; ++ info->caps = CSCAPS_ACCELERATION; ++ ++ snprintf( info->name, sizeof (info->name), "STMfbdev" ); ++ snprintf( info->vendor, sizeof (info->vendor), "STMicroelectronics (R&D) Ltd." ); ++ snprintf( info->url, sizeof (info->url), "http://www.stlinux.com" ); ++ snprintf( info->license, sizeof (info->license), "LGPL" ); ++} ++ ++static DFBResult ++system_initialize( CoreDFB *core, void **data ) ++{ ++ DFBResult ret; ++ CoreScreen *screen; ++ long page_size; ++ STMfbdevSharedData *shared; ++ FusionSHMPoolShared *shmpool; ++ STMfbdev *stmfbdev; ++ ++ D_DEBUG_AT( STMfbdev_System, "%s()\n", __FUNCTION__ ); ++ ++ D_ASSERT( dfb_stmfbdev == NULL ); ++ ++ shmpool = dfb_core_shmpool( core ); ++ ++ *data = dfb_stmfbdev = stmfbdev = D_CALLOC( 1, sizeof(STMfbdev) ); ++ if (!stmfbdev) ++ return D_OOM(); ++ ++ D_MAGIC_SET( stmfbdev, STMfbdev ); ++ stmfbdev->fd = -1; ++ ++ shared = (STMfbdevSharedData *) SHCALLOC( shmpool, 1, ++ sizeof(STMfbdevSharedData) ); ++ if (!shared) { ++ ret = D_OOSHM(); ++ goto error; ++ } ++ ++ D_MAGIC_SET( shared, STMfbdevSharedData ); ++ ++ shared->shmpool = shmpool; ++ ++ core_arena_add_shared_field( core, "stmfbdev", shared ); ++ ++ stmfbdev->core = core; ++ stmfbdev->shared = shared; ++ ++ page_size = direct_pagesize(); ++ shared->page_mask = page_size < 0 ? 0 : (page_size - 1); ++ ++ ret = dfb_stmfbdev_open( stmfbdev ); ++ if (ret) ++ goto error; ++ ++ if (dfb_config->vt) { ++ ret = dfb_vt_initialize(); ++ if (ret) ++ goto error; ++ } ++ ++ /* Retrieve fixed information like video ram size */ ++ if (ioctl( stmfbdev->fd, FBIOGET_FSCREENINFO, &shared->fix ) < 0) { ++ D_PERROR( "DirectFB/STMfbdev: " ++ "Could not get fixed screen information!\n" ); ++ ret = errno2result( errno ); ++ goto error; ++ } ++ ++ D_INFO( "DirectFB/STMfbdev: Found '%s' (ID %d) with frame buffer at 0x%08lx, %dk (MMIO 0x%08lx, %dk)\n", ++ shared->fix.id, shared->fix.accel, ++ shared->fix.smem_start, shared->fix.smem_len >> 10, ++ shared->fix.mmio_start, shared->fix.mmio_len >> 10 ); ++ ++ /* Map the framebuffer */ ++ stmfbdev->framebuffer_base = mmap( NULL, shared->fix.smem_len, ++ PROT_READ | PROT_WRITE, MAP_SHARED, ++ stmfbdev->fd, 0 ); ++ if (stmfbdev->framebuffer_base == MAP_FAILED) { ++ D_PERROR( "DirectFB/STMfbdev: " ++ "Could not mmap the framebuffer!\n"); ++ stmfbdev->framebuffer_base = NULL; ++ ret = errno2result( errno ); ++ goto error; ++ } ++ ++ /* as we're running on ST hardware, we can assume pollvsync_after. We ++ set it here as well as in the gfxdriver, so that it does not matter ++ which system is used (fbdev vs. stmfbdev) or if a gfxdriver is used ++ at all (via disable-module=) */ ++ dfb_config->pollvsync_after = true; ++ ++ dfb_surface_pool_initialize( core, &_g_stmfbdevSurfacePoolFuncs, ++ &stmfbdev->shared->pool ); ++ stmfb_aux_surface_pools_init( core ); ++ ++ /* Register primary screen functions */ ++ screen = dfb_screens_register( NULL, stmfbdev, &_g_stmfbdevScreenFuncs ); ++ ++ /* Register primary layer functions */ ++ dfb_layers_register( screen, stmfbdev, &_g_stmfbdevLayerFuncs ); ++ ++ return DFB_OK; ++ ++ ++error: ++ if (shared) ++ SHFREE( shmpool, shared ); ++ ++ if (stmfbdev->framebuffer_base) ++ munmap( stmfbdev->framebuffer_base, shared->fix.smem_len ); ++ ++ if (stmfbdev->fd != -1) ++ close( stmfbdev->fd ); ++ ++ D_FREE( stmfbdev ); ++ *data = dfb_stmfbdev = NULL; ++ ++ return ret; ++} ++ ++static DFBResult ++system_join( CoreDFB *core, void **data ) ++{ ++ DFBResult ret; ++ CoreScreen *screen; ++ STMfbdev *stmfbdev; ++ void *shared; ++ ++ D_DEBUG_AT( STMfbdev_System, "%s()\n", __FUNCTION__ ); ++ ++ D_ASSERT( dfb_stmfbdev == NULL ); ++ ++ *data = dfb_stmfbdev = stmfbdev = D_CALLOC( 1, sizeof(STMfbdev) ); ++ if (!stmfbdev) ++ return D_OOM(); ++ ++ D_MAGIC_SET( stmfbdev, STMfbdev ); ++ stmfbdev->fd = -1; ++ ++ core_arena_get_shared_field( core, "stmfbdev", &shared ); ++ stmfbdev->shared = shared; ++ D_MAGIC_ASSERT( stmfbdev->shared, STMfbdevSharedData ); ++ ++ stmfbdev->core = core; ++ ++ /* Open framebuffer device */ ++ ret = dfb_stmfbdev_open( stmfbdev ); ++ if (ret) ++ goto error; ++ ++ if (dfb_config->vt) { ++ ret = dfb_vt_join(); ++ if (ret) ++ goto error; ++ } ++ ++ /* Map the framebuffer */ ++ stmfbdev->framebuffer_base = mmap( NULL, stmfbdev->shared->fix.smem_len, ++ PROT_READ | PROT_WRITE, MAP_SHARED, ++ stmfbdev->fd, 0 ); ++ if (stmfbdev->framebuffer_base == MAP_FAILED) { ++ D_PERROR( "DirectFB/STMfbdev: " ++ "Could not mmap the framebuffer!\n"); ++ stmfbdev->framebuffer_base = NULL; ++ ret = errno2result( errno ); ++ goto error; ++ } ++ ++ dfb_surface_pool_join( core, stmfbdev->shared->pool, ++ &_g_stmfbdevSurfacePoolFuncs ); ++ stmfb_aux_surface_pools_join( core ); ++ ++ /* Register primary screen functions */ ++ screen = dfb_screens_register( NULL, stmfbdev, &_g_stmfbdevScreenFuncs ); ++ ++ /* Register primary layer functions */ ++ dfb_layers_register( screen, stmfbdev, &_g_stmfbdevLayerFuncs ); ++ ++ return DFB_OK; ++ ++ ++error: ++ if (stmfbdev->fd != -1) ++ close( stmfbdev->fd ); ++ ++ D_FREE( stmfbdev ); ++ *data = dfb_stmfbdev = NULL; ++ ++ return ret; ++} ++ ++static DFBResult ++system_shutdown( bool emergency ) ++{ ++ DFBResult ret; ++ ++ D_DEBUG_AT( STMfbdev_System, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( dfb_stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( dfb_stmfbdev->shared, STMfbdevSharedData ); ++ D_MAGIC_ASSERT( dfb_stmfbdev->shared->pool, CoreSurfacePool ); ++ ++ stmfb_aux_surface_pools_destroy( dfb_stmfbdev->core ); ++ dfb_surface_pool_destroy( dfb_stmfbdev->shared->pool ); ++ ++ munmap( dfb_stmfbdev->framebuffer_base, ++ dfb_stmfbdev->shared->fix.smem_len ); ++ ++ if (dfb_config->vt) { ++ ret = dfb_vt_shutdown( emergency ); ++ if (ret) ++ return ret; ++ } ++ ++ close( dfb_stmfbdev->fd ); ++ ++ D_MAGIC_CLEAR( dfb_stmfbdev->shared ); ++ D_MAGIC_CLEAR( dfb_stmfbdev ); ++ ++ SHFREE( dfb_stmfbdev->shared->shmpool, dfb_stmfbdev->shared ); ++ D_FREE( dfb_stmfbdev ); ++ dfb_stmfbdev = NULL; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++system_leave( bool emergency ) ++{ ++ DFBResult ret; ++ ++ D_DEBUG_AT( STMfbdev_System, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( dfb_stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( dfb_stmfbdev->shared, STMfbdevSharedData ); ++ D_MAGIC_ASSERT( dfb_stmfbdev->shared->pool, CoreSurfacePool ); ++ ++ stmfb_aux_surface_pools_leave( dfb_stmfbdev->core ); ++ dfb_surface_pool_leave( dfb_stmfbdev->shared->pool ); ++ ++ munmap( dfb_stmfbdev->framebuffer_base, ++ dfb_stmfbdev->shared->fix.smem_len ); ++ ++ if (dfb_config->vt) { ++ ret = dfb_vt_leave( emergency ); ++ if (ret) ++ return ret; ++ } ++ ++ close( dfb_stmfbdev->fd ); ++ ++ D_MAGIC_CLEAR( dfb_stmfbdev ); ++ ++ D_FREE( dfb_stmfbdev ); ++ dfb_stmfbdev = NULL; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++system_suspend( void ) ++{ ++ return DFB_OK; ++} ++ ++static DFBResult ++system_resume( void ) ++{ ++ return DFB_OK; ++} ++ ++/******************************************************************************/ ++ ++static volatile void * ++system_map_mmio( unsigned int offset, ++ int length ) ++{ ++ void *addr; ++ ++ D_MAGIC_ASSERT( dfb_stmfbdev, STMfbdev ); ++ ++ if (length <= 0) ++ length = dfb_stmfbdev->shared->fix.mmio_len; ++ ++ addr = mmap( NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, ++ dfb_stmfbdev->fd, ++ dfb_stmfbdev->shared->fix.smem_len + offset ); ++ if (addr == MAP_FAILED) { ++ D_PERROR( "DirectFB/STMfbdev: Could not mmap MMIO region " ++ "(offset %d, length %d)!\n", offset, length ); ++ return NULL; ++ } ++ ++ return(volatile void*) ((u8*) addr + (dfb_stmfbdev->shared->fix.mmio_start ++ & dfb_stmfbdev->shared->page_mask)); ++} ++ ++static void ++system_unmap_mmio( volatile void *addr, ++ int length ) ++{ ++ D_MAGIC_ASSERT( dfb_stmfbdev, STMfbdev ); ++ ++ if (length <= 0) ++ length = dfb_stmfbdev->shared->fix.mmio_len; ++ ++ if (munmap( (void*) ((u8*) addr - (dfb_stmfbdev->shared->fix.mmio_start ++ & dfb_stmfbdev->shared->page_mask)), ++ length ) < 0) ++ D_PERROR( "DirectFB/STMfbdev: Could not unmap MMIO region " ++ "at %p (length %d)!\n", addr, length ); ++} ++ ++static int ++system_get_accelerator( void ) ++{ ++ D_MAGIC_ASSERT( dfb_stmfbdev, STMfbdev ); ++ ++ if (dfb_config->accelerator) ++ return dfb_config->accelerator; ++ ++ return dfb_stmfbdev->shared->fix.accel; ++} ++ ++static VideoMode * ++system_get_modes( void ) ++{ ++ return NULL; ++} ++ ++static VideoMode * ++system_get_current_mode( void ) ++{ ++ return NULL; ++} ++ ++static DFBResult ++system_thread_init( void ) ++{ ++ if (dfb_config->block_all_signals) ++ direct_signals_block_all(); ++ ++ return DFB_OK; ++} ++ ++static bool ++system_input_filter( CoreInputDevice *device, ++ DFBInputEvent *event ) ++{ ++ if (dfb_config->vt && dfb_config->vt_switching) { ++ switch (event->type) { ++ case DIET_KEYPRESS: ++ if (DFB_KEY_TYPE(event->key_symbol) == DIKT_FUNCTION && ++ event->modifiers == (DIMM_CONTROL | DIMM_ALT)) ++ return dfb_vt_switch( event->key_symbol - DIKS_F1 + 1 ); ++ ++ break; ++ ++ case DIET_KEYRELEASE: ++ if (DFB_KEY_TYPE(event->key_symbol) == DIKT_FUNCTION && ++ event->modifiers == (DIMM_CONTROL | DIMM_ALT)) ++ return true; ++ ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ return false; ++} ++ ++static unsigned long ++system_video_memory_physical( unsigned int offset ) ++{ ++ D_MAGIC_ASSERT( dfb_stmfbdev, STMfbdev ); ++ ++ return dfb_stmfbdev->shared->fix.smem_start + offset; ++} ++ ++static void * ++system_video_memory_virtual( unsigned int offset ) ++{ ++ D_MAGIC_ASSERT( dfb_stmfbdev, STMfbdev ); ++ ++ return(void*)((u8*)(dfb_stmfbdev->framebuffer_base) + offset); ++} ++ ++static unsigned int ++system_videoram_length( void ) ++{ ++ D_MAGIC_ASSERT( dfb_stmfbdev, STMfbdev ); ++ ++ return dfb_stmfbdev->shared->fix.smem_len; ++} ++ ++static unsigned long ++system_aux_memory_physical( unsigned int offset ) ++{ ++ return 0; ++} ++ ++static void * ++system_aux_memory_virtual( unsigned int offset ) ++{ ++ return NULL; ++} ++ ++static unsigned int ++system_auxram_length( void ) ++{ ++ return 0; ++} ++ ++static void ++system_get_busid( int *ret_bus, int *ret_dev, int *ret_func ) ++{ ++ return; ++} ++ ++static void ++system_get_deviceid( unsigned int *ret_vendor_id, ++ unsigned int *ret_device_id ) ++{ ++ *ret_vendor_id = 0x104a; /* STMicroelectronics */ ++ ++ return; ++} ++ ++static int ++system_surface_data_size( void ) ++{ ++ /* Return zero because shared surface data is unneeded. */ ++ return 0; ++} ++ ++static void ++system_surface_data_init( CoreSurface *surface, void *data ) ++{ ++ /* Ignore since unneeded. */ ++} ++ ++static void ++system_surface_data_destroy( CoreSurface *surface, void *data ) ++{ ++ /* Ignore since unneeded. */ ++} +diff --git a/systems/stmfbdev/stmfbdev.h b/systems/stmfbdev/stmfbdev.h +new file mode 100644 +index 0000000..762d12d +--- /dev/null ++++ b/systems/stmfbdev/stmfbdev.h +@@ -0,0 +1,77 @@ ++/* ++ (c) Copyright 2010 STMicroelectronics (R&D) Ltd. ++ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by André Draszik . ++ ++ Based on work by Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#ifndef __STMFBDEV__STMFBDEV_H__ ++#define __STMFBDEV__STMFBDEV_H__ ++ ++#include ++ ++#include ++ ++#include ++ ++#include "fb.h" ++#include "vt.h" ++ ++ ++typedef struct { ++ int magic; ++ ++ struct fb_fix_screeninfo fix; /* fbdev fixed screeninfo, contains info ++ about memory and type of card */ ++ ++ int num_screens; ++ int num_layers; ++ ++ unsigned long page_mask; ++ ++ CoreSurfacePool *pool; ++ ++ CoreSurfacePool *aux_pools[5]; /* STMFBGP_GFX_LAST - STMFBGP_GFX_FIRST + 1 */ ++ /* for exclusive use by stmfb_aux_surface_pool.c */ ++ unsigned int aux_pool_index; ++ ++ FusionSHMPoolShared *shmpool; ++} STMfbdevSharedData; ++ ++typedef struct { ++ int magic; ++ ++ CoreDFB *core; ++ ++ STMfbdevSharedData *shared; ++ int fd; ++ void *framebuffer_base; ++ VirtualTerminal *vt; ++} STMfbdev; ++ ++ ++#endif /* __STMFBDEV__STMFBDEV_H__ */ +diff --git a/systems/stmfbdev/stmfbdev_layer.c b/systems/stmfbdev/stmfbdev_layer.c +new file mode 100644 +index 0000000..1fece04 +--- /dev/null ++++ b/systems/stmfbdev/stmfbdev_layer.c +@@ -0,0 +1,988 @@ ++/* ++ (c) Copyright 2010 STMicroelectronics (R&D) Ltd. ++ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by André Draszik . ++ ++ Based on work by Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++#include "stmfbdev.h" ++ ++D_DEBUG_DOMAIN( STMfbdev_Layer, "STMfbdev/Layer", "STMfb System Module Layer Handling" ); ++ ++ ++typedef struct { ++ int magic; ++ ++ int layerid; ++ DFBDisplayLayerOptions supported_options; ++ DFBSurfaceCapabilities supported_surfacecaps; ++ ++ struct stmfbio_planeinfo cur_planeinfo; ++ ++ struct fb_cmap current_cmap; ++ ++ DFBColorAdjustmentFlags supported_adjustments; ++ ++ struct stmfbio_planeinfo orig_planeinfo; ++ struct stmfbio_var_screeninfo_ex orig_varex; ++ struct fb_cmap orig_cmap; ++ void *cmap_memory[2]; /* orig and current */ ++ FusionSHMPoolShared *shmpool_data; ++} STMfbdevLayerSharedData; ++ ++ ++ ++/* supported surface formats */ ++#define STM_supported_pixelformat \ ++ DSPF_ARGB1555: case DSPF_RGB16: case DSPF_RGB24: case DSPF_ARGB: \ ++ case DSPF_A8: case DSPF_UYVY: case DSPF_LUT8: \ ++ case DSPF_ALUT44: case DSPF_A1: case DSPF_ARGB4444: case DSPF_LUT2: \ ++ case DSPF_ARGB8565: case DSPF_AVYU: case DSPF_VYU ++ ++static const SURF_FMT dspf_to_stmfb[DFB_NUM_PIXELFORMATS] = { ++ [DFB_PIXELFORMAT_INDEX (DSPF_UNKNOWN)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ARGB1555)] = SURF_ARGB1555, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGB16)] = SURF_RGB565, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGB24)] = SURF_RGB888, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGB32)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ARGB)] = SURF_ARGB8888, ++ [DFB_PIXELFORMAT_INDEX (DSPF_A8)] = SURF_A8, ++ [DFB_PIXELFORMAT_INDEX (DSPF_YUY2)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGB332)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_UYVY)] = SURF_YCBCR422R, ++ [DFB_PIXELFORMAT_INDEX (DSPF_I420)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_YV12)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_LUT8)] = SURF_CLUT8, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ALUT44)] = SURF_ACLUT44, ++ [DFB_PIXELFORMAT_INDEX (DSPF_AiRGB)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_A1)] = SURF_A1, ++ [DFB_PIXELFORMAT_INDEX (DSPF_NV12)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_NV16)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ARGB2554)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ARGB4444)] = SURF_ARGB4444, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGBA4444)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_NV21)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_AYUV)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_A4)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ARGB1666)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ARGB6666)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGB18)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_LUT2)] = SURF_CLUT2, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGB444)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGB555)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_BGR555)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_RGBA5551)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_YUV444P)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ARGB8565)] = SURF_ARGB8565, ++ [DFB_PIXELFORMAT_INDEX (DSPF_AVYU)] = SURF_ACRYCB8888, ++ [DFB_PIXELFORMAT_INDEX (DSPF_VYU)] = SURF_CRYCB888, ++ [DFB_PIXELFORMAT_INDEX (DSPF_A1_LSB)] = SURF_NULL_PAD, ++ [DFB_PIXELFORMAT_INDEX (DSPF_YV16)] = SURF_NULL_PAD, ++#if 0 ++ /* unsupported in DirectFB */ ++ [DFB_PIXELFORMAT_INDEX (DSPF_BGRA)] = { SURF_BGRA8888, ++ [DFB_PIXELFORMAT_INDEX (DSPF_LUT1)] = { SURF_CLUT1, ++ [DFB_PIXELFORMAT_INDEX (DSPF_LUT4)] = { SURF_CLUT4, ++ [DFB_PIXELFORMAT_INDEX (DSPF_ALUT88)] = { SURF_ACLUT88, ++#endif ++}; ++ ++static DFBSurfacePixelFormat ++stmfb_to_dsbf( SURF_FMT fmt ) ++{ ++ switch (fmt) { ++ case SURF_ARGB1555: return DSPF_ARGB1555; ++ case SURF_RGB565: return DSPF_RGB16; ++ case SURF_RGB888: return DSPF_RGB24; ++ case SURF_ARGB8888: return DSPF_ARGB; ++ case SURF_A8: return DSPF_A8; ++ case SURF_YCBCR422R: return DSPF_UYVY; ++ case SURF_CLUT8: return DSPF_LUT8; ++ case SURF_ACLUT44: return DSPF_ALUT44; ++ case SURF_A1: return DSPF_A1; ++ case SURF_ARGB4444: return DSPF_ARGB4444; ++ case SURF_CLUT2: return DSPF_LUT2; ++ case SURF_ARGB8565: return DSPF_ARGB8565; ++ case SURF_ACRYCB8888: return DSPF_AVYU; ++ case SURF_CRYCB888: return DSPF_VYU; ++ default: ++ break; ++ } ++ return DSPF_UNKNOWN; ++}; ++ ++ ++/******************************************************************************/ ++ ++static int ++stmfbdevLayerDataSize( void ) ++{ ++ D_DEBUG_AT( STMfbdev_Layer, "%s() <- %u\n", ++ __FUNCTION__, sizeof(STMfbdevLayerSharedData) ); ++ ++ return sizeof(STMfbdevLayerSharedData); ++} ++ ++static int ++stmfbdevRegionDataSize( void ) ++{ ++ return 0; ++} ++ ++static DFBResult ++stmfbdevInitLayer( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ DFBDisplayLayerDescription *description, ++ DFBDisplayLayerConfig *config, ++ DFBColorAdjustment *adjustment ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevLayerSharedData * const shared = layer_data; ++ const struct stmfbio_plane_config *pc; ++ u32 hw_caps; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s( %p %d )\n", ++ __FUNCTION__, layer, stmfbdev->shared->num_layers + 1 ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( stmfbdev->shared, STMfbdevSharedData ); ++ ++ D_MAGIC_SET( shared, STMfbdevLayerSharedData ); ++ ++ shared->layerid = stmfbdev->shared->num_layers++; ++ ++ shared->shmpool_data = dfb_core_shmpool_data( stmfbdev->core ); ++ ++ /* remember startup config, so we can restore it on shutdown */ ++ shared->orig_planeinfo.layerid = shared->layerid; ++ if (ioctl( stmfbdev->fd, STMFBIO_GET_PLANEMODE, &shared->orig_planeinfo ) < 0) { ++ D_PERROR( "STMfbdev/Layer: Could not get planeinfo!\n" ); ++ return errno2result( errno ); ++ } ++ shared->orig_planeinfo.activate = STMFBIO_ACTIVATE_IMMEDIATE; ++ shared->cur_planeinfo = shared->orig_planeinfo; ++ pc = &shared->cur_planeinfo.config; ++ ++ D_DEBUG_AT( STMfbdev_Layer, ++ " -> current: %dx%d @ %d,%d-%dx%d (%d: %s) %ubpp pitch %u @ 0x%08lx\n", ++ pc->source.w, pc->source.h, pc->dest.x, pc->dest.y, ++ pc->dest.dim.w, pc->dest.dim.h, pc->format, ++ dfb_pixelformat_name( stmfb_to_dsbf( pc->format ) ), ++ pc->bitdepth, pc->pitch, pc->baseaddr ); ++ ++ /* same for stmfb's extended var */ ++ shared->orig_varex.layerid = shared->layerid; ++ if (ioctl( stmfbdev->fd, ++ STMFBIO_GET_VAR_SCREENINFO_EX, &shared->orig_varex ) < 0) { ++ D_PERROR( "STMfbdev/Layer: Could not get extended planeinfo!\n" ); ++ return errno2result( errno ); ++ } ++ shared->orig_varex.activate = STMFBIO_ACTIVATE_IMMEDIATE; ++ hw_caps = shared->orig_varex.caps; ++ D_DEBUG_AT( STMfbdev_Layer, " -> extended caps: 0x%08x\n", hw_caps ); ++ ++ /* allocate space for two colormaps - one to work with ... */ ++ shared->cmap_memory[0] = SHMALLOC( shared->shmpool_data, 256 * 2 * 4 ); ++ if (!shared->cmap_memory[0]) ++ return D_OOSHM(); ++ shared->current_cmap.start = 0; ++ shared->current_cmap.len = 256; ++ shared->current_cmap.red = shared->cmap_memory[0] + 256 * 2 * 0; ++ shared->current_cmap.green = shared->cmap_memory[0] + 256 * 2 * 1; ++ shared->current_cmap.blue = shared->cmap_memory[0] + 256 * 2 * 2; ++ shared->current_cmap.transp = shared->cmap_memory[0] + 256 * 2 * 3; ++ ++ /* ... and one to store the original colormap */ ++ shared->cmap_memory[1] = SHMALLOC( shared->shmpool_data, 256 * 2 * 4 ); ++ if (!shared->cmap_memory[1]) { ++ SHFREE( shared->shmpool_data, shared->cmap_memory[0] ); ++ shared->cmap_memory[0] = NULL; ++ shared->current_cmap.len = 0; ++ return D_OOSHM(); ++ } ++ shared->orig_cmap.start = 0; ++ shared->orig_cmap.len = 256; ++ shared->orig_cmap.red = shared->cmap_memory[1] + 256 * 2 * 0; ++ shared->orig_cmap.green = shared->cmap_memory[1] + 256 * 2 * 1; ++ shared->orig_cmap.blue = shared->cmap_memory[1] + 256 * 2 * 2; ++ shared->orig_cmap.transp = shared->cmap_memory[1] + 256 * 2 * 3; ++ ++ if (ioctl( stmfbdev->fd, FBIOGETCMAP, &shared->orig_cmap ) < 0) { ++ D_DEBUG( "STMfbdev/Layer: Could not retrieve palette for backup!\n" ); ++ ++ memset( &shared->orig_cmap, 0, sizeof(shared->orig_cmap) ); ++ ++ SHFREE( shared->shmpool_data, shared->cmap_memory[1] ); ++ shared->cmap_memory[1] = NULL; ++ } ++ ++ ++ /* set name */ ++ snprintf( description->name, sizeof (description->name), ++ "STM Layer %d", shared->cur_planeinfo.layerid ); ++ ++ /* set capabilities and type */ ++ description->caps = (DLCAPS_SURFACE ++ | DLCAPS_SCREEN_POSITION | DLCAPS_SCREEN_SIZE ++ | DLCAPS_SCREEN_LOCATION ++ | DLCAPS_ALPHACHANNEL ++ ); ++ description->type = DLTF_GRAPHICS; ++ description->regions = 1; ++ ++ /* fill out the default configuration */ ++ config->flags = (DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT ++ | DLCONF_BUFFERMODE ++ | DLCONF_OPTIONS ++ ); ++ config->buffermode = DLBM_FRONTONLY; ++ if (D_FLAGS_ARE_SET (dfb_config->layers[shared->layerid].config.flags, ++ (DLCONF_WIDTH | DLCONF_HEIGHT))) { ++ config->width = dfb_config->layers[shared->layerid].config.width; ++ config->height = dfb_config->layers[shared->layerid].config.height; ++ } ++ else if (dfb_config->mode.width && dfb_config->mode.height) { ++ config->width = dfb_config->mode.width; ++ config->height = dfb_config->mode.height; ++ } ++ else { ++ config->width = pc->source.w; ++ config->height = pc->source.h; ++ } ++ if (D_FLAGS_ARE_SET (dfb_config->layers[shared->layerid].config.flags, ++ DLCONF_PIXELFORMAT)) ++ config->pixelformat = dfb_config->layers[shared->layerid].config.pixelformat; ++ else if (dfb_config->mode.format) ++ config->pixelformat = dfb_config->mode.format; ++ else ++ config->pixelformat = stmfb_to_dsbf( pc->format ); ++ ++ config->options = DLOP_ALPHACHANNEL; ++ ++ adjustment->flags = DCAF_NONE; ++ ++ shared->supported_options = DLOP_ALPHACHANNEL; ++ shared->supported_adjustments = DCAF_NONE; ++ shared->supported_surfacecaps = DSCAPS_NONE; ++ ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_COLOURKEY )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> src colorkey\n" ); ++ description->caps |= DLCAPS_SRC_COLORKEY; ++ shared->supported_options |= DLOP_SRC_COLORKEY; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_FLICKER_FILTER )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> flicker filtering (state: %d)\n", ++ shared->orig_varex.ff_state ); ++ description->caps |= DLCAPS_FLICKER_FILTERING; ++ shared->supported_options |= DLOP_FLICKER_FILTERING; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_PREMULTIPLIED )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> pre-multiplied alpha (state: %d)\n", ++ shared->orig_varex.premultiplied_alpha ); ++ description->caps |= DLCAPS_PREMULTIPLIED; ++ shared->supported_surfacecaps |= DSCAPS_PREMULTIPLIED; ++ ++ /* we force this to on! */ ++ config->flags |= DLCONF_SURFACE_CAPS; ++ config->surface_caps = DSCAPS_PREMULTIPLIED; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_OPACITY )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> opacity (%d)\n", ++ shared->orig_varex.opacity ); ++ description->caps |= DLCAPS_OPACITY; ++ shared->supported_options |= DLOP_OPACITY; ++ ++ config->options |= DLOP_OPACITY; ++ /* Strangely we cannot specify the default layer opacity, lets hope ++ it's fully opaque! */ ++ } ++ if (D_FLAGS_IS_SET( hw_caps, (STMFBIO_VAR_CAPS_GAIN ++ | STMFBIO_VAR_CAPS_BRIGHTNESS ))) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> brightness/gain adjustment (%d %d)\n", ++ shared->orig_varex.brightness, shared->orig_varex.gain ); ++ description->caps |= DLCAPS_BRIGHTNESS; ++ shared->supported_adjustments |= DCAF_BRIGHTNESS; ++ ++ adjustment->flags |= DCAF_BRIGHTNESS; ++ adjustment->brightness = 0x8000; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_CONTRAST )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> contrast adjustment (%d)\n", ++ shared->orig_varex.contrast ); ++ description->caps |= DLCAPS_CONTRAST; ++ shared->supported_adjustments |= DCAF_CONTRAST; ++ ++ adjustment->flags |= DCAF_CONTRAST; ++ adjustment->contrast = 0x8000; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_TINT )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> tint adjustment (%d)\n", ++ shared->orig_varex.tint ); ++ description->caps |= DLCAPS_HUE; ++ shared->supported_adjustments |= DCAF_HUE; ++ ++ adjustment->flags |= DCAF_HUE; ++ adjustment->hue = 0x8000; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_SATURATION )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> saturation adjustment (%d)\n", ++ shared->orig_varex.saturation ); ++ description->caps |= DLCAPS_SATURATION; ++ shared->supported_adjustments |= DCAF_SATURATION; ++ ++ adjustment->flags |= DCAF_SATURATION; ++ adjustment->saturation = 0x8000; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_ALPHA_RAMP )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> RGB1555 alpha ramp\n" ); ++ description->caps |= DLCAPS_ALPHA_RAMP; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_ZPOSITION )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> plane re-ordering (%d)\n", ++ shared->orig_varex.z_position ); ++ description->caps |= DLCAPS_LEVELS; ++ description->level = shared->orig_varex.z_position; ++ } ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevShutdownLayer( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevLayerSharedData * const shared = layer_data; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ ++ if (shared->cmap_memory[1]) { ++ if (ioctl( stmfbdev->fd, FBIOPUTCMAP, &shared->orig_cmap ) < 0) ++ D_DEBUG( "STMfbdev/Layer: " ++ "Could not restore palette!\n" ); ++ ++ SHFREE( shared->shmpool_data, shared->cmap_memory[1] ); ++ } ++ ++ if (shared->cmap_memory[0]) ++ SHFREE( shared->shmpool_data, shared->cmap_memory[0] ); ++ ++ /* restore the original plane configuration */ ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_PLANEMODE, &shared->orig_planeinfo ) < 0) ++ D_PERROR( "STMfbdev/Layer: Could not restore planeinfo\n" ); ++ ++ /* restore the extended state */ ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_VAR_SCREENINFO_EX, &shared->orig_varex ) < 0) ++ D_PERROR( "STMfbdev/Layer: Could not restore extended state\n" ); ++ ++ D_MAGIC_CLEAR( shared ); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevTestRegion( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ CoreLayerRegionConfig *config, ++ CoreLayerRegionConfigFlags *failed ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevLayerSharedData * const shared = layer_data; ++ struct stmfbio_planeinfo plane; ++ CoreLayerRegionConfigFlags fail = CLRCF_NONE; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ D_ASSERT( config != NULL ); ++ ++ (void) stmfbdev; ++ ++ DFB_CORE_LAYER_REGION_CONFIG_DEBUG_AT( STMfbdev_Layer, config ); ++ ++ if (D_FLAGS_INVALID( config->options, shared->supported_options )) ++ fail |= CLRCF_OPTIONS; ++ ++ /* some defaults - the original base address should always be ok, as it ++ should be at the beginning of the framebuffer, thus any plane should ++ fit. */ ++ plane.layerid = shared->orig_planeinfo.layerid; ++ plane.config.baseaddr = shared->orig_planeinfo.config.baseaddr; ++ ++ /* we can't (and don't want to) test these individually, as the driver ++ does some comprehensive checking on the parameters, and they must ++ all be consistent, e.g. size/pitch/memory/scaling etc. */ ++ plane.activate = STMFBIO_ACTIVATE_TEST; ++ plane.config.source.w = config->width; ++ plane.config.source.h = config->height; ++ plane.config.dest.x = config->dest.x; ++ plane.config.dest.y = config->dest.y; ++ plane.config.dest.dim.w = config->dest.w; ++ plane.config.dest.dim.h = config->dest.h; ++ plane.config.format = dspf_to_stmfb[DFB_PIXELFORMAT_INDEX( config->format )]; ++ plane.config.pitch = DFB_BYTES_PER_LINE( config->format, config->width ); ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_PLANEMODE, &plane ) < 0) ++ fail |= CLRCF_FORMAT | CLRCF_WIDTH | CLRCF_HEIGHT | CLRCF_DEST; ++ ++ /* can there be more flags set? */ ++ if (D_FLAGS_IS_SET( config->surface_caps, DSCAPS_PREMULTIPLIED ) ++ && !D_FLAGS_IS_SET( shared->supported_surfacecaps, ++ DSCAPS_PREMULTIPLIED )) ++ fail |= CLRCF_SURFACE_CAPS; ++ ++ if (failed) ++ *failed = fail; ++ ++ if (fail) { ++ D_DEBUG_AT( STMfbdev_Layer, " => FAILED!\n" ); ++ return DFB_UNSUPPORTED; ++ } ++ ++ D_DEBUG_AT( STMfbdev_Layer, " => SUCCESS\n" ); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevAddRegion( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ void *region_data, ++ CoreLayerRegionConfig *config ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevLayerSharedData * const shared = layer_data; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ D_ASSERT( config != NULL ); ++ ++ (void) stmfbdev; ++ (void) shared; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevSetRegion( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ void *region_data, ++ CoreLayerRegionConfig *config, ++ CoreLayerRegionConfigFlags updated, ++ CoreSurface *surface, ++ CorePalette *palette, ++ CoreSurfaceBufferLock *left_lock, ++ CoreSurfaceBufferLock *right_lock ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevLayerSharedData * const shared = layer_data; ++ struct stmfbio_planeinfo plane; ++ struct stmfbio_var_screeninfo_ex var_ex; ++ u32 hw_caps; ++ bool need_update = false; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ D_ASSERT( config != NULL ); ++ ++ (void) stmfbdev; ++ ++ if (updated) ++ DFB_CORE_LAYER_REGION_CONFIG_DEBUG_AT( STMfbdev_Layer, config ); ++ ++ D_DEBUG_AT( STMfbdev_Layer, " -> updated: %x\n", updated); ++ ++ plane.layerid = shared->cur_planeinfo.layerid; ++ plane.activate = STMFBIO_ACTIVATE_IMMEDIATE; ++ plane.config = shared->cur_planeinfo.config; ++ ++ /* Update position? */ ++ if (D_FLAGS_IS_SET( updated, CLRCF_DEST )) { ++ /* Set horizontal and vertical offset & size. */ ++ D_DEBUG_AT( STMfbdev_Layer, " +> destination: %d,%d - %dx%d\n", ++ config->dest.x, config->dest.y, ++ config->dest.w, config->dest.h ); ++ ++ need_update = true; ++ ++ plane.config.dest.x = config->dest.x; ++ plane.config.dest.y = config->dest.y; ++ plane.config.dest.dim.w = config->dest.w; ++ plane.config.dest.dim.h = config->dest.h; ++ } ++ ++ /* Update size? */ ++ if (D_FLAGS_IS_SET( updated, (CLRCF_WIDTH | CLRCF_HEIGHT) )) { ++ /* Set width and height. */ ++ D_DEBUG_AT( STMfbdev_Layer, " +> width/height: %dx%d, vp: %d,%d - %dx%d\n", ++ config->width, config->height, ++ config->source.x, config->source.y, ++ config->source.w, config->source.h); ++ ++ need_update = true; ++ ++ /* FIXME: stmfb driver API is incomplete! Should be updated to ++ support a real source 'viewport' inside a source surface. */ ++ plane.config.source.w = config->width; ++ plane.config.source.h = config->height; ++ ++ /* fixme: clipping? */ ++#if 0 ++ if (config->dest.x + config->width > screen_width) ++ plane.config.source.w = screen_width - config->dest.x; ++ ++ if (config->dest.y + config->height > screen_height) ++ plane.config.source.h = screen_height - config->dest.y; ++#endif ++ } ++ D_ASSUME (config->width == config->source.w); ++ D_ASSUME (config->height == config->source.h); ++ D_ASSUME (config->source.x == 0); ++ D_ASSUME (config->source.y == 0); ++ ++ /* Update surface? */ ++ if (D_FLAGS_IS_SET( updated, CLRCF_SURFACE )) { ++ /* Set buffer base address and pitch. */ ++ D_DEBUG_AT( STMfbdev_Layer, ++ " +> offset 0x%.8lx, pitch %d, addr %p, phys 0x%.8lx\n", ++ left_lock->offset, left_lock->pitch, ++ left_lock->addr, left_lock->phys); ++ ++ need_update = true; ++ ++ plane.config.baseaddr = left_lock->phys; ++ plane.config.pitch = left_lock->pitch; ++ } ++ ++ /* Update format? */ ++ if (D_FLAGS_IS_SET( updated, CLRCF_FORMAT )) { ++ /* Set pixel format. */ ++ switch (config->format) { ++ case STM_supported_pixelformat: ++ plane.config.format = dspf_to_stmfb[DFB_PIXELFORMAT_INDEX( config->format )]; ++ need_update = true; ++ break; ++ ++ default: ++ break; ++ } ++ ++ D_DEBUG_AT( STMfbdev_Layer, " +> pixelformat: %x (%s) -> %d\n", ++ config->format, dfb_pixelformat_name( config->format ), ++ plane.config.format ); ++ } ++ D_ASSUME( surface->config.format == config->format ); ++ ++ ++ /* now for the extended state stuff */ ++ hw_caps = shared->orig_varex.caps; ++ var_ex.layerid = shared->orig_varex.layerid; ++ var_ex.activate = STMFBIO_ACTIVATE_IMMEDIATE; ++ var_ex.caps = 0; ++ ++ if (D_FLAGS_IS_SET( updated, CLRCF_OPTIONS )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> options: 0x%.8x %s%s%s%s%s%s%s\n", ++ config->options, ++ (config->options & DLOP_ALPHACHANNEL) ? "ALPHA " : "", ++ (config->options & DLOP_FLICKER_FILTERING) ? "FLICKER " : "", ++ (config->options & DLOP_DEINTERLACING) ? "DEI " : "", ++ (config->options & DLOP_SRC_COLORKEY) ? "SRCKEY " : "", ++ (config->options & DLOP_DST_COLORKEY) ? "DSTKEY " : "", ++ (config->options & DLOP_OPACITY) ? "OPACITY " : "", ++ (config->options & DLOP_FIELD_PARITY) ? "PARITY " : "" ); ++ ++ D_ASSUME( D_FLAGS_IS_SET( config->options, DLOP_ALPHACHANNEL )); ++ ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_FLICKER_FILTER )) { ++ var_ex.caps |= STMFBIO_VAR_CAPS_FLICKER_FILTER; ++ var_ex.ff_state = ((config->options & DLOP_FLICKER_FILTERING) ++ ? STMFBIO_FF_ADAPTIVE ++ : STMFBIO_FF_OFF ++ ); ++ } ++ } ++ ++ if (D_FLAGS_IS_SET( updated, (CLRCF_OPTIONS | CLRCF_SRCKEY) )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> srckey: %02x%02x%02x\n", ++ config->src_key.r, config->src_key.g, config->src_key.b ); ++ ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_COLOURKEY )) { ++ ++ var_ex.caps |= STMFBIO_VAR_CAPS_COLOURKEY; ++ var_ex.colourKeyFlags = ((config->options & DLOP_SRC_COLORKEY) ++ ? STMFBIO_COLOURKEY_FLAGS_ENABLE ++ : 0 ++ ); ++ var_ex.min_colour_key ++ = var_ex.max_colour_key ++ = PIXEL_ARGB (0, config->src_key.r, config->src_key.g, ++ config->src_key.b); ++ } ++ } ++ ++ if (D_FLAGS_IS_SET( updated, CLRCF_SURFACE_CAPS )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> surface caps: %spremultiplied alpha\n", ++ ((config->surface_caps & DSCAPS_PREMULTIPLIED) ++ ? "" : "non-") ); ++ ++ D_ASSUME( D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_PREMULTIPLIED )); ++ ++ var_ex.caps |= STMFBIO_VAR_CAPS_PREMULTIPLIED; ++ var_ex.premultiplied_alpha = ((config->surface_caps & DSCAPS_PREMULTIPLIED) ++ ? 1 ++ : 0 ++ ); ++ } ++ ++ if (D_FLAGS_IS_SET( updated, CLRCF_OPACITY )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> opacity: %d\n", config->opacity ); ++ ++ D_ASSUME( D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_OPACITY )); ++ ++ var_ex.caps |= STMFBIO_VAR_CAPS_OPACITY; ++ var_ex.opacity = ((config->options & DLOP_OPACITY) ++ ? config->opacity ++ : 255 ++ ); ++ } ++ ++ if (D_FLAGS_IS_SET( updated, CLRCF_ALPHA_RAMP )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> alpha ramp: 0x%02x 0x%02x 0x%02x 0x%02x\n", ++ config->alpha_ramp[0], config->alpha_ramp[1], ++ config->alpha_ramp[2], config->alpha_ramp[3] ); ++ ++ D_ASSUME( D_FLAGS_IS_SET( hw_caps, STMFBIO_VAR_CAPS_ALPHA_RAMP )); ++ ++ var_ex.caps |= STMFBIO_VAR_CAPS_ALPHA_RAMP; ++ var_ex.alpha_ramp[0] = config->alpha_ramp[0]; ++ var_ex.alpha_ramp[1] = config->alpha_ramp[3]; ++ } ++ ++ if (need_update) { ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_PLANEMODE, &plane ) < 0) { ++ D_PERROR( " => STMFBIO_SET_PLANEINFO failed\n" ); ++ ++ /* not being able to set the new configuration is fatal, I ++ would say. */ ++ return errno2result( errno ); ++ } ++ ++ shared->cur_planeinfo = plane; ++ } ++ ++ if (var_ex.caps ++ && ioctl( stmfbdev->fd, STMFBIO_SET_VAR_SCREENINFO_EX, &var_ex) < 0) ++ D_PERROR( " => STMFBIO_SET_VAR_SCREENINFO_EX failed\n" ); ++ ++ /* Update CLUT? */ ++ if (D_FLAGS_IS_SET( updated, CLRCF_PALETTE ) && palette) { ++ struct fb_cmap *cmap = &shared->current_cmap; ++ unsigned int i; ++ ++ cmap->len = ((palette->num_entries <= 256) ++ ? palette->num_entries : 256); ++ ++ D_DEBUG_AT( STMfbdev_Layer, " +> palette (%u entries)\n", cmap->len); ++ ++ for (i = 0; i < cmap->len; ++i) { ++ /* expand to 16 bit */ ++ cmap->red[i] = palette->entries[i].r * 0x0101; ++ cmap->green[i] = palette->entries[i].g * 0x0101; ++ cmap->blue[i] = palette->entries[i].b * 0x0101; ++ cmap->transp[i] = (0xff - palette->entries[i].a) * 0x0101; ++ } ++ ++ if (ioctl( stmfbdev->fd, FBIOPUTCMAP, cmap ) < 0) ++ D_PERROR( "STMfbdev/Layer: Could not set the palette!\n" ); ++ } ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevRemoveRegion( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ void *region_data ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevLayerSharedData * const shared = layer_data; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ ++ (void) stmfbdev; ++ (void) shared; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevFlipRegion( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ void *region_data, ++ CoreSurface *surface, ++ DFBSurfaceFlipFlags flags, ++ CoreSurfaceBufferLock *left_lock, ++ CoreSurfaceBufferLock *right_lock ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevLayerSharedData * const shared = layer_data; ++ struct stmfbio_plane_pan pan; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ ++ D_DEBUG_AT( STMfbdev_Layer, " -> buffer: %p\n", left_lock->buffer ); ++ D_DEBUG_AT( STMfbdev_Layer, ++ " -> offset 0x%.8lx, pitch %d, addr %p, phys 0x%.8lx\n", ++ left_lock->offset, left_lock->pitch, ++ left_lock->addr, left_lock->phys); ++ ++ pan.layerid = shared->cur_planeinfo.layerid; ++ pan.activate = (((flags & DSFLIP_WAITFORSYNC) == DSFLIP_ONSYNC) ++ ? STMFBIO_ACTIVATE_VBL : STMFBIO_ACTIVATE_IMMEDIATE); ++ pan.baseaddr = left_lock->phys; ++ ++ if (((flags & DSFLIP_WAITFORSYNC) == DSFLIP_WAITFORSYNC) ++ && !dfb_config->pollvsync_after) ++ dfb_screen_wait_vsync( layer->screen ); ++ ++ if (ioctl( stmfbdev->fd, STMFBIO_PAN_PLANE, &pan ) < 0) { ++ D_PERROR( "STMfbdev/Layer: Panning display to %lx (%s) failed\n", ++ pan.baseaddr, ++ (pan.activate & STMFBIO_ACTIVATE_VBL) ? "vbl" : "now"); ++ ++ return errno2result( errno ); ++ } ++ ++ if ((flags & DSFLIP_WAIT) ++ && (dfb_config->pollvsync_after || !(flags & DSFLIP_ONSYNC))) ++ dfb_screen_wait_vsync( dfb_screens_at( DSCID_PRIMARY ) ); ++ ++ dfb_surface_flip( surface, false ); ++ ++ shared->cur_planeinfo.config.baseaddr = pan.baseaddr; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevGetLevel( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ int *level ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ const STMfbdevLayerSharedData * const shared = layer_data; ++ struct stmfbio_var_screeninfo_ex var_ex; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ ++ (void) stmfbdev; ++ ++ if (!D_FLAGS_IS_SET( shared->orig_varex.caps, STMFBIO_VAR_CAPS_ZPOSITION )) ++ return DFB_UNSUPPORTED; ++ ++ var_ex.layerid = shared->orig_varex.layerid; ++ if (ioctl( stmfbdev->fd, STMFBIO_GET_VAR_SCREENINFO_EX, &var_ex ) < 0 ) ++ return errno2result( errno ); ++ ++ *level = (int) var_ex.z_position; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevSetLevel( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ int level ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ const STMfbdevLayerSharedData * const shared = layer_data; ++ struct stmfbio_var_screeninfo_ex var_ex; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ ++ (void) stmfbdev; ++ ++ D_DEBUG_AT( STMfbdev_Layer, " -> %d\n", level ); ++ ++ if (!D_FLAGS_IS_SET( shared->orig_varex.caps, STMFBIO_VAR_CAPS_ZPOSITION )) ++ return DFB_UNSUPPORTED; ++ ++ var_ex.layerid = shared->orig_varex.layerid; ++ var_ex.activate = STMFBIO_ACTIVATE_IMMEDIATE; ++ var_ex.caps = STMFBIO_VAR_CAPS_ZPOSITION; ++ var_ex.z_position = (level < 0) ? 0 : level; ++ ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_VAR_SCREENINFO_EX, &var_ex ) < 0 ) ++ return errno2result( errno ); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevSetColorAdjustment( CoreLayer *layer, ++ void *driver_data, ++ void *layer_data, ++ DFBColorAdjustment *adjustment ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ const STMfbdevLayerSharedData * const shared = layer_data; ++ struct stmfbio_var_screeninfo_ex var_ex; ++ ++ D_DEBUG_AT( STMfbdev_Layer, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevLayerSharedData ); ++ ++ (void) stmfbdev; ++ ++ if (D_FLAGS_INVALID( adjustment->flags, shared->supported_adjustments )) ++ return DFB_INVARG; ++ ++ var_ex.layerid = shared->orig_varex.layerid; ++ var_ex.activate = STMFBIO_ACTIVATE_IMMEDIATE; ++ var_ex.caps = 0; ++ ++ D_DEBUG_AT( STMfbdev_Layer, " -> flags: %x\n", adjustment->flags ); ++ ++ if (D_FLAGS_IS_SET( adjustment->flags, DCAF_BRIGHTNESS )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> brightness: 0x%04x\n", ++ adjustment->brightness ); ++ ++ if (D_FLAGS_IS_SET( shared->orig_varex.caps, ++ STMFBIO_VAR_CAPS_BRIGHTNESS )) { ++ var_ex.caps |= STMFBIO_VAR_CAPS_BRIGHTNESS; ++ var_ex.brightness = adjustment->brightness >> 8; ++ } ++ else { ++ var_ex.caps |= STMFBIO_VAR_CAPS_GAIN; ++ /* 0-0x8000 -> 0-255 */ ++ var_ex.gain = ((adjustment->brightness > 0x8000) ++ ? 255 ++ : (((adjustment->brightness >> 8) * 255) / 128) ++ ); ++ } ++ } ++ ++ if (D_FLAGS_IS_SET( adjustment->flags, DCAF_CONTRAST )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> contrast: 0x%04x\n", ++ adjustment->contrast ); ++ ++ var_ex.caps |= STMFBIO_VAR_CAPS_CONTRAST; ++ var_ex.contrast = adjustment->contrast >> 8; ++ } ++ ++ if (D_FLAGS_IS_SET( adjustment->flags, DCAF_HUE )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> hue: 0x%04x\n", ++ adjustment->hue ); ++ ++ var_ex.caps |= STMFBIO_VAR_CAPS_TINT; ++ var_ex.tint = adjustment->hue >> 8; ++ } ++ ++ if (D_FLAGS_IS_SET( adjustment->flags, DCAF_SATURATION )) { ++ D_DEBUG_AT( STMfbdev_Layer, " +> saturation: 0x%04x\n", ++ adjustment->saturation ); ++ ++ var_ex.caps |= STMFBIO_VAR_CAPS_SATURATION; ++ var_ex.saturation = adjustment->saturation >> 8; ++ } ++ ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_VAR_SCREENINFO_EX, &var_ex ) < 0 ) ++ return errno2result( errno ); ++ ++ return DFB_OK; ++} ++ ++ ++DisplayLayerFuncs _g_stmfbdevLayerFuncs = { ++ .LayerDataSize = stmfbdevLayerDataSize, ++ .RegionDataSize = stmfbdevRegionDataSize, ++ ++ .InitLayer = stmfbdevInitLayer, ++ .ShutdownLayer = stmfbdevShutdownLayer, ++ ++ .TestRegion = stmfbdevTestRegion, ++ .AddRegion = stmfbdevAddRegion, ++ .SetRegion = stmfbdevSetRegion, ++ .RemoveRegion = stmfbdevRemoveRegion, ++ .FlipRegion = stmfbdevFlipRegion, ++ ++ .GetLevel = stmfbdevGetLevel, ++ .SetLevel = stmfbdevSetLevel, ++ ++ .SetColorAdjustment = stmfbdevSetColorAdjustment, ++}; +diff --git a/systems/stmfbdev/stmfbdev_screen.c b/systems/stmfbdev/stmfbdev_screen.c +new file mode 100644 +index 0000000..acee807 +--- /dev/null ++++ b/systems/stmfbdev/stmfbdev_screen.c +@@ -0,0 +1,1338 @@ ++/* ++ (c) Copyright 2010 STMicroelectronics (R&D) Ltd. ++ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by André Draszik . ++ ++ Based on work by Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++#include "stmfbdev.h" ++#include "fb.h" ++#ifndef FBIO_WAITFORVSYNC ++#define FBIO_WAITFORVSYNC _IOW('F', 0x20, u_int32_t) ++#endif ++ ++D_DEBUG_DOMAIN( STMfbdev_Screen, "STMfbdev/Screen", "STMfb System Module Screen Handling" ); ++ ++ ++typedef struct __attribute__((__aligned__(32))) _STMfbdevScreenVideoMode { ++ enum stmfbio_output_standard stm_standard; ++ ++ DFBScreenOutputResolution resolution; ++ DFBScreenEncoderScanMode scanmode; ++ DFBScreenEncoderFrequency frequency; ++ DFBScreenEncoderTVStandards tv_standard; ++ ++ struct _STMfbdevScreenVideoMode *next; ++ ++#if D_DEBUG_ENABLED ++ const char *frequency_str; ++ const char *resolution_str; ++ const char *scanmode_str; ++ const char *tv_standard_str; ++#endif ++} STMfbdevScreenVideoMode; ++ ++#if D_DEBUG_ENABLED ++# define ASSIGN(x,y) x = y, x##_str = #y ++#else /* D_DEBUG_ENABLED */ ++# define ASSIGN(x,y) x = y ++#endif /* D_DEBUG_ENABLED */ ++ ++typedef struct { ++ int magic; ++ ++ int screenid; ++ /* the DirectFB indexes, assigned to these encoders */ ++ unsigned int encoder_main; ++ unsigned int encoder_sd; ++ unsigned int encoder_analog; ++ unsigned int encoder_hdmi; ++ unsigned int encoder_dvo; ++ ++ STMfbdevScreenVideoMode *modes; /* list of modes supported */ ++ STMfbdevScreenVideoMode mode; /* current mode */ ++ ++ struct stmfbio_outputinfo orig_info; /* startup */ ++ struct stmfbio_output_configuration orig_config; /* startup */ ++ ++ FusionSHMPoolShared *shmpool; ++} STMfbdevScreenSharedData; ++ ++/******************************************************************************/ ++/* Parallel Count carries out bit counting in a parallel fashion. Consider n ++ after the first line has finished executing. Imagine splitting n into ++ pairs of bits. Each pair contains the number of ones in those two bit ++ positions in the original n. After the second line has finished executing, ++ each nibble contains the number of ones in those four bits positions in ++ the original n. Continuing this for five iterations, the 64 bits contain ++ the number of ones among these sixty-four bit positions in the original n. ++ That is what we wanted to compute. */ ++ ++#define TWO64(c) (0x1llu << (c)) ++#define MASK64(c) (((unsigned long long)(-1)) / (TWO64(TWO64(c)) + 1llu)) ++#define COUNT64(x,c) ((x) & MASK64(c)) + (((x) >> (TWO64(c))) & MASK64(c)) ++static unsigned int ++_bitcount64 (unsigned long long n) ++{ ++ n = COUNT64 (n, 0); ++ n = COUNT64 (n, 1); ++ n = COUNT64 (n, 2); ++ n = COUNT64 (n, 3); ++ n = COUNT64 (n, 4); ++ n = COUNT64 (n, 5); ++ return n ; ++} ++ ++ ++static void ++stmfbdevScreen_build_full_videomode( STMfbdevScreenVideoMode * const m ) ++{ ++ D_ASSERT( _bitcount64( m->stm_standard ) == 1 ); ++ ++ /* resolution */ ++ if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_SMPTE274M )) ++ ASSIGN( m->resolution, DSOR_1920_1080 ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_WQFHD5660 ++ | STMFBIO_STD_WQFHD5650) )) ++ ASSIGN( m->resolution, DSOR_1440_540 ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_SMPTE296M )) ++ ASSIGN( m->resolution, DSOR_1280_720 ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_QFHD1830 ++ | STMFBIO_STD_QFHD1825 ++ | STMFBIO_STD_QFHD3660 ++ | STMFBIO_STD_QFHD3650 ++ | STMFBIO_STD_QFHD5660 ++ | STMFBIO_STD_QFHD5650) )) ++ ASSIGN( m->resolution, DSOR_960_540 ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_576P_50 ++ | STMFBIO_STD_625_50) )) ++ ASSIGN( m->resolution, DSOR_720_576 ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_480P_60 ++ | STMFBIO_STD_480P_59_94 ++ | STMFBIO_STD_525_60) )) ++ ASSIGN( m->resolution, DSOR_720_480 ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_VESA )) ++ ASSIGN( m->resolution, DSOR_640_480 ); ++ else ++ ASSIGN( m->resolution, DSOR_UNKNOWN ); ++ ++ /* scanmode */ ++ if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_PROGRESSIVE )) ++ ASSIGN( m->scanmode, DSESM_PROGRESSIVE ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_INTERLACED )) ++ ASSIGN( m->scanmode, DSESM_INTERLACED ); ++ else ++ ASSIGN( m->scanmode, DSESM_UNKNOWN ); ++ ++ /* frequency */ ++ if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_1080P_23_976 )) ++ ASSIGN( m->frequency, DSEF_23_976HZ ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_1080P_24 )) ++ ASSIGN( m->frequency, DSEF_24HZ ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_1080P_25 ++ | STMFBIO_STD_QFHD1825) )) ++ ASSIGN( m->frequency, DSEF_25HZ ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_1080P_29_97 ++ | STMFBIO_STD_QFHD1830) )) ++ ASSIGN( m->frequency, DSEF_29_97HZ ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_1080P_30 )) ++ ASSIGN( m->frequency, DSEF_30HZ ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_1080P_50 ++ | STMFBIO_STD_1080I_50 ++ | STMFBIO_STD_720P_50 ++ | STMFBIO_STD_576P_50 ++ | STMFBIO_STD_625_50 ++ | STMFBIO_STD_QFHD3650 ++ | STMFBIO_STD_WQFHD5650 ++ | STMFBIO_STD_QFHD5650) )) ++ ASSIGN( m->frequency, DSEF_50HZ ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_1080P_59_94 ++ | STMFBIO_STD_1080I_59_94 ++ | STMFBIO_STD_720P_59_94 ++ | STMFBIO_STD_480P_59_94 ++ | STMFBIO_STD_VGA_59_94 ++ | STMFBIO_STD_525_60 ++ | STMFBIO_STD_QFHD3660 ++ | STMFBIO_STD_WQFHD5660 ++ | STMFBIO_STD_QFHD5660) )) ++ ASSIGN( m->frequency, DSEF_59_94HZ ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, (STMFBIO_STD_1080P_60 ++ | STMFBIO_STD_1080I_60 ++ | STMFBIO_STD_720P_60 ++ | STMFBIO_STD_480P_60 ++ | STMFBIO_STD_VGA_60) )) ++ ASSIGN( m->frequency, DSEF_60HZ ); ++ else ++ ASSIGN( m->frequency, DSEF_UNKNOWN ); ++ ++ /* analogue standard - DSETV_PAL and DSETV_NTSC denote _any_ specific ++ compatible standard */ ++ if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_PAL_BDGHI )) ++ ASSIGN( m->tv_standard, DSETV_PAL | DSETV_PAL_BG | DSETV_PAL_I ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_PAL_M )) ++ ASSIGN( m->tv_standard, DSETV_PAL | DSETV_PAL_M ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_PAL_N )) ++ ASSIGN( m->tv_standard, DSETV_PAL | DSETV_PAL_N ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_PAL_Nc )) ++ ASSIGN( m->tv_standard, DSETV_PAL | DSETV_PAL_NC ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_PAL_60 )) ++ ASSIGN( m->tv_standard, DSETV_PAL_60 ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_SECAM )) ++ ASSIGN( m->tv_standard, DSETV_SECAM ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_NTSC_M )) ++ ASSIGN( m->tv_standard, DSETV_NTSC ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_NTSC_M_JP )) ++ ASSIGN( m->tv_standard, DSETV_NTSC | DSETV_NTSC_M_JPN ); ++ else if (D_FLAGS_IS_SET( m->stm_standard, STMFBIO_STD_NTSC_443 )) ++ ASSIGN( m->tv_standard, DSETV_NTSC | DSETV_NTSC_443 ); ++ else ++ ASSIGN( m->tv_standard, DSETV_DIGITAL ); ++} ++ ++static DFBResult ++stmfbdevScreen_set_mode( const STMfbdev * const stmfbdev, ++ STMfbdevScreenSharedData * const shared, ++ const STMfbdevScreenVideoMode * const m, ++ bool test ) ++{ ++ struct stmfbio_outputinfo info; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( mode: %p )\n", __FUNCTION__, m ); ++ ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ D_ASSERT( m != NULL ); ++ ++ /* start with current config */ ++ info.outputid = shared->orig_info.outputid; ++ ++ info.activate = test ? STMFBIO_ACTIVATE_TEST : STMFBIO_ACTIVATE_IMMEDIATE; ++ info.standard = m->stm_standard; ++ ++ D_DEBUG_AT( STMfbdev_Screen, " -> %.16llx\n", info.standard ); ++ ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_OUTPUTINFO, &info ) < 0) { ++ typeof (errno) errno_backup = errno; ++ D_DEBUG_AT( STMfbdev_Screen, " => FAILED (%d %m)!\n", errno ); ++ return errno2result( errno_backup ); ++ } ++ ++ D_DEBUG_AT( STMfbdev_Screen, " => SUCCESS\n" ); ++ ++ /* remember new config */ ++ if (!test) { ++ shared->orig_info.standard = info.standard; ++ ++ if (&shared->mode != m) ++ shared->mode = *m; ++ } ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevScreen_get_supported_modes( const STMfbdev * const stmfbdev, ++ STMfbdevScreenSharedData *shared ) ++{ ++ struct stmfbio_outputstandards standards; ++ unsigned int n_modes; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s()\n", __FUNCTION__ ); ++ ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ ++ /* get output standards supported on the current platform */ ++ standards.outputid = shared->orig_info.outputid; ++ if (ioctl( stmfbdev->fd, STMFBIO_GET_OUTPUTSTANDARDS, &standards ) < 0) { ++ typeof (errno) errno_backup = errno; ++ D_PERROR( "STMfbdev/Screen: Could not get supported output mode!\n" ); ++ return errno2result( errno_backup ); ++ } ++ ++ n_modes = _bitcount64( standards.all_standards ); ++ D_DEBUG_AT( STMfbdev_Screen, " -> %u modes\n", n_modes ); ++ ++ shared->modes = SHCALLOC( shared->shmpool, n_modes ? : 1, ++ sizeof(STMfbdevScreenVideoMode) ); ++ if (!shared->modes) ++ return D_OOSHM(); ++ ++ /* in the (unlikely) case no modes where reported, try the current ++ mode, and if that is not possible, fail. */ ++ if (!n_modes) { ++ *shared->modes = shared->mode; ++ if (stmfbdevScreen_set_mode( stmfbdev, shared, shared->modes, true )) { ++ D_ERROR( "STMfbdev/Screen: " ++ "No modes announced and current mode not supported!\n" ); ++ ++ return DFB_INIT; ++ } ++ ++ D_DEBUG_AT( STMfbdev_Screen, " -> Modelist\n" ); ++ D_DEBUG_AT( STMfbdev_Screen, " +> %.16llx: %s %s %s %s\n", ++ shared->mode.stm_standard, shared->mode.resolution_str, ++ shared->mode.scanmode_str, shared->mode.frequency_str, ++ shared->mode.tv_standard_str ); ++ ++ return DFB_OK; ++ } ++ ++ { ++ STMfbdevScreenVideoMode *m = shared->modes; ++ ++ D_DEBUG_AT( STMfbdev_Screen, " -> Modelist\n" ); ++ do { ++ m->stm_standard = standards.all_standards & -standards.all_standards; ++ standards.all_standards &= ~m->stm_standard; ++ ++ stmfbdevScreen_build_full_videomode( m ); ++ D_DEBUG_AT( STMfbdev_Screen, " +> %.16llx: %.2x %.2x %.2x %.3x %s %s %s %s\n", ++ m->stm_standard, m->resolution, m->scanmode, ++ m->frequency, m->tv_standard, ++ m->resolution_str, m->scanmode_str, ++ m->frequency_str, m->tv_standard_str ); ++ ++ m->next = m+1; ++ ++m; ++ } while (--n_modes > 0); ++ --m; m->next = NULL; ++ } ++ ++ D_ASSUME( n_modes == 0 ); ++ D_ASSUME( standards.all_standards == STMFBIO_STD_UNKNOWN ); ++ ++ return DFB_OK; ++} ++ ++static const STMfbdevScreenVideoMode * ++stmfbdevScreen_find_mode (const STMfbdevScreenSharedData * const shared, ++ const DFBScreenEncoderConfig * const config) ++{ ++ const STMfbdevScreenVideoMode *m, *best_match; ++ ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ D_ASSERT( config != NULL ); ++ ++ if (!D_FLAGS_ARE_SET (config->flags, (DSECONF_SCANMODE ++ | DSECONF_FREQUENCY ++ | DSECONF_RESOLUTION))) ++ return NULL; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s: %.2x %.2x %.2x %s%.3x%s\n", ++ __FUNCTION__, ++ config->resolution, config->scanmode, config->frequency, ++ (config->flags & DSECONF_TV_STANDARD) ? "" : " (", ++ config->tv_standard, ++ (config->flags & DSECONF_TV_STANDARD) ? "" : ")" ); ++ ++ for (best_match = NULL, m = shared->modes; m; m = m->next) { ++ if (config->frequency != m->frequency) ++ continue; ++ if (config->scanmode != m->scanmode) ++ continue; ++ if (config->resolution != m->resolution) ++ continue; ++ ++ if (!(config->flags & DSECONF_TV_STANDARD)) { ++ D_DEBUG_AT( STMfbdev_Screen, " -> exact: %s %s %s (%s)\n", ++ m->resolution_str, m->scanmode_str, ++ m->frequency_str, m->tv_standard_str ); ++ return m; ++ } ++ ++ if (config->tv_standard == DSETV_ALL) ++ best_match = m; ++ else if ((config->tv_standard & m->tv_standard) == config->tv_standard) { ++ /* exact match */ ++ D_DEBUG_AT( STMfbdev_Screen, " -> exact: %s %s %s %s\n", ++ m->resolution_str, m->scanmode_str, ++ m->frequency_str, m->tv_standard_str ); ++ return m; ++ } ++ } ++ ++ if (!best_match) ++ D_WARN( " -> couldn't find a matching output standard for res/scan/hz/tv: %.2x %.2x %.2x %s%.3x%s\n", ++ config->resolution, config->scanmode, config->frequency, ++ (config->flags & DSECONF_TV_STANDARD) ? "" : "(", ++ config->tv_standard, ++ (config->flags & DSECONF_TV_STANDARD) ? "" : ")" ); ++ else ++ D_DEBUG_AT( STMfbdev_Screen, ++ " -> best match: %s %s %s %s\n", ++ best_match->resolution_str, best_match->scanmode_str, ++ best_match->frequency_str, ++ best_match->tv_standard_str ); ++ ++ return best_match; ++} ++ ++/******************************************************************************/ ++ ++static int ++stmfbdevScreenDataSize( void ) ++{ ++ D_DEBUG_AT( STMfbdev_Screen, "%s() <- %u\n", ++ __FUNCTION__, sizeof(STMfbdevScreenSharedData) ); ++ ++ return sizeof(STMfbdevScreenSharedData); ++} ++ ++static DFBResult ++stmfbdevInitScreen( CoreScreen *screen, ++ CoreGraphicsDevice *device, ++ void *driver_data, ++ void *screen_data, ++ DFBScreenDescription *description ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevScreenSharedData * const shared = screen_data; ++ u32 hw_caps; ++ int n_outputs = -1; ++ int n_encoders = -1; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p %d )\n", __FUNCTION__, screen, ++ stmfbdev->shared->num_screens + 1 ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_ASSERT( shared != NULL ); ++ ++ D_MAGIC_SET( shared, STMfbdevScreenSharedData ); ++ ++ shared->screenid = stmfbdev->shared->num_screens++; ++ ++ shared->shmpool = stmfbdev->shared->shmpool; ++ ++ shared->encoder_main ++ = shared->encoder_sd ++ = shared->encoder_analog ++ = shared->encoder_hdmi ++ = shared->encoder_dvo ++ = -1; ++ ++ /* remember startup output info, so we can restore it on shutdown*/ ++ shared->orig_info.outputid = STMFBIO_OUTPUTID_MAIN; ++ if (ioctl( stmfbdev->fd, STMFBIO_GET_OUTPUTINFO, &shared->orig_info ) < 0) { ++ typeof (errno) errno_backup = errno; ++ D_PERROR( "STMfbdev/Screen: Could not get current output mode\n" ); ++ return errno2result( errno_backup ); ++ } ++ ++/* D_DEBUG_AT( STMfbdev_Screen, ++ " -> current: %dx%d @ %d,%d-%dx%d (%d: %s) %ubpp pitch %u @ 0x%08lx\n", ++ pc->source.w, pc->source.h, pc->dest.x, pc->dest.y, ++ pc->dest.dim.w, pc->dest.dim.h, pc->format, ++ dfb_pixelformat_name( stmfb_to_dsbf( pc->format ) ), ++ pc->bitdepth, pc->pitch, pc->baseaddr ); ++*/ ++ D_DEBUG_AT( STMfbdev_Screen, " -> current mode: 0x%.16llx\n", ++ shared->orig_info.standard ); ++ ++ /* remember stmfb's output config */ ++ shared->orig_config.outputid = STMFBIO_OUTPUTID_MAIN; ++ if (ioctl( stmfbdev->fd, ++ STMFBIO_GET_OUTPUT_CONFIG, &shared->orig_config ) < 0) { ++ typeof (errno) errno_backup = errno; ++ D_PERROR( "STMfbdev/Screen: Could not get current output config\n" ); ++ return errno2result( errno_backup ); ++ } ++ hw_caps = shared->orig_config.caps; ++ D_DEBUG_AT( STMfbdev_Screen, " -> extended caps: 0x%08x\n", hw_caps ); ++ ++ /* Set the screen name */ ++ snprintf( description->name, sizeof (description->name), ++ "STMfbdev Screen %d", shared->screenid ); ++ ++ /* Set the screen capabilities. */ ++ description->caps = DSCCAPS_VSYNC; ++ ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_MIXER_BACKGROUND )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have mixer background\n" ); ++ description->caps |= DSCCAPS_MIXERS; ++ ++description->mixers; ++ } ++ ++ if (D_FLAGS_IS_SET( hw_caps, (STMFBIO_OUTPUT_CAPS_ANALOGUE_CONFIG ++ | STMFBIO_OUTPUT_CAPS_HDMI_CONFIG ++ | STMFBIO_OUTPUT_CAPS_DVO_CONFIG) )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have main encoder\n" ); ++ description->caps |= DSCCAPS_ENCODERS; ++ shared->encoder_main = ++n_encoders; ++ } ++ /* all additional encoders are slaved off the main one */ ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_ANALOGUE_CONFIG )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have analogue\n" ); ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_SDTV_ENCODING )) ++ D_DEBUG_AT( STMfbdev_Screen, " +> with SDTV\n" ); ++ shared->encoder_analog = ++n_encoders; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_HDMI_CONFIG )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have HDMI\n" ); ++ shared->encoder_hdmi = ++n_encoders; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_DVO_CONFIG )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have DVO\n" ); ++ shared->encoder_dvo = ++n_encoders; ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_PSI_MASK )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have PSI\n" ); ++ description->caps |= DSCCAPS_ENCODERS; ++ shared->encoder_sd = ++n_encoders; ++ } ++ ++ description->outputs = ++n_outputs; ++ description->encoders = ++n_encoders; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevShutdownScreen( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevScreenSharedData * const shared = screen_data; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p )\n", __FUNCTION__, screen ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ ++ /* try and restore the driver's state. */ ++ shared->orig_info.activate = STMFBIO_ACTIVATE_IMMEDIATE; ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_OUTPUTINFO, &shared->orig_info ) < 0) ++ D_PERROR( "STMfbdev/Screen: Could not restore output mode\n" ); ++ ++ shared->orig_config.activate = STMFBIO_ACTIVATE_IMMEDIATE; ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_OUTPUT_CONFIG, &shared->orig_config ) < 0) ++ D_PERROR( "STMfbdev/Screen: Could not restore output config: %.8x\n", ++ shared->orig_config.failed ); ++ ++ SHFREE( shared->shmpool, shared->modes ); ++ ++ D_MAGIC_CLEAR( shared ); ++ ++ return DFB_OK; ++} ++ ++/* Mixer configuration */ ++static DFBResult ++stmfbdevInitMixer( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ int mixer, ++ DFBScreenMixerDescription *description, ++ DFBScreenMixerConfig *config ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ const STMfbdevScreenSharedData * const shared = screen_data; ++ const struct stmfbio_output_configuration *oc; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p %d )\n", ++ __FUNCTION__, screen, mixer ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ ++ (void) stmfbdev; ++ ++ description->caps = DSMCAPS_FULL | DSMCAPS_BACKGROUND; ++ ++ DFB_DISPLAYLAYER_IDS_ADD( description->layers, DLID_PRIMARY ); ++ ++ snprintf( description->name, sizeof (description->name), ++ "STMfbdev Mixer" ); ++ ++ config->flags = DSMCONF_TREE | DSMCONF_BACKGROUND; ++ config->tree = DSMT_FULL; ++ ++ oc = &shared->orig_config; ++ config->background.a = (oc->mixer_background >> 24) & 0xff; ++ config->background.r = (oc->mixer_background >> 16) & 0xff; ++ config->background.g = (oc->mixer_background >> 8) & 0xff; ++ config->background.b = (oc->mixer_background >> 0) & 0xff; ++ ++ D_DEBUG_AT( STMfbdev_Screen, " -> background colour: 0x%08x\n", ++ oc->mixer_background ); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevDoMixerConfig( CoreScreen *screen, ++ const STMfbdev * const stmfbdev, ++ const STMfbdevScreenSharedData * const shared, ++ int mixer, ++ const DFBScreenMixerConfig *config, ++ DFBScreenMixerConfigFlags *failed, ++ bool test ) ++{ ++ DFBScreenMixerConfigFlags fail = DSMCONF_NONE; ++ struct stmfbio_output_configuration cfg; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p %d ) test: %c\n", ++ __FUNCTION__, screen, mixer, test ? 'y' : 'n' ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ ++ if (!D_FLAGS_ARE_IN( config->flags, DSMCONF_TREE | DSMCONF_BACKGROUND )) ++ fail |= (config->flags & ~(DSMCONF_TREE | DSMCONF_BACKGROUND)); ++ ++ cfg.outputid = STMFBIO_OUTPUTID_MAIN; ++ cfg.activate = test ? STMFBIO_ACTIVATE_TEST : STMFBIO_ACTIVATE_IMMEDIATE; ++ cfg.caps = 0; ++ ++ if (D_FLAGS_IS_SET( config->flags, DSMCONF_BACKGROUND )) { ++ D_DEBUG_AT( STMfbdev_Screen, " -> background %.2x%.2x%.2x%.2x\n", ++ config->background.a, config->background.r, ++ config->background.g, config->background.b ); ++ ++ cfg.caps |= STMFBIO_OUTPUT_CAPS_MIXER_BACKGROUND; ++ cfg.mixer_background = (0 ++ | (config->background.a << 24) ++ | (config->background.r << 16) ++ | (config->background.g << 8) ++ | (config->background.b << 0)); ++ } ++ ++ if (ioctl( stmfbdev->fd, STMFBIO_SET_OUTPUT_CONFIG, &cfg ) < 0) ++ fail |= DSMCONF_BACKGROUND; ++ ++ if (D_FLAGS_IS_SET( config->flags, DSMCONF_TREE ) ++ && D_FLAGS_INVALID( config->tree, DSMT_FULL )) ++ fail |= (config->tree & ~DSMT_FULL); ++ ++ if (failed) ++ *failed = fail; ++ ++ if (fail) { ++ D_DEBUG_AT( STMfbdev_Screen, " => FAILED!\n" ); ++ return DFB_UNSUPPORTED; ++ } ++ ++ D_DEBUG_AT( STMfbdev_Screen, " => SUCCESS\n" ); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevTestMixerConfig( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ int mixer, ++ const DFBScreenMixerConfig *config, ++ DFBScreenMixerConfigFlags *failed ) ++{ ++ return stmfbdevDoMixerConfig (screen, driver_data, screen_data, mixer, ++ config, failed, true); ++} ++ ++static DFBResult ++stmfbdevSetMixerConfig( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ int mixer, ++ const DFBScreenMixerConfig *config ) ++{ ++ return stmfbdevDoMixerConfig (screen, driver_data, screen_data, mixer, ++ config, NULL, false); ++} ++ ++ ++/* Encoder configuration */ ++static DFBResult ++stmfbdevInitEncoder( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ int encoder, ++ DFBScreenEncoderDescription *description, ++ DFBScreenEncoderConfig *config ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevScreenSharedData * const shared = screen_data; ++ DFBResult res; ++ const struct stmfbio_output_configuration *oc; ++ u32 hw_caps; ++ const STMfbdevScreenVideoMode *m; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p %d )\n", ++ __FUNCTION__, screen, encoder ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ ++ oc = &shared->orig_config; ++ hw_caps = oc->caps; ++ ++ if (encoder == shared->encoder_main) { ++ /* current mode */ ++ shared->mode.stm_standard = shared->orig_info.standard; ++ stmfbdevScreen_build_full_videomode( &shared->mode ); ++ ++ res = stmfbdevScreen_get_supported_modes( stmfbdev, shared ); ++ if (res != DFB_OK) ++ return res; ++ ++ /* master DFBScreenEncoder - signals and connectors can not be ++ changed on this one - only the output standard. */ ++ snprintf( description->name, sizeof (description->name), ++ "STMfbdev master output" ); ++ ++ D_ASSUME( D_FLAGS_IS_SET( hw_caps, ++ (STMFBIO_OUTPUT_CAPS_ANALOGUE_CONFIG ++ | STMFBIO_OUTPUT_CAPS_HDMI_CONFIG ++ | STMFBIO_OUTPUT_CAPS_DVO_CONFIG) )); ++ ++ description->type = DSET_DIGITAL; ++ ++ /* supported resolutions */ ++ for (m = shared->modes; m; m = m->next) ++ description->all_resolutions |= m->resolution; ++ if (description->all_resolutions) ++ description->caps = (DSECAPS_SCANMODE | DSECAPS_FREQUENCY ++ | DSECAPS_RESOLUTION); ++ ++ if (D_FLAGS_IS_SET( oc->caps, STMFBIO_OUTPUT_CAPS_ANALOGUE_CONFIG )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have analogue (slave)\n" ); ++ description->caps |= (DSECAPS_CONNECTORS ++ | DSECAPS_OUT_SIGNALS); ++ ++ description->all_connectors |= DSOC_COMPONENT; ++ description->out_signals |= DSOS_RGB | DSOS_YCBCR; ++ ++ if (D_FLAGS_IS_SET( oc->caps, STMFBIO_OUTPUT_CAPS_SDTV_ENCODING )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> with SDTV\n" ); ++ description->type |= DSET_TV; ++ /* add in supported TV standards */ ++ for (m = shared->modes; m; m = m->next) ++ description->tv_standards |= m->tv_standard; ++ D_FLAGS_CLEAR( description->tv_standards, DSETV_DIGITAL ); ++ if (description->tv_standards) ++ D_FLAGS_SET( description->caps, DSECAPS_TV_STANDARDS ); ++ ++ description->all_connectors |= DSOC_SCART | DSOC_YC | DSOC_CVBS; ++ description->out_signals |= DSOS_RGB | DSOS_YC | DSOS_CVBS; ++ } ++ } ++ if (D_FLAGS_IS_SET( oc->caps, STMFBIO_OUTPUT_CAPS_HDMI_CONFIG )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have HDMI (slave)\n" ); ++ description->caps |= (DSECAPS_CONNECTORS ++ | DSECAPS_OUT_SIGNALS); ++ ++ description->all_connectors |= DSOC_HDMI; ++ description->out_signals |= DSOS_HDMI | DSOS_RGB | DSOS_YCBCR; ++ } ++ if (D_FLAGS_IS_SET( oc->caps, STMFBIO_OUTPUT_CAPS_DVO_CONFIG )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> have DVO (slave)\n" ); ++ description->caps |= (DSECAPS_CONNECTORS ++ | DSECAPS_OUT_SIGNALS); ++ ++ description->all_connectors |= DSOC_656; ++ description->out_signals |= DSOS_656; ++ } ++ ++ /* current config */ ++ m = &shared->mode; ++ config->resolution = m->resolution; ++ config->scanmode = m->scanmode; ++ config->frequency = m->frequency; ++ config->tv_standard = m->tv_standard; ++ ++ config->flags |= (m->resolution != DSOR_UNKNOWN) ? DSECONF_RESOLUTION : 0; ++ config->flags |= (m->scanmode != DSESM_UNKNOWN) ? DSECONF_SCANMODE : 0; ++ config->flags |= (m->frequency != DSEF_UNKNOWN) ? DSECONF_FREQUENCY : 0; ++ config->flags |= (m->tv_standard != DSETV_UNKNOWN) ? DSECONF_TV_STANDARD : 0; ++ } ++ else if (encoder == shared->encoder_analog) { ++ D_ASSUME( D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_ANALOGUE_CONFIG ) ); ++ ++ snprintf( description->name, sizeof (description->name), ++ "STMfbdev Analogue slave" ); ++ ++ /* caps */ ++ description->caps |= DSECAPS_OUT_SIGNALS | DSECAPS_CONNECTORS; ++ description->all_connectors |= DSOC_COMPONENT; ++ description->out_signals = DSOS_RGB | DSOS_YCBCR; ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_SDTV_ENCODING )) { ++ description->all_connectors |= DSOC_SCART | DSOC_YC | DSOC_CVBS; ++ description->out_signals |= DSOS_CVBS | DSOS_YC; ++ } ++ ++ /* current config */ ++ D_FLAGS_SET( config->flags, DSECONF_OUT_SIGNALS | DSECONF_CONNECTORS ); ++ D_FLAGS_SET( config->out_connectors, DSOC_COMPONENT ); ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_SDTV_ENCODING )) ++ config->out_connectors |= DSOC_SCART | DSOC_YC | DSOC_CVBS; ++ ++ D_FLAGS_SET( config->out_signals, DSOS_NONE ); ++ if (D_FLAGS_IS_SET( oc->analogue_config, STMFBIO_OUTPUT_ANALOGUE_RGB )) ++ D_FLAGS_SET( config->out_signals, DSOS_RGB ); ++ if (D_FLAGS_IS_SET( oc->analogue_config, STMFBIO_OUTPUT_ANALOGUE_YPrPb )) ++ D_FLAGS_SET( config->out_signals, DSOS_YCBCR ); ++ if (D_FLAGS_IS_SET( oc->analogue_config, STMFBIO_OUTPUT_ANALOGUE_YC )) ++ D_FLAGS_SET( config->out_signals, DSOS_YC ); ++ if (D_FLAGS_IS_SET( oc->analogue_config, STMFBIO_OUTPUT_ANALOGUE_CVBS )) ++ D_FLAGS_SET( config->out_signals, DSOS_CVBS ); ++ } ++ else if (encoder == shared->encoder_hdmi) { ++ D_ASSUME( D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_HDMI_CONFIG ) ); ++ ++ snprintf( description->name, sizeof (description->name), ++ "STMfbdev HDMI slave" ); ++ ++ /* caps */ ++ description->caps |= DSECAPS_OUT_SIGNALS | DSECAPS_CONNECTORS; ++ description->all_connectors |= DSOC_HDMI; ++ description->out_signals |= DSOS_HDMI | DSOS_RGB | DSOS_YCBCR; ++ ++ /* current config */ ++ D_FLAGS_SET( config->flags, DSECONF_OUT_SIGNALS | DSECONF_CONNECTORS ); ++ D_FLAGS_SET( config->out_connectors, DSOC_HDMI ); ++ ++ if (D_FLAGS_IS_SET( oc->hdmi_config, STMFBIO_OUTPUT_HDMI_DISABLED )) ++ D_FLAGS_SET( config->out_signals, DSOS_NONE ); ++ else { ++ D_FLAGS_SET( config->out_signals, DSOS_HDMI ); ++ /* A bit of bending the interface to specify the HDMI ++ colourspace */ ++ if (D_FLAGS_IS_SET( oc->hdmi_config, STMFBIO_OUTPUT_HDMI_YUV )) ++ D_FLAGS_SET( config->out_signals, DSOS_YCBCR ); ++ else ++ D_FLAGS_SET( config->out_signals, DSOS_RGB ); ++ } ++ } ++ else if (encoder == shared->encoder_dvo) { ++ D_ASSUME( D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_DVO_CONFIG ) ); ++ ++ snprintf( description->name, sizeof (description->name), ++ "STMfbdev DVO slave" ); ++ ++ /* caps */ ++ description->caps |= DSECAPS_OUT_SIGNALS | DSECAPS_CONNECTORS; ++ description->all_connectors |= DSOC_656; ++ description->out_signals |= DSOS_656; ++ ++ /* current config */ ++ D_FLAGS_SET( config->flags, DSECONF_OUT_SIGNALS | DSECONF_CONNECTORS ); ++ D_FLAGS_SET( config->out_connectors, DSOC_656 ); ++ ++ if (D_FLAGS_IS_SET( oc->dvo_config, STMFBIO_OUTPUT_DVO_DISABLED )) ++ D_FLAGS_SET( config->out_signals, DSOS_NONE ); ++ else { ++ D_FLAGS_SET( config->out_signals, DSOS_656 ); ++ /* A bit of bending the interface to specify the DVO ++ colourspace */ ++ switch( oc->dvo_config & STMFBIO_OUTPUT_DVO_MODE_MASK ) { ++ case STMFBIO_OUTPUT_DVO_YUV_444_16BIT: ++ case STMFBIO_OUTPUT_DVO_YUV_444_24BIT: ++ case STMFBIO_OUTPUT_DVO_YUV_422_16BIT: ++ D_FLAGS_SET( config->out_signals, DSOS_YCBCR ); ++ break; ++ ++ case STMFBIO_OUTPUT_DVO_ITUR656: ++ case STMFBIO_OUTPUT_DVO_RGB_24BIT: ++ D_FLAGS_SET( config->out_signals, DSOS_RGB ); ++ ++ default: ++ /* should not be reached */ ++ break; ++ } ++ } ++ } ++ else if (encoder == shared->encoder_sd) { ++ D_ASSUME( D_FLAGS_IS_SET( oc->caps, STMFBIO_OUTPUT_CAPS_SDTV_ENCODING )); ++ D_ASSUME( D_FLAGS_IS_SET( oc->caps, STMFBIO_OUTPUT_CAPS_PSI_MASK )); ++ ++ /* the outputs and signals are handled by the main analogue ++ DFBScreenEncoder, this one just adds in the colour ++ adjustments. */ ++ snprintf( description->name, sizeof (description->name), ++ "STMfbdev DENC slave" ); ++ ++ /* caps and current config in one go */ ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_BRIGHTNESS )) { ++ /* caps */ ++ description->caps |= DSECAPS_BRIGHTNESS; ++ /* current config */ ++ config->flags |= DSECONF_ADJUSTMENT; ++ config->adjustment.flags |= DCAF_BRIGHTNESS; ++ config->adjustment.brightness = ((u16) oc->brightness) << 8; ++ D_DEBUG_AT( STMfbdev_Screen, " => brightness: %u\n", ++ config->adjustment.brightness ); ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_CONTRAST )) { ++ /* caps */ ++ description->caps |= DSECAPS_CONTRAST; ++ /* current config */ ++ config->flags |= DSECONF_ADJUSTMENT; ++ config->adjustment.flags |= DCAF_CONTRAST; ++ config->adjustment.contrast = ((u16) oc->contrast) << 8; ++ D_DEBUG_AT( STMfbdev_Screen, " => contrast: %u\n", ++ config->adjustment.contrast ); ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_SATURATION )) { ++ /* caps */ ++ description->caps |= DSECAPS_SATURATION; ++ /* current config */ ++ config->flags |= DSECONF_ADJUSTMENT; ++ config->adjustment.flags |= DCAF_SATURATION; ++ config->adjustment.saturation = ((u16) oc->saturation) << 8; ++ D_DEBUG_AT( STMfbdev_Screen, " => saturation: %u\n", ++ config->adjustment.saturation ); ++ } ++ if (D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_HUE )) { ++ /* caps */ ++ description->caps |= DSECAPS_HUE; ++ /* current config */ ++ config->flags |= DSECONF_ADJUSTMENT; ++ config->adjustment.flags |= DCAF_HUE; ++ config->adjustment.hue = ((u16) oc->hue) << 8; ++ D_DEBUG_AT( STMfbdev_Screen, " => hue: %u\n", ++ config->adjustment.hue ); ++ } ++ } ++ else ++ return DFB_BUG; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevDoEncoderConfig( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ int encoder, ++ const DFBScreenEncoderConfig *config, ++ DFBScreenEncoderConfigFlags *failed, ++ bool test ) ++{ ++ const STMfbdev * const stmfbdev = driver_data; ++ STMfbdevScreenSharedData * const shared = screen_data; ++ u32 hw_caps; ++ struct stmfbio_output_configuration cfg; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p %d ) test: %c\n", ++ __FUNCTION__, screen, encoder, test ? 'y' : 'n' ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ ++ cfg.outputid = STMFBIO_OUTPUTID_MAIN; ++ if ( ioctl( stmfbdev->fd, STMFBIO_GET_OUTPUT_CONFIG, &cfg ) < 0 ) { ++ *failed = config->flags; ++ return DFB_IO; ++ } ++ ++ hw_caps = shared->orig_config.caps; ++ cfg.activate = test ? STMFBIO_ACTIVATE_TEST : STMFBIO_ACTIVATE_IMMEDIATE; ++ cfg.caps = 0; ++ ++ if (encoder == shared->encoder_main) { ++ const STMfbdevScreenVideoMode *mode; ++ ++ *failed |= config->flags & ~(DSECONF_SCANMODE | DSECONF_FREQUENCY ++ | DSECONF_RESOLUTION ++ | DSECONF_TV_STANDARD); ++ if (!*failed) { ++ mode = stmfbdevScreen_find_mode( shared, config ); ++ if (!mode ++ || stmfbdevScreen_set_mode( stmfbdev, shared, mode, ++ test ) != DFB_OK) { ++ *failed |= (DSECONF_SCANMODE | DSECONF_FREQUENCY ++ | DSECONF_RESOLUTION); ++ *failed |= (config->flags & DSECONF_TV_STANDARD); ++ } ++ } ++ } ++ else if (encoder == shared->encoder_analog) { ++ D_DEBUG_AT( STMfbdev_Screen, " -> analogue 0x%.2x (outsig %x flg %x conn %x)\n", ++ config->out_signals, config->out_signals, ++ config->flags, config->out_connectors ); ++ ++ *failed |= config->flags & ~(DSECONF_CONNECTORS ++ | DSECONF_OUT_SIGNALS); ++ if (config->flags & DSECONF_OUT_SIGNALS ++ && D_FLAGS_INVALID( config->out_signals, (DSOS_RGB ++ | DSOS_YCBCR ++ | DSOS_CVBS ++ | DSOS_YC) )) ++ *failed |= DSECONF_OUT_SIGNALS; ++ /* it's not allowed to change connectors, they merely serve an ++ informational purpose. */ ++ if (config->flags & DSECONF_CONNECTORS ++ && config->out_connectors != (DSOC_SCART | DSOC_YC ++ | DSOC_CVBS | DSOC_COMPONENT) ) ++ *failed |= DSECONF_CONNECTORS; ++ ++ /* you can change the signals coming out of the connectors, ++ though. */ ++ if (!*failed) { ++ if (!D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_ANALOGUE_CONFIG )) { ++ if (config->out_signals != DSOS_NONE) ++ *failed |= DSECONF_OUT_SIGNALS; ++ } ++ else { ++ cfg.caps = STMFBIO_OUTPUT_CAPS_ANALOGUE_CONFIG; ++ ++ D_FLAGS_CLEAR( cfg.analogue_config, ++ STMFBIO_OUTPUT_ANALOGUE_MASK ); ++ ++ if (!config->out_signals) ++ D_DEBUG_AT( STMfbdev_Screen, " +> off\n" ); ++ if (D_FLAGS_IS_SET( config->out_signals, DSOS_RGB )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> RGB\n" ); ++ cfg.analogue_config |= STMFBIO_OUTPUT_ANALOGUE_RGB; ++ } ++ if (D_FLAGS_IS_SET( config->out_signals, DSOS_YCBCR )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> YPrPb\n" ); ++ cfg.analogue_config |= STMFBIO_OUTPUT_ANALOGUE_YPrPb; ++ } ++ if (D_FLAGS_IS_SET( config->out_signals, DSOS_CVBS )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> CVBS\n" ); ++ cfg.analogue_config |= STMFBIO_OUTPUT_ANALOGUE_CVBS; ++ } ++ if (D_FLAGS_IS_SET( config->out_signals, DSOS_YC )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> Y/C\n" ); ++ cfg.analogue_config |= STMFBIO_OUTPUT_ANALOGUE_YC; ++ } ++ } ++ } ++ } ++ else if (encoder == shared->encoder_hdmi) { ++ D_DEBUG_AT( STMfbdev_Screen, " -> HDMI 0x%.2x\n", ++ config->out_signals ); ++ ++ *failed |= config->flags & ~(DSECONF_CONNECTORS ++ | DSECONF_OUT_SIGNALS); ++ if (config->flags & DSECONF_OUT_SIGNALS ++ /* only HDMI + (RGB or YCbCr) supported */ ++ && (D_FLAGS_INVALID( config->out_signals, (DSOS_HDMI ++ | DSOS_RGB ++ | DSOS_YCBCR) ) ++ /* can't have both, RGB and YCbCr */ ++ || D_FLAGS_ARE_SET( config->out_signals, (DSOS_RGB ++ | DSOS_YCBCR) ))) ++ *failed |= DSECONF_OUT_SIGNALS; ++ /* it's not allowed to change connectors, they merely serve an ++ informational purpose. */ ++ if (config->flags & DSECONF_CONNECTORS ++ && config->out_connectors != DSOC_HDMI) ++ *failed |= DSECONF_CONNECTORS; ++ ++ if (!*failed) { ++ if (!D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_HDMI_CONFIG )) { ++ if (config->out_signals != DSOS_NONE) ++ *failed |= DSECONF_OUT_SIGNALS; ++ } ++ else { ++ cfg.caps = STMFBIO_OUTPUT_CAPS_HDMI_CONFIG; ++ ++ D_FLAGS_CLEAR( cfg.hdmi_config, ++ (STMFBIO_OUTPUT_HDMI_DISABLED ++ | STMFBIO_OUTPUT_HDMI_YUV ++ | STMFBIO_OUTPUT_HDMI_422) ); ++ ++ if (D_FLAGS_IS_SET( config->out_signals, DSOS_HDMI )) { ++ cfg.hdmi_config |= STMFBIO_OUTPUT_HDMI_ENABLED; ++ /* HDMI colourspace is RGB by default, only change it ++ when YCBCR is specified. */ ++ if (D_FLAGS_IS_SET( config->out_signals, DSOS_YCBCR )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> YCbCr\n" ); ++ cfg.hdmi_config |= STMFBIO_OUTPUT_HDMI_YUV; ++ cfg.hdmi_config |= STMFBIO_OUTPUT_HDMI_444; ++ } ++ else if (D_FLAGS_IS_SET( config->out_signals, ++ DSOS_RGB )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> RGB\n" ); ++ cfg.hdmi_config |= STMFBIO_OUTPUT_HDMI_RGB; ++ } ++ else { ++ D_DEBUG_AT( STMfbdev_Screen, " +> unknown\n" ); ++ *failed |= DSECONF_OUT_SIGNALS; ++ } ++ } ++ else if (config->out_signals == DSOS_NONE) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> off\n" ); ++ cfg.hdmi_config |= STMFBIO_OUTPUT_HDMI_DISABLED; ++ } ++ } ++ } ++ } ++ else if (encoder == shared->encoder_dvo) { ++ D_DEBUG_AT( STMfbdev_Screen, " -> DVO 0x%.2x\n", ++ config->out_signals ); ++ ++ *failed |= config->flags & ~(DSECONF_CONNECTORS ++ | DSECONF_OUT_SIGNALS); ++ if (config->flags & DSECONF_OUT_SIGNALS ++ && (D_FLAGS_INVALID( config->out_signals, (DSOS_656 ++ | DSOS_RGB ++ | DSOS_YCBCR) ) ++ /* can't have both, RGB and YCbCr */ ++ || D_FLAGS_ARE_SET( config->out_signals, (DSOS_RGB ++ | DSOS_YCBCR) ))) ++ *failed |= DSECONF_OUT_SIGNALS; ++ /* it's not allowed to change connectors, they merely serve an ++ informational purpose. */ ++ if (config->flags & DSECONF_CONNECTORS ++ && config->out_connectors != DSOC_656) ++ *failed |= DSECONF_CONNECTORS; ++ ++ if (!*failed) { ++ if (!D_FLAGS_IS_SET( hw_caps, STMFBIO_OUTPUT_CAPS_DVO_CONFIG )) { ++ if (config->out_signals != DSOS_NONE) ++ *failed |= DSECONF_OUT_SIGNALS; ++ } ++ else { ++ cfg.caps = STMFBIO_OUTPUT_CAPS_DVO_CONFIG; ++ ++ D_FLAGS_CLEAR( cfg.dvo_config, ++ (STMFBIO_OUTPUT_DVO_DISABLED ++ | STMFBIO_OUTPUT_DVO_MODE_MASK) ); ++ ++ if (D_FLAGS_IS_SET( config->out_signals, DSOS_656 )) { ++ cfg.dvo_config |= STMFBIO_OUTPUT_DVO_ENABLED; ++ /* DVO colourspace is YUV444 16bit by default, only ++ change it when RGB is specified. */ ++ if (D_FLAGS_IS_SET( config->out_signals, DSOS_RGB )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> RGB 24bit\n" ); ++ cfg.dvo_config |= STMFBIO_OUTPUT_DVO_RGB_24BIT; ++ } ++ else if (D_FLAGS_IS_SET( config->out_signals, ++ DSOS_YCBCR )) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> YCbCr 444 16bit\n" ); ++ cfg.dvo_config |= STMFBIO_OUTPUT_DVO_YUV_444_16BIT; ++ } ++ else { ++ D_DEBUG_AT( STMfbdev_Screen, " +> unknown\n" ); ++ *failed |= DSECONF_OUT_SIGNALS; ++ } ++ } ++ else if (config->out_signals == DSOS_NONE) { ++ D_DEBUG_AT( STMfbdev_Screen, " +> off\n" ); ++ cfg.dvo_config |= STMFBIO_OUTPUT_DVO_DISABLED; ++ } ++ } ++ } ++ } ++ else if (encoder == shared->encoder_sd) { ++ D_DEBUG_AT( STMfbdev_Screen, " -> DENC adjustment 0x%.2x\n", ++ config->out_signals ); ++ ++ *failed = config->flags & ~DSECONF_ADJUSTMENT; ++ if (!*failed) { ++ if (config->adjustment.flags & DCAF_BRIGHTNESS) { ++ cfg.caps |= STMFBIO_OUTPUT_CAPS_BRIGHTNESS; ++ cfg.brightness = config->adjustment.brightness >> 8; ++ } ++ if (config->adjustment.flags & DCAF_SATURATION) { ++ cfg.caps |= STMFBIO_OUTPUT_CAPS_SATURATION; ++ cfg.saturation = config->adjustment.saturation >> 8; ++ } ++ if (config->adjustment.flags & DCAF_CONTRAST) { ++ cfg.caps |= STMFBIO_OUTPUT_CAPS_CONTRAST; ++ cfg.contrast = config->adjustment.contrast >> 8; ++ } ++ if (config->adjustment.flags & DCAF_HUE) { ++ cfg.caps |= STMFBIO_OUTPUT_CAPS_HUE; ++ cfg.hue = config->adjustment.hue >> 8; ++ } ++ } ++ } ++ else ++ return DFB_BUG; ++ ++ if (!*failed && cfg.caps ++ && ioctl( stmfbdev->fd, STMFBIO_SET_OUTPUT_CONFIG, &cfg ) < 0) ++ *failed = config->flags; ++ ++ if (*failed) { ++ D_DEBUG_AT( STMfbdev_Screen, " => FAILED (0x%.8x)\n", *failed ); ++ return DFB_INVARG; ++ } ++ ++ D_DEBUG_AT( STMfbdev_Screen, " => SUCCESS\n" ); ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevTestEncoderConfig( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ int encoder, ++ const DFBScreenEncoderConfig *config, ++ DFBScreenEncoderConfigFlags *failed ) ++{ ++ return stmfbdevDoEncoderConfig( screen, driver_data, screen_data, ++ encoder, config, failed, true ); ++} ++ ++static DFBResult ++stmfbdevSetEncoderConfig( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ int encoder, ++ const DFBScreenEncoderConfig *config ) ++{ ++ DFBScreenEncoderConfigFlags dummy = DSECONF_NONE; ++ return stmfbdevDoEncoderConfig( screen, driver_data, screen_data, ++ encoder, config, &dummy, false ); ++} ++ ++/* remaining screen things */ ++static DFBResult ++stmfbdevWaitVSync( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data ) ++{ ++ STMfbdev * const stmfbdev = driver_data; ++ STMfbdevScreenSharedData * const shared = screen_data; ++ static const int zero = 0; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p )\n", __FUNCTION__, screen ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ (void) shared; ++ ++ if (dfb_config->pollvsync_none) ++ return DFB_OK; ++ ++ if (ioctl( stmfbdev->fd, FBIO_WAITFORVSYNC, &zero )) ++ return errno2result( errno ); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevGetVSyncCount( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ unsigned long *ret_count ) ++{ ++ STMfbdev * const stmfbdev = driver_data; ++ STMfbdevScreenSharedData * const shared = screen_data; ++ struct fb_vblank vblank; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p )\n", __FUNCTION__, screen ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ D_ASSERT( ret_count != NULL ); ++ (void) shared; ++ ++ if (!ret_count) ++ return DFB_INVARG; ++ ++ if (ioctl( stmfbdev->fd, FBIOGET_VBLANK, &vblank )) ++ return errno2result( errno ); ++ ++ if (!D_FLAGS_IS_SET( vblank.flags, FB_VBLANK_HAVE_COUNT )) ++ return DFB_UNSUPPORTED; ++ ++ *ret_count = vblank.count; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevGetScreenSize( CoreScreen *screen, ++ void *driver_data, ++ void *screen_data, ++ int *ret_width, ++ int *ret_height ) ++{ ++ STMfbdev * const stmfbdev = driver_data; ++ STMfbdevScreenSharedData * const shared = screen_data; ++ ++ D_DEBUG_AT( STMfbdev_Screen, "%s( %p )\n", __FUNCTION__, screen ); ++ ++ D_MAGIC_ASSERT( stmfbdev, STMfbdev ); ++ D_MAGIC_ASSERT( shared, STMfbdevScreenSharedData ); ++ ++ (void) stmfbdev; ++ ++ switch (shared->mode.resolution) { ++ case DSOR_1920_1080: ++ *ret_width = 1920; *ret_height = 1080; break; ++ case DSOR_1280_720: ++ *ret_width = 1280; *ret_height = 720; break; ++ case DSOR_1440_540: ++ *ret_width = 1440; *ret_height = 540; break; ++ case DSOR_960_540: ++ *ret_width = 960; *ret_height = 540; break; ++ case DSOR_720_576: ++ *ret_width = 720; *ret_height = 576; break; ++ case DSOR_720_480: ++ *ret_width = 720; *ret_height = 480; break; ++ case DSOR_640_480: ++ *ret_width = 640; *ret_height = 480; break; ++ ++ default: ++ return DFB_FAILURE; ++ } ++ ++ return DFB_OK; ++} ++ ++ ++ScreenFuncs _g_stmfbdevScreenFuncs = { ++ .ScreenDataSize = stmfbdevScreenDataSize, ++ ++ .InitScreen = stmfbdevInitScreen, ++ .ShutdownScreen = stmfbdevShutdownScreen, ++ ++ .InitMixer = stmfbdevInitMixer, ++ .TestMixerConfig = stmfbdevTestMixerConfig, ++ .SetMixerConfig = stmfbdevSetMixerConfig, ++ ++ .InitEncoder = stmfbdevInitEncoder, ++ .TestEncoderConfig = stmfbdevTestEncoderConfig, ++ .SetEncoderConfig = stmfbdevSetEncoderConfig, ++ ++ .WaitVSync = stmfbdevWaitVSync, ++ .GetVSyncCount = stmfbdevGetVSyncCount, ++ .GetScreenSize = stmfbdevGetScreenSize, ++}; +diff --git a/systems/stmfbdev/stmfbdev_surface_pool.c b/systems/stmfbdev/stmfbdev_surface_pool.c +new file mode 100644 +index 0000000..e5bc936 +--- /dev/null ++++ b/systems/stmfbdev/stmfbdev_surface_pool.c +@@ -0,0 +1,622 @@ ++/* ++ (c) Copyright 2010-2012 STMicroelectronics (R&D) Ltd. ++ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by André Draszik . ++ ++ Based on work by Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++ ++#include "stmfbdev.h" ++#include "surfacemanager.h" ++ ++D_DEBUG_DOMAIN (STMfbdev_Surfaces_Main, "STMfbdev/Surfaces/Main", "STMfb Surface Pool"); ++D_DEBUG_DOMAIN (STMfbdev_SurfLock_Main, "STMfbdev/SurfLock/Main", "STMfb Surface Pool Locks"); ++ ++/****************************************************************************/ ++ ++typedef struct ++{ ++ int magic; ++ ++ SurfaceManager *manager; ++ ++ unsigned long physical; ++} STMfbdevPoolData; ++ ++typedef struct ++{ ++ int magic; ++ ++ CoreDFB *core; ++ void *mem; ++} STMfbdevPoolLocalData; ++ ++typedef struct ++{ ++ int magic; ++ ++ Chunk *chunk; ++} STMfbdevPoolAllocationData; ++ ++/****************************************************************************/ ++ ++static int ++stmfbdevPoolDataSize (void) ++{ ++ return sizeof (STMfbdevPoolData); ++} ++ ++static int ++stmfbdevPoolLocalDataSize (void) ++{ ++ return sizeof (STMfbdevPoolLocalData); ++} ++ ++static int ++stmfbdevAllocationDataSize (void) ++{ ++ return sizeof (STMfbdevPoolAllocationData); ++} ++ ++static DFBResult ++stmfbdevLeavePool (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local) ++{ ++ STMfbdevPoolData * const data = pool_data; ++ STMfbdevPoolLocalData * const local = pool_local; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, "%s()\n", __func__); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_MAGIC_ASSERT (local, STMfbdevPoolLocalData); ++ ++ D_UNUSED_P (data); ++ ++ local->mem = NULL; ++ ++ D_MAGIC_CLEAR (local); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevJoinPool (CoreDFB *core, ++ CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ void *system_data) ++{ ++ STMfbdevPoolData * const data = pool_data; ++ STMfbdevPoolLocalData * const local = pool_local; ++ STMfbdev * const stmfbdev = dfb_system_data (); ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, "%s()\n", __func__); ++ ++ D_ASSERT (core != NULL); ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_ASSERT (local != NULL); ++ D_MAGIC_ASSERT (stmfbdev, STMfbdev); ++ ++ D_UNUSED_P (data); ++ ++ D_MAGIC_SET (local, STMfbdevPoolLocalData); ++ ++ local->mem = stmfbdev->framebuffer_base; ++ D_ASSERT (local->mem != NULL); ++ ++ local->core = core; ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevDestroyPool (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local) ++{ ++ STMfbdevPoolData * const data = pool_data; ++ STMfbdevPoolLocalData * const local = pool_local; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, "%s()\n", __func__); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_MAGIC_ASSERT (local, STMfbdevPoolLocalData); ++ ++ D_UNUSED_P (local); ++ ++ stmfbdevLeavePool (pool, pool_data, pool_local); ++ ++ dfb_surfacemanager_destroy (data->manager); ++ ++ D_MAGIC_CLEAR (data); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevInitPool (CoreDFB *core, ++ CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ void *system_data, ++ CoreSurfacePoolDescription *ret_desc) ++{ ++ DFBResult ret; ++ STMfbdevPoolData * const data = pool_data; ++ STMfbdevPoolLocalData * const local = pool_local; ++ STMfbdev * const stmfbdev = dfb_system_data (); ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, "%s()\n", __func__); ++ ++ D_ASSERT (core != NULL); ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_ASSERT (data != NULL); ++ D_ASSERT (local != NULL); ++ D_ASSERT (ret_desc != NULL); ++ ++ D_UNUSED_P (local); ++ ++ D_MAGIC_ASSERT (stmfbdev, STMfbdev); ++ D_MAGIC_ASSERT (stmfbdev->shared, STMfbdevSharedData); ++ ++ D_MAGIC_SET (data, STMfbdevPoolData); ++ ++ snprintf (ret_desc->name, ++ DFB_SURFACE_POOL_DESC_NAME_LENGTH, "STMfb Memory"); ++ ++ ret = dfb_surfacemanager_create (core, stmfbdev->shared->fix.smem_len, ++ &data->manager); ++ ++ if (ret) ++ return ret; ++ ++ data->physical = stmfbdev->shared->fix.smem_start; ++ ++ ret_desc->caps = CSPCAPS_PHYSICAL | CSPCAPS_VIRTUAL; ++ ret_desc->access[CSAID_CPU] = CSAF_READ | CSAF_WRITE | CSAF_SHARED; ++ ret_desc->access[CSAID_GPU] = CSAF_READ | CSAF_WRITE | CSAF_SHARED; ++ ret_desc->types = (0 ++ | CSTF_LAYER ++ | CSTF_WINDOW | CSTF_CURSOR | CSTF_FONT ++ | CSTF_SHARED | CSTF_EXTERNAL ++ | CSTF_BUFFEROBJECT ++ ); ++ ret_desc->priority = CSPP_DEFAULT; ++ ret_desc->size = stmfbdev->shared->fix.smem_len; ++ ++ /* other accelerators */ ++ ret_desc->access[CSAID_ACCEL0] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL1] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL2] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL3] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL4] = CSAF_READ | CSAF_WRITE; ++ ret_desc->access[CSAID_ACCEL5] = CSAF_READ | CSAF_WRITE; ++ ++ /* For hardware layers */ ++ ret_desc->access[CSAID_LAYER0] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER1] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER2] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER3] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER4] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER5] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER6] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER7] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER8] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER9] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER10] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER11] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER12] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER13] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER14] = CSAF_READ; ++ ret_desc->access[CSAID_LAYER15] = CSAF_READ; ++ ++ ret = stmfbdevJoinPool (core, pool, pool_data, pool_local, system_data); ++ if (ret) ++ { ++ stmfbdevDestroyPool (pool, pool_data, pool_local); ++ return ret; ++ } ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevTestConfig (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceBuffer *buffer, ++ const CoreSurfaceConfig *config) ++{ ++ CoreSurface *surface; ++ STMfbdevPoolData * const data = pool_data; ++ STMfbdevPoolLocalData * const local = pool_local; ++ DFBResult ret; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, "%s (%p)\n", __func__, buffer); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_MAGIC_ASSERT (local, STMfbdevPoolLocalData); ++ D_MAGIC_ASSERT (buffer, CoreSurfaceBuffer); ++ D_ASSERT (config != NULL); ++ ++ surface = buffer->surface; ++ D_MAGIC_ASSERT (surface, CoreSurface); ++ D_UNUSED_P( surface ); ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, " -> buffer/type/id %p/0x%x/%lu\n", ++ buffer, surface->type, surface->resource_id); ++ ++ ret = dfb_surfacemanager_allocate (local->core, data->manager, ++ buffer, NULL, NULL, true); ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, " -> %s\n", DirectFBErrorString (ret)); ++ ++ return ret; ++} ++ ++static DFBResult ++stmfbdevAllocateBuffer (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceBuffer *buffer, ++ CoreSurfaceAllocation *allocation, ++ void *alloc_data) ++{ ++ CoreSurface *surface; ++ STMfbdevPoolData * const data = pool_data; ++ STMfbdevPoolLocalData * const local = pool_local; ++ STMfbdevPoolAllocationData * const alloc = alloc_data; ++ DFBResult ret; ++ Chunk *chunk; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, "%s (%p)\n", __func__, buffer); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_MAGIC_ASSERT (local, STMfbdevPoolLocalData); ++ D_MAGIC_ASSERT (buffer, CoreSurfaceBuffer); ++ D_MAGIC_ASSERT (allocation, CoreSurfaceAllocation); ++ ++ surface = buffer->surface; ++ D_MAGIC_ASSERT (surface, CoreSurface); ++ D_UNUSED_P( surface ); ++ ++ ret = dfb_surfacemanager_allocate (local->core, data->manager, buffer, ++ allocation, &chunk, true); ++ if (ret) ++ return ret; ++ ++ D_MAGIC_ASSERT (chunk, Chunk); ++ ++ alloc->chunk = chunk; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, ++ " -> offset 0x%.8x (%u), format: %s, pitch %d, size %d\n", ++ chunk->offset, chunk->offset, ++ dfb_pixelformat_name (buffer->format), chunk->pitch, ++ chunk->length); ++ ++ allocation->size = chunk->length; ++ allocation->offset = chunk->offset; ++ ++#if STGFX_DRIVER == 2 ++ if (unlikely (buffer->format == DSPF_RGB32)) ++ { ++ /* for RGB32, we need to set the alpha to 0xff */ ++ /* FIXME: check if we can hook into dfb_gfx_clear() or ++ dfb_surface_clear_buffers() */ ++ STGFX2DriverData * const stdrv = dfb_gfxcard_get_driver_data (); ++ STGFX2DeviceData * const stdev = dfb_gfxcard_get_device_data (); ++ DFBRectangle rect = { .x = 0, .y = 0, ++ .w = buffer->surface->config.size.w, ++ .h = buffer->surface->config.size.h }; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, " -> rgb32 allocation!\n"); ++ ++ D_WARN ("STMfbdev/Surfaces/Main: RGB32 support is experimental and slow!"); ++ ++ dfb_gfxcard_lock (GDLF_WAIT); ++ _bdisp_aq_RGB32_init (stdrv, stdev, ++ data->physical + chunk->offset, chunk->pitch, ++ &rect); ++ dfb_gfxcard_unlock (); ++ } ++#endif ++ ++ D_MAGIC_SET (alloc, STMfbdevPoolAllocationData); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevDeallocateBuffer (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceBuffer *buffer, ++ CoreSurfaceAllocation *allocation, ++ void *alloc_data) ++{ ++ STMfbdevPoolData * const data = pool_data; ++ const STMfbdevPoolLocalData * const local = pool_local; ++ STMfbdevPoolAllocationData * const alloc = alloc_data; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, "%s (%p)\n", __func__, buffer); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_MAGIC_ASSERT (local, STMfbdevPoolLocalData); ++ D_MAGIC_ASSERT (allocation, CoreSurfaceAllocation); ++ D_MAGIC_ASSERT (alloc, STMfbdevPoolAllocationData); ++ ++ (void) local; ++ ++ D_ASSERT (alloc->chunk != NULL); ++ dfb_surfacemanager_deallocate (data->manager, alloc->chunk); ++ ++ D_MAGIC_CLEAR (alloc); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevMuckOut (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceBuffer *buffer ) ++{ ++ STMfbdevPoolData * const data = pool_data; ++ const STMfbdevPoolLocalData * const local = pool_local; ++ ++ D_DEBUG_AT (STMfbdev_Surfaces_Main, "%s (%p)\n", __func__, buffer); ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_MAGIC_ASSERT (local, STMfbdevPoolLocalData); ++ D_MAGIC_ASSERT (buffer, CoreSurfaceBuffer); ++ ++ return dfb_surfacemanager_displace (local->core, data->manager, buffer); ++} ++ ++#if D_DEBUG_ENABLED ++static char * ++_accessor_str (CoreSurfaceAccessorID accessor) ++{ ++ char *str = malloc (220); ++ int pos = 0; ++ ++ pos += sprintf (str + pos, "%.8x -> ", accessor); ++ if (accessor == CSAID_NONE) ++ pos += sprintf (str + pos, "NONE"); ++ else if (accessor == CSAID_CPU) ++ pos += sprintf (str + pos, "CPU"); ++ else if (accessor == CSAID_GPU) ++ pos += sprintf (str + pos, "GPU"); ++ else if (accessor == CSAID_ACCEL0) ++ pos += sprintf (str + pos, "ACCEL0"); ++ else if (accessor == CSAID_ACCEL1) ++ pos += sprintf (str + pos, "ACCEL1"); ++ else if (accessor == CSAID_ACCEL2) ++ pos += sprintf (str + pos, "ACCEL2"); ++ else if (accessor == CSAID_ACCEL3) ++ pos += sprintf (str + pos, "ACCEL3"); ++ else if (accessor == CSAID_ACCEL4) ++ pos += sprintf (str + pos, "ACCEL4"); ++ else if (accessor == CSAID_ACCEL5) ++ pos += sprintf (str + pos, "ACCEL5"); ++ else if (accessor == CSAID_LAYER0) ++ pos += sprintf (str + pos, "LAYER0"); ++ else if (accessor == CSAID_LAYER1) ++ pos += sprintf (str + pos, "LAYER1"); ++ else if (accessor == CSAID_LAYER2) ++ pos += sprintf (str + pos, "LAYER2"); ++ else if (accessor == CSAID_LAYER3) ++ pos += sprintf (str + pos, "LAYER3"); ++ else if (accessor == CSAID_LAYER4) ++ pos += sprintf (str + pos, "LAYER4"); ++ else if (accessor == CSAID_LAYER5) ++ pos += sprintf (str + pos, "LAYER5"); ++ else if (accessor == CSAID_LAYER6) ++ pos += sprintf (str + pos, "LAYER6"); ++ else if (accessor == CSAID_LAYER7) ++ pos += sprintf (str + pos, "LAYER7"); ++ else ++ pos += sprintf (str + pos, "UNKNOWN"); ++ ++ return str; ++} ++ ++static char * ++_access_str (CoreSurfaceAccessFlags access) ++{ ++ char *str = malloc (220); ++ int pos = 0; ++ ++ pos += sprintf (str + pos, "%.8x ->", access); ++ if (access == CSAF_NONE) ++ pos += sprintf (str + pos, " NONE"); ++ else ++ { ++ if (access & CSAF_READ) ++ pos += sprintf (str + pos, " READ"); ++ if (access & CSAF_WRITE) ++ pos += sprintf (str + pos, " WRITE"); ++ if (access & CSAF_SHARED) ++ pos += sprintf (str + pos, " SHARED"); ++ } ++ ++ return str; ++} ++#endif ++ ++static DFBResult ++stmfbdevLock (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceAllocation *allocation, ++ void *alloc_data, ++ CoreSurfaceBufferLock *lock) ++{ ++ const STMfbdevPoolData * const data = pool_data; ++ const STMfbdevPoolLocalData * const local = pool_local; ++ const STMfbdevPoolAllocationData * const alloc = alloc_data; ++ const Chunk *chunk; ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_MAGIC_ASSERT (local, STMfbdevPoolLocalData); ++ D_MAGIC_ASSERT (allocation, CoreSurfaceAllocation); ++ D_MAGIC_ASSERT (alloc, STMfbdevPoolAllocationData); ++ D_MAGIC_ASSERT (lock, CoreSurfaceBufferLock); ++ ++ D_DEBUG_AT (STMfbdev_SurfLock_Main, "%s (%p)\n", __func__, lock->buffer); ++ ++ D_MAGIC_ASSERT (alloc->chunk, Chunk); ++ chunk = alloc->chunk; ++ ++#if D_DEBUG_ENABLED ++ { ++ /* heavy performance hit */ ++ char *accessor = _accessor_str (lock->accessor); ++ char *access = _access_str (lock->access); ++ D_DEBUG_AT (STMfbdev_SurfLock_Main, " -> by %s for %s\n", ++ accessor, access); ++ free (access); ++ free (accessor); ++ } ++#endif ++ ++ lock->pitch = chunk->pitch; ++ lock->offset = chunk->offset; ++ lock->addr = local->mem + chunk->offset; ++ lock->phys = data->physical + chunk->offset; ++ ++ D_DEBUG_AT (STMfbdev_SurfLock_Main, ++ " -> offset 0x%.8lx (%lu), pitch %d, addr %p, phys 0x%.8lx\n", ++ lock->offset, lock->offset, lock->pitch, lock->addr, lock->phys); ++ ++ return DFB_OK; ++} ++ ++static DFBResult ++stmfbdevUnlock (CoreSurfacePool *pool, ++ void *pool_data, ++ void *pool_local, ++ CoreSurfaceAllocation *allocation, ++ void *alloc_data, ++ CoreSurfaceBufferLock *lock) ++{ ++ const STMfbdevPoolData * const data = pool_data; ++ const STMfbdevPoolLocalData * const local = pool_local; ++ const STMfbdevPoolAllocationData * const alloc = alloc_data; ++ ++ D_MAGIC_ASSERT (pool, CoreSurfacePool); ++ D_MAGIC_ASSERT (data, STMfbdevPoolData); ++ D_MAGIC_ASSERT (local, STMfbdevPoolLocalData); ++ D_MAGIC_ASSERT (allocation, CoreSurfaceAllocation); ++ D_MAGIC_ASSERT (alloc, STMfbdevPoolAllocationData); ++ D_MAGIC_ASSERT (lock, CoreSurfaceBufferLock); ++ ++ D_DEBUG_AT (STMfbdev_SurfLock_Main, "%s (%p)\n", __func__, lock->buffer); ++ ++ D_UNUSED_P (data); ++ D_UNUSED_P (local); ++ D_UNUSED_P (alloc); ++ ++#if D_DEBUG_ENABLED ++ { ++ /* heavy performance hit */ ++ char *accessor = _accessor_str (lock->accessor); ++ char *access = _access_str (lock->access); ++ D_DEBUG_AT (STMfbdev_SurfLock_Main, " -> by %s for %s\n", ++ accessor, access); ++ free (access); ++ free (accessor); ++ } ++#endif ++ ++#if STGFX_DRIVER == 2 ++ if (unlikely (lock->buffer->format == DSPF_RGB32 ++ && lock->accessor != CSAID_GPU ++ && lock->access & CSAF_WRITE)) ++ { ++ /* if a non-GPU accessor did a write access to an RGB32 surface, we ++ should make sure the alpha is forced to 0xff, as the BDisp doesn't ++ support this format natively */ ++ STGFX2DriverData * const stdrv = dfb_gfxcard_get_driver_data (); ++ STGFX2DeviceData * const stdev = dfb_gfxcard_get_device_data (); ++ DFBRectangle rect = { .x = 0, .y = 0, ++ .w = lock->buffer->surface->config.size.w, ++ .h = lock->buffer->surface->config.size.h }; ++ ++ D_DEBUG_AT (STMfbdev_SurfLock_Main, " -> rgb32 write release!\n"); ++ dfb_gfxcard_lock (GDLF_WAIT); ++ _bdisp_aq_RGB32_fixup (stdrv, stdev, ++ lock->phys, lock->pitch, ++ &rect); ++ dfb_gfxcard_unlock (); ++ } ++#endif ++ ++ return DFB_OK; ++} ++ ++const SurfacePoolFuncs _g_stmfbdevSurfacePoolFuncs = { ++ .PoolDataSize = stmfbdevPoolDataSize, ++ .PoolLocalDataSize = stmfbdevPoolLocalDataSize, ++ .AllocationDataSize = stmfbdevAllocationDataSize, ++ ++ .InitPool = stmfbdevInitPool, ++ .JoinPool = stmfbdevJoinPool, ++ .DestroyPool = stmfbdevDestroyPool, ++ .LeavePool = stmfbdevLeavePool, ++ ++ .TestConfig = stmfbdevTestConfig, ++ .AllocateBuffer = stmfbdevAllocateBuffer, ++ .DeallocateBuffer = stmfbdevDeallocateBuffer, ++ ++ .MuckOut = stmfbdevMuckOut, ++ ++ .Lock = stmfbdevLock, ++ .Unlock = stmfbdevUnlock, ++}; +diff --git a/systems/stmfbdev/surfacemanager.c b/systems/stmfbdev/surfacemanager.c +new file mode 100644 +index 0000000..f23b573 +--- /dev/null ++++ b/systems/stmfbdev/surfacemanager.c +@@ -0,0 +1,585 @@ ++/* ++ (c) Copyright 2010 STMicroelectronics (R&D) Ltd. ++ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by André Draszik . ++ ++ Based on work by Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++ ++#include "surfacemanager.h" ++ ++D_DEBUG_DOMAIN( SurfMan, "SurfaceManager", "DirectFB Surface Manager" ); ++ ++ ++static Chunk *split_chunk ( SurfaceManager *manager, ++ Chunk *chunk, ++ int length ); ++ ++static Chunk *free_chunk ( SurfaceManager *manager, ++ Chunk *chunk ); ++ ++static Chunk *occupy_chunk( SurfaceManager *manager, ++ Chunk *chunk, ++ CoreSurfaceAllocation *allocation, ++ int length, ++ int pitch ); ++ ++ ++DFBResult ++dfb_surfacemanager_create( CoreDFB *core, ++ unsigned int length, ++ SurfaceManager **ret_manager ) ++{ ++ FusionSHMPoolShared *pool; ++ SurfaceManager *manager; ++ Chunk *chunk; ++ ++ D_DEBUG_AT( SurfMan, "%s( %p, %d )\n", __FUNCTION__, core, length ); ++ ++ D_ASSERT( core != NULL ); ++ D_ASSERT( ret_manager != NULL ); ++ ++ pool = dfb_core_shmpool( core ); ++ ++ manager = SHCALLOC( pool, 1, sizeof(SurfaceManager) ); ++ if (!manager) ++ return D_OOSHM(); ++ ++ chunk = SHCALLOC( pool, 1, sizeof(Chunk) ); ++ if (!chunk) { ++ D_OOSHM(); ++ SHFREE( pool, manager ); ++ return DFB_NOSHAREDMEMORY; ++ } ++ ++ manager->shmpool = pool; ++ manager->chunks = chunk; ++ manager->offset = 0; ++ manager->length = length; ++ manager->avail = manager->length - manager->offset; ++ ++ D_MAGIC_SET( manager, SurfaceManager ); ++ ++ chunk->offset = manager->offset; ++ chunk->length = manager->avail; ++ ++ D_MAGIC_SET( chunk, Chunk ); ++ ++ D_DEBUG_AT( SurfMan, " -> %p\n", manager ); ++ ++ *ret_manager = manager; ++ ++ return DFB_OK; ++} ++ ++void ++dfb_surfacemanager_destroy( SurfaceManager *manager ) ++{ ++ Chunk *chunk; ++ void *next; ++ ++ D_DEBUG_AT( SurfMan, "%s( %p )\n", __FUNCTION__, manager ); ++ ++ D_MAGIC_ASSERT( manager, SurfaceManager ); ++ ++ /* Deallocate all video chunks. */ ++ chunk = manager->chunks; ++ while (chunk) { ++ next = chunk->next; ++ ++ D_MAGIC_CLEAR( chunk ); ++ ++ SHFREE( manager->shmpool, chunk ); ++ ++ chunk = next; ++ } ++ ++ D_MAGIC_CLEAR( manager ); ++ ++ /* Deallocate manager struct. */ ++ SHFREE( manager->shmpool, manager ); ++} ++ ++/** public functions NOT locking the surfacemanger theirself, ++ to be called between lock/unlock of surfacemanager **/ ++ ++DFBResult dfb_surfacemanager_allocate( CoreDFB *core, ++ SurfaceManager *manager, ++ CoreSurfaceBuffer *buffer, ++ CoreSurfaceAllocation *allocation, ++ Chunk **ret_chunk, ++ bool need_workaround ) ++{ ++ int pitch; ++ int length; ++ Chunk *c; ++ CoreGraphicsDevice *device; ++ ++ Chunk *best_free = NULL; ++ ++ D_MAGIC_ASSERT( manager, SurfaceManager ); ++ D_MAGIC_ASSERT( buffer, CoreSurfaceBuffer ); ++ D_MAGIC_ASSERT( buffer->surface, CoreSurface ); ++ ++ if (ret_chunk) ++ D_MAGIC_ASSERT( allocation, CoreSurfaceAllocation ); ++ else ++ D_ASSUME( allocation == NULL ); ++ ++ D_DEBUG_AT( SurfMan, "%s( %p ) <- %dx%d %s\n", __FUNCTION__, buffer, ++ buffer->surface->config.size.w, buffer->surface->config.size.h, ++ dfb_pixelformat_name( buffer->surface->config.format ) ); ++ ++ if (manager->suspended) ++ return DFB_SUSPENDED; ++ ++ /* FIXME: Only one global device at the moment. */ ++ device = dfb_core_get_part( core, DFCP_GRAPHICS ); ++ D_ASSERT( device != NULL ); ++ ++ dfb_gfxcard_calc_buffer_size( device, buffer, &pitch, &length ); ++ ++ D_DEBUG_AT( SurfMan, " -> pitch %d, length %d, available %d\n", pitch, length, manager->avail ); ++ ++ if (manager->avail < length) ++ return DFB_TEMPUNAVAIL; ++ ++ /* examine chunks */ ++ c = manager->chunks; ++ D_MAGIC_ASSERT( c, Chunk ); ++ ++ /* FIXME: Work around creation happening before graphics driver ++ initialization. */ ++ if (need_workaround && !c->next) { ++ int length = dfb_gfxcard_memory_length(); ++ ++ if (c->length != length - manager->offset) { ++ D_WARN( "workaround due to reserved video memory" ); ++ ++ manager->length = length; ++ manager->avail = length - manager->offset; ++ ++ c->length = length - manager->offset; ++ } ++ } ++ ++ while (c) { ++ D_MAGIC_ASSERT( c, Chunk ); ++ ++ if (!c->buffer && c->length >= length) { ++ /* NULL means check only. */ ++ if (!ret_chunk) ++ return DFB_OK; ++ ++ /* found a nice place to chill */ ++ if (!best_free || best_free->length > c->length) ++ /* first found or better one? */ ++ best_free = c; ++ ++ if (c->length == length) ++ break; ++ } ++ ++ c = c->next; ++ } ++ ++ /* if we found a place */ ++ if (best_free) { ++ D_DEBUG_AT( SurfMan, " -> found free (%d)\n", best_free->length ); ++ ++ /* NULL means check only. */ ++ if (ret_chunk) ++ *ret_chunk = occupy_chunk( manager, best_free, allocation, length, pitch ); ++ ++ return DFB_OK; ++ } ++ ++ D_DEBUG_AT( SurfMan, " -> failed (%d/%d avail)\n", manager->avail, manager->length ); ++ ++ /* no luck */ ++ return DFB_NOVIDEOMEMORY; ++} ++ ++DFBResult dfb_surfacemanager_displace( CoreDFB *core, ++ SurfaceManager *manager, ++ CoreSurfaceBuffer *buffer ) ++{ ++ int length; ++ Chunk *multi_start = NULL; ++ int multi_size = 0; ++ int multi_tsize = 0; ++ int multi_count = 0; ++ Chunk *bestm_start = NULL; ++ int bestm_count = 0; ++ int bestm_size = 0; ++ int min_toleration; ++ Chunk *chunk; ++ CoreGraphicsDevice *device; ++ CoreSurfaceAllocation *smallest = NULL; ++ ++ D_MAGIC_ASSERT( manager, SurfaceManager ); ++ D_MAGIC_ASSERT( buffer, CoreSurfaceBuffer ); ++ D_MAGIC_ASSERT( buffer->surface, CoreSurface ); ++ ++ D_DEBUG_AT( SurfMan, "%s( %p ) <- %dx%d %s\n", __FUNCTION__, buffer, ++ buffer->surface->config.size.w, buffer->surface->config.size.h, ++ dfb_pixelformat_name( buffer->surface->config.format ) ); ++ ++ /* FIXME: Only one global device at the moment. */ ++ device = dfb_core_get_part( core, DFCP_GRAPHICS ); ++ D_ASSERT( device != NULL ); ++ D_UNUSED_P( device ); ++ ++ dfb_gfxcard_calc_buffer_size( dfb_core_get_part( core, DFCP_GRAPHICS ), buffer, NULL, &length ); ++ ++ min_toleration = manager->min_toleration/8 + 2; ++ ++ D_DEBUG_AT( SurfMan, " -> %7d required, min toleration %d\n", length, min_toleration ); ++ ++ chunk = manager->chunks; ++ while (chunk) { ++ CoreSurfaceAllocation *allocation; ++ ++ D_MAGIC_ASSERT( chunk, Chunk ); ++ ++ allocation = chunk->allocation; ++ if (allocation) { ++ CoreSurfaceBuffer *other; ++ int size, locks; ++ ++ D_MAGIC_ASSERT( allocation, CoreSurfaceAllocation ); ++ D_ASSERT( chunk->buffer == allocation->buffer ); ++ D_ASSERT( chunk->length >= allocation->size ); ++ ++ other = allocation->buffer; ++ D_MAGIC_ASSERT( other, CoreSurfaceBuffer ); ++ ++ locks = dfb_surface_allocation_locks( allocation ); ++ if (locks) { ++ D_DEBUG_AT( SurfMan, " ++ %7d locked %dx\n", allocation->size, locks ); ++ goto next_reset; ++ } ++ ++ if (other->policy > buffer->policy) { ++ D_DEBUG_AT( SurfMan, " ++ %7d policy %d > %d\n", allocation->size, other->policy, buffer->policy ); ++ goto next_reset; ++ } ++ ++ if (other->policy == CSP_VIDEOONLY) { ++ D_DEBUG_AT( SurfMan, " ++ %7d policy videoonly\n", allocation->size ); ++ goto next_reset; ++ } ++ ++ chunk->tolerations++; ++ if (chunk->tolerations > 0xff) ++ chunk->tolerations = 0xff; ++ ++ if (other->policy == buffer->policy && chunk->tolerations < min_toleration) { ++ D_DEBUG_AT( SurfMan, " ++ %7d tolerations %d/%d\n", ++ allocation->size, chunk->tolerations, min_toleration ); ++ goto next_reset; ++ } ++ ++ size = allocation->size; ++ ++ if (chunk->prev && !chunk->prev->allocation) ++ size += chunk->prev->length; ++ ++ if (chunk->next && !chunk->next->allocation) ++ size += chunk->next->length; ++ ++ if (size >= length) { ++ if (!smallest || smallest->size > allocation->size) { ++ D_DEBUG_AT( SurfMan, " => %7d [%d] < %d, tolerations %d\n", ++ allocation->size, size, smallest ? smallest->size : 0, chunk->tolerations ); ++ ++ smallest = allocation; ++ } ++ else ++ D_DEBUG_AT( SurfMan, " -> %7d [%d] > %d\n", allocation->size, size, smallest->size ); ++ } ++ else ++ D_DEBUG_AT( SurfMan, " -> %7d [%d]\n", allocation->size, size ); ++ } ++ else ++ D_DEBUG_AT( SurfMan, " - %7d free\n", chunk->length ); ++ ++ ++ if (!smallest) { ++ if (!multi_start) { ++ multi_start = chunk; ++ multi_tsize = chunk->length; ++ multi_size = chunk->allocation ? chunk->length : 0; ++ multi_count = chunk->allocation ? 1 : 0; ++ } ++ else { ++ multi_tsize += chunk->length; ++ multi_size += chunk->allocation ? chunk->length : 0; ++ multi_count += chunk->allocation ? 1 : 0; ++ ++ while (multi_tsize >= length && multi_count > 1) { ++ if (!bestm_start || bestm_size > multi_size * multi_count / bestm_count) { ++ D_DEBUG_AT( SurfMan, " =====> %7d, %7d %2d used [%7d %2d]\n", ++ multi_tsize, multi_size, multi_count, bestm_size, bestm_count ); ++ ++ bestm_size = multi_size; ++ bestm_start = multi_start; ++ bestm_count = multi_count; ++ } ++ else ++ D_DEBUG_AT( SurfMan, " -----> %7d, %7d %2d used\n", ++ multi_tsize, multi_size, multi_count ); ++ ++ if (multi_count <= 2) ++ break; ++ ++ if (!multi_start->allocation) { ++ multi_tsize -= multi_start->length; ++ multi_start = multi_start->next; ++ } ++ ++ D_ASSUME( multi_start->allocation != NULL ); ++ ++ multi_tsize -= multi_start->length; ++ multi_size -= multi_start->allocation ? multi_start->length : 0; ++ multi_count -= multi_start->allocation ? 1 : 0; ++ multi_start = multi_start->next; ++ } ++ } ++ } ++ ++ chunk = chunk->next; ++ ++ continue; ++ ++ ++next_reset: ++ multi_start = NULL; ++ ++ chunk = chunk->next; ++ } ++ ++ if (smallest) { ++ D_MAGIC_ASSERT( smallest, CoreSurfaceAllocation ); ++ D_MAGIC_ASSERT( smallest->buffer, CoreSurfaceBuffer ); ++ ++ smallest->flags |= CSALF_MUCKOUT; ++ ++ D_DEBUG_AT( SurfMan, " -> offset %lu, size %d\n", smallest->offset, smallest->size ); ++ ++ return DFB_OK; ++ } ++ ++ if (bestm_start) { ++ chunk = bestm_start; ++ ++ while (bestm_count) { ++ CoreSurfaceAllocation *allocation = chunk->allocation; ++ ++ if (allocation) { ++ D_MAGIC_ASSERT( allocation, CoreSurfaceAllocation ); ++ D_MAGIC_ASSERT( allocation->buffer, CoreSurfaceBuffer ); ++ ++ allocation->flags |= CSALF_MUCKOUT; ++ ++ bestm_count--; ++ } ++ ++ D_DEBUG_AT( SurfMan, " ---> offset %d, length %d\n", chunk->offset, chunk->length ); ++ ++ chunk = chunk->next; ++ } ++ ++ return DFB_OK; ++ } ++ ++ return DFB_NOVIDEOMEMORY; ++} ++ ++DFBResult dfb_surfacemanager_deallocate( SurfaceManager *manager, ++ Chunk *chunk ) ++{ ++ CoreSurfaceBuffer *buffer; ++ ++ D_MAGIC_ASSERT( manager, SurfaceManager ); ++ D_MAGIC_ASSERT( chunk, Chunk ); ++ ++ buffer = chunk->buffer; ++ D_MAGIC_ASSERT( buffer, CoreSurfaceBuffer ); ++ D_MAGIC_ASSERT( buffer->surface, CoreSurface ); ++ D_UNUSED_P( buffer ); ++ ++ D_DEBUG_AT( SurfMan, "%s( %p ) <- %dx%d %s\n", __FUNCTION__, buffer, ++ buffer->surface->config.size.w, buffer->surface->config.size.h, ++ dfb_pixelformat_name( buffer->surface->config.format ) ); ++ ++ free_chunk( manager, chunk ); ++ ++ return DFB_OK; ++} ++ ++/** internal functions NOT locking the surfacemanager **/ ++ ++static Chunk * ++split_chunk( SurfaceManager *manager, Chunk *c, int length ) ++{ ++ Chunk *newchunk; ++ ++ D_MAGIC_ASSERT( c, Chunk ); ++ ++ if (c->length == length) /* does not need be splitted */ ++ return c; ++ ++ newchunk = (Chunk*) SHCALLOC( manager->shmpool, 1, sizeof(Chunk) ); ++ if (!newchunk) { ++ D_OOSHM(); ++ return NULL; ++ } ++ ++ /* calculate offsets and lengths of resulting chunks */ ++ newchunk->offset = c->offset + c->length - length; ++ newchunk->length = length; ++ c->length -= newchunk->length; ++ ++ /* insert newchunk after chunk c */ ++ newchunk->prev = c; ++ newchunk->next = c->next; ++ if (c->next) ++ c->next->prev = newchunk; ++ c->next = newchunk; ++ ++ D_MAGIC_SET( newchunk, Chunk ); ++ ++ return newchunk; ++} ++ ++static Chunk * ++free_chunk( SurfaceManager *manager, Chunk *chunk ) ++{ ++ D_MAGIC_ASSERT( manager, SurfaceManager ); ++ D_MAGIC_ASSERT( chunk, Chunk ); ++ ++ if (!chunk->buffer) { ++ D_BUG( "freeing free chunk" ); ++ return chunk; ++ } ++ ++ D_DEBUG_AT( SurfMan, "%s( %d bytes at offset %d )\n", __FUNCTION__, chunk->length, chunk->offset ); ++ ++ if (chunk->buffer->policy == CSP_VIDEOONLY) ++ manager->avail += chunk->length; ++ ++ D_DEBUG_AT( SurfMan, " -> freed %d, available %d\n", chunk->length, manager->avail ); ++ ++ chunk->allocation = NULL; ++ chunk->buffer = NULL; ++ ++ manager->min_toleration--; ++ ++ if (chunk->prev && !chunk->prev->buffer) { ++ Chunk *prev = chunk->prev; ++ ++ //D_DEBUG_AT( SurfMan, " -> merging with previous chunk at %d\n", prev->offset ); ++ ++ prev->length += chunk->length; ++ ++ prev->next = chunk->next; ++ if (prev->next) ++ prev->next->prev = prev; ++ ++ //D_DEBUG_AT( SurfMan, " -> freeing %p (prev %p, next %p)\n", chunk, chunk->prev, chunk->next); ++ ++ D_MAGIC_CLEAR( chunk ); ++ ++ SHFREE( manager->shmpool, chunk ); ++ chunk = prev; ++ } ++ ++ if (chunk->next && !chunk->next->buffer) { ++ Chunk *next = chunk->next; ++ ++ //D_DEBUG_AT( SurfMan, " -> merging with next chunk at %d\n", next->offset ); ++ ++ chunk->length += next->length; ++ ++ chunk->next = next->next; ++ if (chunk->next) ++ chunk->next->prev = chunk; ++ ++ D_MAGIC_CLEAR( next ); ++ ++ SHFREE( manager->shmpool, next ); ++ } ++ ++ return chunk; ++} ++ ++static Chunk * ++occupy_chunk( SurfaceManager *manager, Chunk *chunk, CoreSurfaceAllocation *allocation, int length, int pitch ) ++{ ++ D_MAGIC_ASSERT( manager, SurfaceManager ); ++ D_MAGIC_ASSERT( chunk, Chunk ); ++ D_MAGIC_ASSERT( allocation, CoreSurfaceAllocation ); ++ D_MAGIC_ASSERT( allocation->buffer, CoreSurfaceBuffer ); ++ ++ if (allocation->buffer->policy == CSP_VIDEOONLY) ++ manager->avail -= length; ++ ++ chunk = split_chunk( manager, chunk, length ); ++ if (!chunk) ++ return NULL; ++ ++ D_DEBUG_AT( SurfMan, "%s( %d bytes at offset %d )\n", __FUNCTION__, chunk->length, chunk->offset ); ++ ++ D_DEBUG_AT( SurfMan, " -> occupied %d, available %d\n", chunk->length, manager->avail ); ++ ++ chunk->allocation = allocation; ++ chunk->buffer = allocation->buffer; ++ chunk->pitch = pitch; ++ ++ manager->min_toleration++; ++ ++ return chunk; ++} +diff --git a/systems/stmfbdev/surfacemanager.h b/systems/stmfbdev/surfacemanager.h +new file mode 100644 +index 0000000..43fe950 +--- /dev/null ++++ b/systems/stmfbdev/surfacemanager.h +@@ -0,0 +1,110 @@ ++/* ++ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#ifndef __SURFACEMANAGER_H__ ++#define __SURFACEMANAGER_H__ ++ ++#include ++ ++#include ++ ++typedef struct _SurfaceManager SurfaceManager; ++typedef struct _Chunk Chunk; ++ ++/* ++ * initially there is one big free chunk, ++ * chunks are splitted into a free and an occupied chunk if memory is allocated, ++ * two chunks are merged to one free chunk if memory is deallocated ++ */ ++struct _Chunk { ++ int magic; ++ ++ int offset; /* offset in memory, ++ is greater or equal to the heap offset */ ++ int length; /* length of this chunk in bytes */ ++ ++ int pitch; ++ ++ CoreSurfaceBuffer *buffer; /* pointer to surface buffer occupying ++ this chunk, or NULL if chunk is free */ ++ CoreSurfaceAllocation *allocation; ++ ++ int tolerations; /* number of times this chunk was scanned ++ occupied, resetted in assure_video */ ++ ++ Chunk *prev; ++ Chunk *next; ++}; ++ ++struct _SurfaceManager { ++ int magic; ++ ++ FusionSHMPoolShared *shmpool; ++ ++ Chunk *chunks; ++ ++ int offset; ++ int length; /* length of the heap in bytes */ ++ int avail; /* amount of available memory in bytes */ ++ ++ int min_toleration; ++ ++ bool suspended; ++}; ++ ++ ++DFBResult dfb_surfacemanager_create ( CoreDFB *core, ++ unsigned int length, ++ SurfaceManager **ret_manager ); ++ ++void dfb_surfacemanager_destroy( SurfaceManager *manager ); ++ ++/* ++ * finds and allocates one for the surface or fails, ++ * after success the video health is CSH_RESTORE. ++ * NOTE: this does not notify the listeners ++ */ ++DFBResult dfb_surfacemanager_allocate( CoreDFB *core, ++ SurfaceManager *manager, ++ CoreSurfaceBuffer *buffer, ++ CoreSurfaceAllocation *allocation, ++ Chunk **ret_chunk, ++ bool need_workaround ); ++ ++DFBResult dfb_surfacemanager_displace( CoreDFB *core, ++ SurfaceManager *manager, ++ CoreSurfaceBuffer *buffer ); ++ ++/* ++ * sets the video health to CSH_INVALID frees the chunk and ++ * notifies the listeners ++ */ ++DFBResult dfb_surfacemanager_deallocate( SurfaceManager *manager, ++ Chunk *chunk ); ++ ++#endif +diff --git a/systems/stmfbdev/vt.c b/systems/stmfbdev/vt.c +new file mode 100644 +index 0000000..78236a0 +--- /dev/null ++++ b/systems/stmfbdev/vt.c +@@ -0,0 +1,681 @@ ++/* ++ (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) ++ (c) Copyright 2000-2004 Convergence (integrated media) GmbH ++ ++ All rights reserved. ++ ++ Written by Denis Oliver Kropp , ++ Andreas Hundt , ++ Sven Neumann , ++ Ville Syrjälä and ++ Claudio Ciccani . ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++ ++#include /* Needs to be included before dfb_types.h */ ++ ++#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 "stmfbdev.h" ++#include "fb.h" ++#include "vt.h" ++ ++D_DEBUG_DOMAIN( VT, "STMfbdev/VT", "STMfbdev System Module VT Handling" ); ++ ++/* ++ * FIXME: the following looks like a bad hack. ++ * ++ * SIGUNUSED is no longer unused, but is defined for backwards compatibility. ++ * sparc, mips and alpha signal.h however do not define SIGUNUSED. ++ */ ++ ++#ifdef SIGUNUSED ++ #define SIG_SWITCH_FROM (SIGUNUSED + 10) ++ #define SIG_SWITCH_TO (SIGUNUSED + 11) ++#else ++ #define SIG_SWITCH_FROM (31 + 10) ++ #define SIG_SWITCH_TO (31 + 11) ++#endif ++ ++#ifndef SI_KERNEL ++/* glibc 2.1.x doesn't have this in /usr/include/bits/siginfo.h */ ++ #define SI_KERNEL 0x80 ++#endif ++ ++ ++extern STMfbdev *dfb_stmfbdev; ++ ++static VirtualTerminal *dfb_vt = NULL; ++ ++static DFBResult vt_init_switching( void ); ++static int vt_get_fb( int vt ); ++static void vt_set_fb( int vt, int fb ); ++static void *vt_thread( DirectThread *thread, void *arg ); ++ ++static void vt_start_flushing( void ); ++static void vt_stop_flushing( void ); ++static void *vt_flush_thread( DirectThread *thread, void *arg ); ++ ++DFBResult ++dfb_vt_initialize( void ) ++{ ++ DFBResult ret; ++ struct vt_stat vs; ++ ++ D_DEBUG_AT( VT, "%s()\n", __FUNCTION__ ); ++ ++ dfb_vt = D_CALLOC( 1, sizeof(VirtualTerminal) ); ++ if (!dfb_vt) ++ return D_OOM(); ++ ++ setsid(); ++ dfb_vt->fd0 = open( "/dev/tty0", O_RDONLY | O_NOCTTY ); ++ if (dfb_vt->fd0 < 0) { ++ if (errno == ENOENT) { ++ dfb_vt->fd0 = open( "/dev/vc/0", O_RDONLY | O_NOCTTY ); ++ if (dfb_vt->fd0 < 0) { ++ if (errno == ENOENT) { ++ D_PERROR( "DirectFB/core/vt: Couldn't open " ++ "neither `/dev/tty0' nor `/dev/vc/0'!\n" ); ++ } ++ else { ++ D_PERROR( "DirectFB/core/vt: " ++ "Error opening `/dev/vc/0'!\n" ); ++ } ++ ++ D_FREE( dfb_vt ); ++ dfb_vt = NULL; ++ ++ return DFB_INIT; ++ } ++ } ++ else { ++ D_PERROR( "DirectFB/core/vt: Error opening `/dev/tty0'!\n"); ++ ++ D_FREE( dfb_vt ); ++ dfb_vt = NULL; ++ ++ return DFB_INIT; ++ } ++ } ++ ++ if (ioctl( dfb_vt->fd0, VT_GETSTATE, &vs ) < 0) { ++ D_PERROR( "DirectFB/core/vt: VT_GETSTATE failed!\n" ); ++ close( dfb_vt->fd0 ); ++ D_FREE( dfb_vt ); ++ dfb_vt = NULL; ++ return DFB_INIT; ++ } ++ ++ dfb_vt->prev = vs.v_active; ++ ++ ++ if (!dfb_config->vt_switch) { ++ if (dfb_config->vt_num != -1) ++ dfb_vt->num = dfb_config->vt_num; ++ else ++ dfb_vt->num = dfb_vt->prev; ++ ++ /* move vt to framebuffer */ ++ dfb_vt->old_fb = vt_get_fb( dfb_vt->num ); ++ vt_set_fb( dfb_vt->num, -1 ); ++ } ++ else { ++ if (dfb_config->vt_num == -1) { ++ int n; ++ ++ n = ioctl( dfb_vt->fd0, VT_OPENQRY, &dfb_vt->num ); ++ if (n < 0 || dfb_vt->num == -1) { ++ D_PERROR( "DirectFB/core/vt: Cannot allocate VT!\n" ); ++ close( dfb_vt->fd0 ); ++ D_FREE( dfb_vt ); ++ dfb_vt = NULL; ++ return DFB_INIT; ++ } ++ } ++ else { ++ dfb_vt->num = dfb_config->vt_num; ++ } ++ ++ /* move vt to framebuffer */ ++ dfb_vt->old_fb = vt_get_fb( dfb_vt->num ); ++ vt_set_fb( dfb_vt->num, -1 ); ++ ++ /* switch to vt */ ++ while (ioctl( dfb_vt->fd0, VT_ACTIVATE, dfb_vt->num ) < 0) { ++ if (errno == EINTR) ++ continue; ++ D_PERROR( "DirectFB/core/vt: VT_ACTIVATE failed!\n" ); ++ close( dfb_vt->fd0 ); ++ D_FREE( dfb_vt ); ++ dfb_vt = NULL; ++ return DFB_INIT; ++ } ++ ++ while (ioctl( dfb_vt->fd0, VT_WAITACTIVE, dfb_vt->num ) < 0) { ++ if (errno == EINTR) ++ continue; ++ D_PERROR( "DirectFB/core/vt: VT_WAITACTIVE failed!\n" ); ++ close( dfb_vt->fd0 ); ++ D_FREE( dfb_vt ); ++ dfb_vt = NULL; ++ return DFB_INIT; ++ } ++ ++ usleep( 40000 ); ++ } ++ ++ ret = vt_init_switching(); ++ if (ret) { ++ if (dfb_config->vt_switch) { ++ D_DEBUG_AT( VT, " -> switching back...\n" ); ++ ioctl( dfb_vt->fd0, VT_ACTIVATE, dfb_vt->prev ); ++ ioctl( dfb_vt->fd0, VT_WAITACTIVE, dfb_vt->prev ); ++ D_DEBUG_AT( VT, " -> ...switched back\n" ); ++ ioctl( dfb_vt->fd0, VT_DISALLOCATE, dfb_vt->num ); ++ } ++ ++ close( dfb_vt->fd0 ); ++ D_FREE( dfb_vt ); ++ dfb_vt = NULL; ++ return ret; ++ } ++ ++ vt_start_flushing(); ++ ++ dfb_stmfbdev->vt = dfb_vt; ++ ++ return DFB_OK; ++} ++ ++DFBResult ++dfb_vt_join( void ) ++{ ++ D_DEBUG_AT( VT, "%s()\n", __FUNCTION__ ); ++ ++ dfb_vt_detach( true ); ++ ++ return DFB_OK; ++} ++ ++DFBResult ++dfb_vt_shutdown( bool emergency ) ++{ ++ int res; ++ const char cursoron_str[] = "\033[?0;0;0c"; ++ const char blankon_str[] = "\033[9;10]"; ++ ++ (void) res; ++ ++ D_DEBUG_AT( VT, "%s()\n", __FUNCTION__ ); ++ ++ if (!dfb_vt) ++ return DFB_OK; ++ ++ vt_stop_flushing(); ++ ++ if (dfb_config->vt_switching) { ++ if (ioctl( dfb_vt->fd, VT_SETMODE, &dfb_vt->vt_mode ) < 0) ++ D_PERROR( "DirectFB/fbdev/vt: Unable to restore VT mode!!!\n" ); ++ ++ sigaction( SIG_SWITCH_FROM, &dfb_vt->sig_usr1, NULL ); ++ sigaction( SIG_SWITCH_TO, &dfb_vt->sig_usr2, NULL ); ++ ++ direct_thread_cancel( dfb_vt->thread ); ++ direct_thread_join( dfb_vt->thread ); ++ direct_thread_destroy( dfb_vt->thread ); ++ ++ pthread_mutex_destroy( &dfb_vt->lock ); ++ pthread_cond_destroy( &dfb_vt->wait ); ++ } ++ ++ if (dfb_config->kd_graphics) { ++ if (ioctl( dfb_vt->fd, KDSETMODE, KD_TEXT ) < 0) ++ D_PERROR( "DirectFB/fbdev/vt: KD_TEXT failed!\n" ); ++ } ++ else { ++ res = write( dfb_vt->fd, blankon_str, sizeof(blankon_str) ); ++ } ++ res = write( dfb_vt->fd, cursoron_str, sizeof(cursoron_str) ); ++ ++ if (tcsetattr( dfb_vt->fd, TCSAFLUSH, &dfb_vt->old_ts ) < 0) ++ D_PERROR("DirectFB/fbdev/vt: tcsetattr for original values failed!\n"); ++ ++ if (ioctl( dfb_vt->fd, KDSKBMODE, K_XLATE ) < 0) ++ D_PERROR( "DirectFB/fbdev/vt: K_XLATE failed!\n" ); ++ ++ if (dfb_config->vt_switch) { ++ D_DEBUG_AT( VT, " -> switching back...\n" ); ++ ++ if (ioctl( dfb_vt->fd0, VT_ACTIVATE, dfb_vt->prev ) < 0) ++ D_PERROR( "DirectFB/core/vt: VT_ACTIVATE" ); ++ ++ if (ioctl( dfb_vt->fd0, VT_WAITACTIVE, dfb_vt->prev ) < 0) ++ D_PERROR( "DirectFB/core/vt: VT_WAITACTIVE" ); ++ ++ D_DEBUG_AT( VT, " -> switched back...\n" ); ++ ++ usleep( 40000 ); ++ ++ /* restore con2fbmap */ ++ vt_set_fb( dfb_vt->num, dfb_vt->old_fb ); ++ ++ if (close( dfb_vt->fd ) < 0) ++ D_PERROR( "DirectFB/core/vt: Unable to " ++ "close file descriptor of allocated VT!\n" ); ++ ++ if (ioctl( dfb_vt->fd0, VT_DISALLOCATE, dfb_vt->num ) < 0) ++ D_PERROR( "DirectFB/core/vt: Unable to disallocate VT!\n" ); ++ } ++ else { ++ /* restore con2fbmap */ ++ vt_set_fb( dfb_vt->num, dfb_vt->old_fb ); ++ ++ if (close( dfb_vt->fd ) < 0) ++ D_PERROR( "DirectFB/core/vt: Unable to " ++ "close file descriptor of current VT!\n" ); ++ } ++ ++ if (close( dfb_vt->fd0 ) < 0) ++ D_PERROR( "DirectFB/core/vt: Unable to " ++ "close file descriptor of tty0!\n" ); ++ ++ D_FREE( dfb_vt ); ++ dfb_vt = dfb_stmfbdev->vt = NULL; ++ ++ return DFB_OK; ++} ++ ++DFBResult ++dfb_vt_leave( bool emergency ) ++{ ++ D_DEBUG_AT( VT, "%s()\n", __FUNCTION__ ); ++ ++ return DFB_OK; ++} ++ ++DFBResult ++dfb_vt_detach( bool force ) ++{ ++ D_DEBUG_AT( VT, "%s()\n", __FUNCTION__ ); ++ ++ if (dfb_config->vt_switch || force) { ++ int fd; ++ struct vt_stat vt_state; ++ ++ fd = open( "/dev/tty", O_RDONLY | O_NOCTTY ); ++ if (fd < 0) { ++ if (errno == ENXIO) ++ return DFB_OK; ++ ++ D_PERROR( "DirectFB/VT: Opening /dev/tty failed!\n" ); ++ return errno2result( errno ); ++ } ++ ++ if (ioctl( fd, VT_GETSTATE, &vt_state )) { ++ close( fd ); ++ return DFB_OK; ++ } ++ ++ if (ioctl( fd, TIOCNOTTY )) { ++ D_PERROR( "DirectFB/VT: TIOCNOTTY on /dev/tty failed\n" ); ++ close( fd ); ++ return errno2result( errno ); ++ } ++ ++ close( fd ); ++ } ++ ++ return DFB_OK; ++} ++ ++bool ++dfb_vt_switch( int num ) ++{ ++ D_DEBUG_AT( VT, "%s( %d )\n", __FUNCTION__, num ); ++ ++ if (!dfb_config->vt_switching) ++ return false; ++ ++ D_DEBUG_AT( VT, " -> switching to vt %d...\n", num ); ++ ++ if (ioctl( dfb_vt->fd0, VT_ACTIVATE, num ) < 0) ++ D_PERROR( "DirectFB/fbdev/vt: VT_ACTIVATE failed\n" ); ++ ++ return true; ++} ++ ++static void * ++vt_thread( DirectThread *thread, void *arg ) ++{ ++ D_DEBUG_AT( VT, "%s( %p, %p )\n", __FUNCTION__, thread, arg ); ++ ++ pthread_mutex_lock( &dfb_vt->lock ); ++ ++ while (true) { ++ direct_thread_testcancel( thread ); ++ ++ D_DEBUG_AT( VT, "...%s (signal %d)\n", __FUNCTION__, dfb_vt->vt_sig); ++ ++ switch (dfb_vt->vt_sig) { ++ default: ++ D_BUG( "unexpected vt_sig" ); ++ /* fall through */ ++ ++ case -1: ++ pthread_cond_wait( &dfb_vt->wait, &dfb_vt->lock ); ++ continue; ++ ++ case SIG_SWITCH_FROM: ++ if (dfb_core_suspend( dfb_stmfbdev->core ) == DFB_OK) { ++ if (ioctl( dfb_vt->fd, VT_RELDISP, VT_ACKACQ ) < 0) ++ D_PERROR( "DirectFB/fbdev/vt: VT_RELDISP failed\n" ); ++ } ++ ++ break; ++ ++ case SIG_SWITCH_TO: ++ if (dfb_core_resume( dfb_stmfbdev->core ) == DFB_OK) { ++ if (ioctl( dfb_vt->fd, VT_RELDISP, VT_ACKACQ ) < 0) ++ D_PERROR( "DirectFB/fbdev/vt: VT_RELDISP failed\n" ); ++ ++ if (dfb_config->kd_graphics) { ++ if (ioctl( dfb_vt->fd, KDSETMODE, KD_GRAPHICS ) < 0) ++ D_PERROR( "DirectFB/fbdev/vt: KD_GRAPHICS failed!\n" ); ++ } ++ } ++ ++ break; ++ } ++ ++ dfb_vt->vt_sig = -1; ++ ++ pthread_cond_signal( &dfb_vt->wait ); ++ } ++ ++ return NULL; ++} ++ ++static void ++vt_switch_handler( int signum ) ++{ ++ D_DEBUG_AT( VT, "%s( %d )\n", __FUNCTION__, signum ); ++ ++ pthread_mutex_lock( &dfb_vt->lock ); ++ ++ while (dfb_vt->vt_sig != -1) ++ pthread_cond_wait( &dfb_vt->wait, &dfb_vt->lock ); ++ ++ dfb_vt->vt_sig = signum; ++ ++ pthread_cond_signal( &dfb_vt->wait ); ++ ++ pthread_mutex_unlock( &dfb_vt->lock ); ++} ++ ++static DFBResult ++vt_init_switching( void ) ++{ ++ struct termios ts; ++ const char cursoroff_str[] = "\033[?1;0;0c"; ++ const char blankoff_str[] = "\033[9;0]"; ++ char buf[32]; ++ ++ int res; ++ (void)res; ++ ++ D_DEBUG_AT( VT, "%s()\n", __FUNCTION__ ); ++ ++ /* FIXME: Opening the device should be moved out of this function. */ ++ ++ snprintf(buf, 32, "/dev/tty%d", dfb_vt->num); ++ dfb_vt->fd = open( buf, O_RDWR | O_NOCTTY ); ++ if (dfb_vt->fd < 0) { ++ if (errno == ENOENT) { ++ snprintf(buf, 32, "/dev/vc/%d", dfb_vt->num); ++ dfb_vt->fd = open( buf, O_RDWR | O_NOCTTY ); ++ if (dfb_vt->fd < 0) { ++ if (errno == ENOENT) { ++ D_PERROR( "DirectFB/core/vt: Couldn't open " ++ "neither `/dev/tty%d' nor `/dev/vc/%d'!\n", ++ dfb_vt->num, dfb_vt->num ); ++ } ++ else { ++ D_PERROR( "DirectFB/core/vt: " ++ "Error opening `%s'!\n", buf ); ++ } ++ ++ return errno2result( errno ); ++ } ++ } ++ else { ++ D_PERROR( "DirectFB/core/vt: Error opening `%s'!\n", buf ); ++ return errno2result( errno ); ++ } ++ } ++ ++ /* attach to the new TTY before doing anything like KDSETMODE with it, ++ otherwise we'd get access denied error: */ ++ ioctl( dfb_vt->fd, TIOCSCTTY, 0 ); ++ ++ if (ioctl( dfb_vt->fd, KDSKBMODE, K_MEDIUMRAW ) < 0) { ++ D_PERROR( "DirectFB/fbdev/vt: K_MEDIUMRAW failed!\n" ); ++ close( dfb_vt->fd ); ++ return DFB_INIT; ++ } ++ ++ if (tcgetattr( dfb_vt->fd, &dfb_vt->old_ts ) < 0) { ++ D_PERROR( "DirectFB/fbdev/vt: tcgetattr failed!\n" ); ++ ioctl( dfb_vt->fd, KDSKBMODE, K_XLATE ); ++ close( dfb_vt->fd ); ++ return DFB_INIT; ++ } ++ ts = dfb_vt->old_ts; ++ ts.c_cc[VTIME] = 0; ++ ts.c_cc[VMIN] = 1; ++ ts.c_lflag &= ~(ICANON|ECHO|ISIG); ++ ts.c_iflag = 0; ++ if (tcsetattr( dfb_vt->fd, TCSAFLUSH, &ts ) < 0) { ++ D_PERROR( "DirectFB/fbdev/vt: tcsetattr for new values failed!\n" ); ++ ioctl( dfb_vt->fd, KDSKBMODE, K_XLATE ); ++ close( dfb_vt->fd ); ++ return DFB_INIT; ++ } ++ ++ res = write( dfb_vt->fd, cursoroff_str, sizeof(cursoroff_str) ); ++ if (dfb_config->kd_graphics) { ++ if (ioctl( dfb_vt->fd, KDSETMODE, KD_GRAPHICS ) < 0) { ++ D_PERROR( "DirectFB/fbdev/vt: KD_GRAPHICS failed!\n" ); ++ tcsetattr( dfb_vt->fd, TCSAFLUSH, &dfb_vt->old_ts ); ++ ioctl( dfb_vt->fd, KDSKBMODE, K_XLATE ); ++ close( dfb_vt->fd ); ++ return DFB_INIT; ++ } ++ } ++ else { ++ res = write( dfb_vt->fd, blankoff_str, sizeof(blankoff_str) ); ++ } ++ ++ if (dfb_config->vt_switching) { ++ struct vt_mode vt; ++ struct sigaction sig_tty; ++ ++ memset( &sig_tty, 0, sizeof( sig_tty ) ); ++ sig_tty.sa_handler = vt_switch_handler; ++ sigfillset( &sig_tty.sa_mask ); ++ ++ if (sigaction( SIG_SWITCH_FROM, &sig_tty, &dfb_vt->sig_usr1 ) || ++ sigaction( SIG_SWITCH_TO, &sig_tty, &dfb_vt->sig_usr2 )) { ++ D_PERROR( "DirectFB/fbdev/vt: sigaction failed!\n" ); ++ tcsetattr( dfb_vt->fd, TCSAFLUSH, &dfb_vt->old_ts ); ++ ioctl( dfb_vt->fd, KDSKBMODE, K_XLATE ); ++ close( dfb_vt->fd ); ++ return DFB_INIT; ++ } ++ ++ ++ vt.mode = VT_PROCESS; ++ vt.waitv = 0; ++ vt.relsig = SIG_SWITCH_FROM; ++ vt.acqsig = SIG_SWITCH_TO; ++ ++ if (ioctl( dfb_vt->fd, VT_SETMODE, &vt ) < 0) { ++ D_PERROR( "DirectFB/fbdev/vt: VT_SETMODE failed!\n" ); ++ ++ sigaction( SIG_SWITCH_FROM, &dfb_vt->sig_usr1, NULL ); ++ sigaction( SIG_SWITCH_TO, &dfb_vt->sig_usr2, NULL ); ++ ++ tcsetattr( dfb_vt->fd, TCSAFLUSH, &dfb_vt->old_ts ); ++ ioctl( dfb_vt->fd, KDSKBMODE, K_XLATE ); ++ close( dfb_vt->fd ); ++ ++ return DFB_INIT; ++ } ++ ++ direct_util_recursive_pthread_mutex_init( &dfb_vt->lock ); ++ ++ pthread_cond_init( &dfb_vt->wait, NULL ); ++ ++ dfb_vt->vt_sig = -1; ++ ++ dfb_vt->thread = direct_thread_create( DTT_CRITICAL, vt_thread, NULL, "VT Switcher" ); ++ } ++ ++ return DFB_OK; ++} ++ ++static int ++vt_get_fb( int vt ) ++{ ++ struct fb_con2fbmap c2m; ++ ++ D_DEBUG_AT( VT, "%s( %d )\n", __FUNCTION__, vt ); ++ ++ c2m.console = vt; ++ ++ if (ioctl( dfb_stmfbdev->fd, FBIOGET_CON2FBMAP, &c2m )) { ++ D_PERROR( "DirectFB/FBDev/vt: " ++ "FBIOGET_CON2FBMAP failed!\n" ); ++ return 0; ++ } ++ ++ D_DEBUG_AT( VT, " -> %d\n", c2m.framebuffer ); ++ ++ return c2m.framebuffer; ++} ++ ++static void ++vt_set_fb( int vt, int fb ) ++{ ++ struct fb_con2fbmap c2m; ++ struct stat sbf; ++ ++ D_DEBUG_AT( VT, "%s( %d, %d )\n", __FUNCTION__, vt, fb ); ++ ++ if (fstat( dfb_stmfbdev->fd, &sbf )) { ++ D_PERROR( "DirectFB/FBDev/vt: Could not fstat fb device!\n" ); ++ return; ++ } ++ ++ if (fb >= 0) ++ c2m.framebuffer = fb; ++ else ++ c2m.framebuffer = (sbf.st_rdev & 0xFF) >> 5; ++ ++ c2m.console = vt; ++ ++ if (ioctl( dfb_stmfbdev->fd, FBIOPUT_CON2FBMAP, &c2m ) < 0) { ++ D_PERROR( "DirectFB/FBDev/vt: " ++ "FBIOPUT_CON2FBMAP failed!\n" ); ++ } ++} ++ ++static void ++vt_start_flushing( void ) ++{ ++ dfb_vt->flush = true; ++ dfb_vt->flush_thread = direct_thread_create( DTT_DEFAULT, vt_flush_thread, NULL, "VT Flusher" ); ++} ++ ++static void ++vt_stop_flushing( void ) ++{ ++ dfb_vt->flush = false; ++ direct_thread_cancel( dfb_vt->flush_thread ); ++ direct_thread_join( dfb_vt->flush_thread ); ++ direct_thread_destroy( dfb_vt->flush_thread ); ++ dfb_vt->flush_thread = NULL; ++} ++ ++/* ++ * If the vt buffer in not kept clean the kernel may stop sleeping. ++ */ ++static void * ++vt_flush_thread( DirectThread *thread, void *arg ) ++{ ++ D_DEBUG_AT( VT, "%s( %p, %p )\n", __FUNCTION__, thread, arg ); ++ ++ while (dfb_vt->flush) { ++ fd_set set; ++ int ret; ++ ++ FD_ZERO( &set ); ++ FD_SET( dfb_vt->fd, &set ); ++ ++ ret = select( dfb_vt->fd + 1, &set, NULL, NULL, NULL ); ++ ++ if (ret < 0 && errno == EINTR) ++ continue; ++ ++ if (ret < 0 || !dfb_vt->flush) ++ break; ++ ++ tcflush( dfb_vt->fd, TCIFLUSH ); ++ } ++ ++ return NULL; ++} +diff --git a/systems/stmfbdev/vt.h b/systems/stmfbdev/vt.h +new file mode 120000 +index 0000000..70958ae +--- /dev/null ++++ b/systems/stmfbdev/vt.h +@@ -0,0 +1 @@ ++../fbdev/vt.h +\ No newline at end of file +diff --git a/systems/x11/primary.c b/systems/x11/primary.c +index be07d70..622d19b 100644 +--- a/systems/x11/primary.c ++++ b/systems/x11/primary.c +@@ -691,7 +691,8 @@ static DFBResult + update_screen( DFBX11 *x11, const DFBRectangle *clip, CoreSurfaceBufferLock *lock, XWindow *xw ) + { + void *dst; +- void *src; ++ u8 *srces[3]; ++ int pitches[3]; + unsigned int offset = 0; + XImage *ximage; + CoreSurfaceAllocation *allocation; +@@ -799,23 +800,28 @@ update_screen( DFBX11 *x11, const DFBRectangle *clip, CoreSurfaceBufferLock *loc + } + + dst = xw->virtualscreen + rect.x * xw->bpp + (rect.y + offset) * ximage->bytes_per_line; +- src = lock->addr + DFB_BYTES_PER_LINE( allocation->config.format, rect.x ) + rect.y * lock->pitch; ++ dfb_surface_get_data_offsets( allocation->surface, lock->addr, lock->pitch, rect.x, rect.y, ++ 3, srces, pitches ); + + switch (xw->depth) { + case 32: +- dfb_convert_to_argb( allocation->config.format, src, lock->pitch, ++ dfb_convert_to_argb( allocation->config.format, ++ srces[0], pitches[0], ++ srces[1], pitches[1], srces[2], pitches[2], + allocation->config.size.h, dst, ximage->bytes_per_line, rect.w, rect.h ); + break; + + case 24: +- dfb_convert_to_rgb32( allocation->config.format, src, lock->pitch, ++ dfb_convert_to_rgb32( allocation->config.format, ++ srces[0], pitches[0], ++ srces[1], pitches[1], srces[2], pitches[2], + allocation->config.size.h, dst, ximage->bytes_per_line, rect.w, rect.h ); + break; + + case 16: + if (allocation->config.format == DSPF_LUT8) { + int width = rect.w; int height = rect.h; +- const u8 *src8 = src; ++ const u8 *src8 = srces[0]; + u16 *dst16 = dst; + CorePalette *palette = allocation->surface->palette;//FIXME + int x; +@@ -826,18 +832,22 @@ update_screen( DFBX11 *x11, const DFBRectangle *clip, CoreSurfaceBufferLock *loc + dst16[x] = PIXEL_RGB16( color.r, color.g, color.b ); + } + +- src8 += lock->pitch; ++ src8 += pitches[0]; + dst16 += ximage->bytes_per_line / 2; + } + } + else { +- dfb_convert_to_rgb16( allocation->config.format, src, lock->pitch, ++ dfb_convert_to_rgb16( allocation->config.format, ++ srces[0], pitches[0], ++ srces[1], pitches[1], srces[2], pitches[2], + allocation->config.size.h, dst, ximage->bytes_per_line, rect.w, rect.h ); + } + break; + + case 15: +- dfb_convert_to_rgb555( allocation->config.format, src, lock->pitch, ++ dfb_convert_to_rgb555( allocation->config.format, ++ srces[0], pitches[0], ++ srces[1], pitches[1], srces[2], pitches[2], + allocation->config.size.h, dst, ximage->bytes_per_line, rect.w, rect.h ); + break; + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 5f961c1..fcf3462 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -46,7 +46,7 @@ GL_PROGS = $(GL_PROGS_) + endif + + if DIRECTFB_BUILD_PURE_VOODOO +-NON_PURE_VOODOO_PROGS = ++NON_PURE_VOODOO_PROGS = + else + NON_PURE_VOODOO_PROGS = \ + coretest_blit2 \ +diff --git a/tools/mkdgifft.cpp b/tools/mkdgifft.cpp +index 4e347e7..de84eeb 100644 +--- a/tools/mkdgifft.cpp ++++ b/tools/mkdgifft.cpp +@@ -790,6 +790,7 @@ write_glyph( DGIFFGlyphInfo *glyph, const DFBSurfaceDescription &desc, void *dst + switch (m_format) { + case DSPF_ARGB: + dfb_convert_to_argb( desc.pixelformat, desc.preallocated[0].data, desc.preallocated[0].pitch, ++ NULL, 0, NULL, 0, + desc.height, (u32*) dst, pitch, desc.width, desc.height ); + break; + diff --git a/patches/DirectFB-1.6.3/autogen.sh b/patches/DirectFB-1.6.3/autogen.sh new file mode 100755 index 0000000..df78c38 --- /dev/null +++ b/patches/DirectFB-1.6.3/autogen.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +aclocal $ACLOCAL_FLAGS + +libtoolize \ + --force \ + --copy + +autoreconf \ + --force \ + --install \ + --warnings=cross \ + --warnings=syntax \ + --warnings=obsolete \ + --warnings=unsupported + diff --git a/patches/DirectFB-1.6.3/directfb-1.6.3.enigma2remote.diff b/patches/DirectFB-1.6.3/directfb-1.6.3.enigma2remote.diff new file mode 100644 index 0000000..8221f5e --- /dev/null +++ b/patches/DirectFB-1.6.3/directfb-1.6.3.enigma2remote.diff @@ -0,0 +1,444 @@ +--- DirectFB-1.4.11/configure.in 2012-03-13 04:11:46.537293991 -0700 ++++ DirectFB-1.4.11_2/configure.in 2012-03-13 03:34:20.925293996 -0700 +@@ -1722,6 +1722,7 @@ + checkfor_dbox2remote=no + checkfor_dreamboxremote=no + checkfor_dynapro=no ++checkfor_enigma2remote=no + checkfor_elo=no + checkfor_gunze=no + checkfor_h3600ts=no +@@ -1746,7 +1747,7 @@ + [LIST is a comma separated selection of] + [inputdrivers to build. Possible inputdrivers] + [are: all (builds all drivers), none (builds none),] +- [dbox2remote, dreamboxremote, dynapro, elo-input,] ++ [dbox2remote, dreamboxremote, dynapro, enigma2remote, elo-input,] + [gunze, h3600_ts, input_hub, joystick, keyboard, linuxinput,] + [lirc, mutouch, penmount, ps2mouse, serialmouse,] + [sonypijogdial, tslib, ucb1x00, wm97xx, zytronic.] +@@ -1757,6 +1758,7 @@ + checkfor_dbox2remote=yes + checkfor_dreamboxremote=yes + checkfor_dynapro=no ++ checkfor_enigma2remote=yes + checkfor_elo=no + checkfor_gunze=no + checkfor_h3600ts=yes +@@ -1790,6 +1792,9 @@ + dynapro) + checkfor_dynapro=yes + ;; ++ enigma2remote) ++ checkfor_enigma2remote=yes ++ ;; + elo-input) + checkfor_elo=yes + ;; +@@ -1871,6 +1876,12 @@ + enable_dynapro_ts=yes + fi + ++enable_enigma2remote=no ++if test "$checkfor_enigma2remote" = "yes"; then ++ dnl Test for Enigma2 remote support ++ enable_enigma2remote=yes ++fi ++ + enable_elo_input=no + if test "$checkfor_elo" = "yes"; then + dnl Test for ELO Touchscreen support +@@ -2187,6 +2198,7 @@ + AM_CONDITIONAL(DBOX2REMOTE, test "$enable_dbox2remote" = "yes") + AM_CONDITIONAL(DREAMBOXREMOTE, test "$enable_dreamboxremote" = "yes") + AM_CONDITIONAL(DYNAPRO_INPUT, test "$enable_dynapro_ts" = "yes") ++AM_CONDITIONAL(ENIGMA2REMOTE, test "$enable_enigma2remote" = "yes") + AM_CONDITIONAL(ELO_INPUT, test "$enable_elo_input" = "yes") + AM_CONDITIONAL(GUNZE_INPUT, test "$enable_gunze_input" = "yes") + AM_CONDITIONAL(H3600_TS, test "$enable_h3600_ts" = "yes") +@@ -2397,6 +2409,7 @@ + inputdrivers/dbox2remote/Makefile + inputdrivers/dreamboxremote/Makefile + inputdrivers/dynapro/Makefile ++inputdrivers/enigma2remote/Makefile + inputdrivers/elo/Makefile + inputdrivers/gunze/Makefile + inputdrivers/h3600_ts/Makefile +@@ -2565,6 +2578,7 @@ + DBox2 Remote $enable_dbox2remote + DreamBox Remote $enable_dreamboxremote + Dynapro Touchscreen $enable_dynapro_ts ++ Enigma2 Remote $enable_enigma2remote + ELO Touchscreen $enable_elo_input + Gunze Touchscreen $enable_gunze_input + H3600 Touchscreen $enable_h3600_ts +--- DirectFB-1.4.11/inputdrivers/Makefile.am 2010-10-31 01:49:49.000000000 -0700 ++++ DirectFB-1.4.11_2/inputdrivers/Makefile.am 2012-03-13 03:42:50.417293998 -0700 +@@ -8,6 +8,10 @@ + DREAMBOXREMOTE_DIR = dreamboxremote + endif + ++if ENIGMA2REMOTE ++ENIGMA2REMOTE_DIR = enigma2remote ++endif ++ + if DYNAPRO_INPUT + DYNAPRO_INPUT_DIR = dynapro + endif +@@ -80,6 +84,7 @@ + $(DBOX2REMOTE_DIR) \ + $(DREAMBOXREMOTE_DIR) \ + $(DYNAPRO_INPUT_DIR) \ ++ $(ENIGMA2REMOTE_DIR) \ + $(ELO_INPUT_DIR) \ + $(GUNZE_INPUT_DIR) \ + $(H3600_TS_DIR) \ +diff -Nur DirectFB-1.4.11/inputdrivers/enigma2remote/enigma2remote.c DirectFB-1.4.11_2/inputdrivers/enigma2remote/enigma2remote.c +--- DirectFB-1.4.11/inputdrivers/enigma2remote/enigma2remote.c 1969-12-31 16:00:00.000000000 -0800 ++++ DirectFB-1.4.11_2/inputdrivers/enigma2remote/enigma2remote.c 2012-03-13 03:21:53.341293991 -0700 +@@ -0,0 +1,309 @@ ++/* ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2 of the License, or (at your option) any later version. ++ ++ This library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the ++ Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++*/ ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++DFB_INPUT_DRIVER( enigma2remote ) ++ ++#define DEVICE "/tmp/rc_enigma2" ++ ++typedef struct { ++ DFBInputDeviceKeySymbol key; ++ char* rccode; ++} KeyCode; ++ ++static KeyCode keycodes_remote[] = { ++ { DIKS_0, "0" }, ++ { DIKS_1, "1" }, ++ { DIKS_2, "2" }, ++ { DIKS_3, "3" }, ++ { DIKS_4, "4" }, ++ { DIKS_5, "5" }, ++ { DIKS_6, "6" }, ++ { DIKS_7, "7" }, ++ { DIKS_8, "8" }, ++ { DIKS_9, "9" }, ++ { DIKS_CURSOR_LEFT, "LEFT" }, ++ { DIKS_CURSOR_RIGHT, "RIGHT" }, ++ { DIKS_CURSOR_UP, "UP" }, ++ { DIKS_CURSOR_DOWN, "DOWN" }, ++ { DIKS_RETURN, "ENTER" }, ++ { DIKS_OK, "OK" }, ++ { DIKS_ESCAPE, "ESC" }, ++ { DIKS_BACK, "BACK" }, ++ { DIKS_RED, "RED" }, ++ { DIKS_GREEN, "GREEN" }, ++ { DIKS_YELLOW, "YELLOW" }, ++ { DIKS_BLUE, "BLUE" }, ++ { DIKS_PLAY, "PLAY" }, ++ { DIKS_PAUSE, "PAUSE" }, ++ { DIKS_STOP, "STOP" }, ++ ++ { DIKS_NULL, "" } ++}; ++ ++ ++/* ++ * declaration of private data ++ */ ++typedef struct { ++ CoreInputDevice *device; ++ DirectThread *thread; ++ ++ int fd; ++} Enigma2remoteData; ++ ++ ++/* ++ * helper function for translating rccode ++ */ ++static DFBInputDeviceKeySymbol ++enigma2remote_parse_rccode( char* rccode ) ++{ ++ KeyCode *keycode; ++ static u16 rccodeOld = 0; ++ ++ keycode = keycodes_remote; ++ ++ while (keycode->key != DIKS_NULL) { ++ if (!strcmp(keycode->rccode, rccode)) { ++ return keycode->key; ++ } ++ keycode++; ++ } ++ return DIKS_NULL; ++} ++ ++/* ++ * Input thread reading from device. ++ * Generates events on incoming data. ++ */ ++static void* ++enigma2remoteEventThread( DirectThread *thread, void *driver_data ) ++{ ++ Enigma2remoteData *data = (Enigma2remoteData*) driver_data; ++ int readlen; ++ u16 rccode; ++ char recvBuffer[1024]; ++ DFBInputEvent evt; ++ int len; ++ struct sockaddr_un remote; ++ ++ printf("Trying to connect...\n"); ++ ++ remote.sun_family = AF_UNIX; ++ strcpy(remote.sun_path, DEVICE); ++ len = strlen(remote.sun_path) + sizeof(remote.sun_family); ++ if (connect(data->fd, (struct sockaddr *)&remote, len) == -1) { ++ D_PERROR ("enigma2remote connect failes"); ++ return NULL; ++ } ++ ++ printf("Connected.\n"); ++ ++ while (1) { ++ int recvBufferPos = 0; ++ //if (readLineControlPipe(driver_data, recvBuffer, 1024) <= 0) ++ // break; ++ ++ if ((readlen=recv(data->fd, recvBuffer, 1024, 0)) <= 0) ++ break; ++ recvBuffer[readlen] = '\0'; ++ printf("CMD [\'%s\']\n", recvBuffer); ++ direct_thread_testcancel( thread ); ++ ++ while (1) { //OK\nENTER\n\0 ++ int i; ++ char keyBuffer[16]; ++ for (i = 0; i < readlen && i < 16 && recvBuffer[recvBufferPos + i] != '\n' && recvBuffer[recvBufferPos + i] != '\0'; i++) { ++ keyBuffer[i] = recvBuffer[recvBufferPos + i]; ++ } ++ if (i == 0) break; ++ keyBuffer[i] = '\0'; ++ recvBufferPos += i + 1; ++ ++ /* translate rccode to DirectFB keycode */ ++ evt.key_symbol = enigma2remote_parse_rccode( keyBuffer ); ++ ++ ++ printf("KEY [\'%s\' -> \'%d\']\n", keyBuffer, evt.key_symbol); ++ ++ if (evt.key_symbol != DIKS_NULL) { ++ /* set event type and dispatch*/ ++ evt.type = DIET_KEYPRESS; ++ evt.flags = DIEF_KEYSYMBOL; ++ dfb_input_dispatch( data->device, &evt ); ++ ++ /* set event type and dispatch*/ ++ evt.type = DIET_KEYRELEASE; ++ evt.flags = DIEF_KEYSYMBOL; ++ dfb_input_dispatch( data->device, &evt ); ++ } ++ if ( i >= readlen) break; ++ } ++ } ++ ++ //if (readlen <= 0 && errno != EINTR) ++ D_PERROR ("enigma2remote thread died\n"); ++ ++ return NULL; ++} ++ ++/* exported symbols */ ++ ++/* ++ * Return the number of available devices. ++ * Called once during initialization of DirectFB. ++ */ ++static int ++driver_get_available( void ) ++{ ++ /* Check if we are able to read from device */ ++ if (access( DEVICE, R_OK )) ++ return 0; ++ ++ return 1; ++} ++ ++/* ++ * Fill out general information about this driver. ++ * Called once during initialization of DirectFB. ++ */ ++static void ++driver_get_info( InputDriverInfo *info ) ++{ ++ /* fill driver info structure */ ++ snprintf ( info->name, ++ DFB_INPUT_DRIVER_INFO_NAME_LENGTH, "enigma2 remote" ); ++ snprintf ( info->vendor, ++ DFB_INPUT_DRIVER_INFO_VENDOR_LENGTH, "mws" ); ++ ++ info->version.major = 0; ++ info->version.minor = 1; ++} ++ ++/* ++ * Open the device, fill out information about it, ++ * allocate and fill private data, start input thread. ++ * Called during initialization, resuming or taking over mastership. ++ */ ++static DFBResult ++driver_open_device( CoreInputDevice *device, ++ unsigned int number, ++ InputDeviceInfo *info, ++ void **driver_data ) ++{ ++ int fd; ++ Enigma2remoteData *data; ++ ++ /* open device */ ++ if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { ++ D_PERROR( "DirectFB/dreamboxremote: could not open device" ); ++ return DFB_INIT; ++ } ++ ++ /* set device name */ ++ snprintf( info->desc.name, ++ DFB_INPUT_DEVICE_DESC_NAME_LENGTH, "enigma2 remote control" ); ++ ++ /* set device vendor */ ++ snprintf( info->desc.vendor, ++ DFB_INPUT_DEVICE_DESC_VENDOR_LENGTH, "ENIGMA2" ); ++ ++ /* set one of the primary input device IDs */ ++ info->prefered_id = DIDID_REMOTE; ++ ++ /* set type flags */ ++ info->desc.type = DIDTF_REMOTE; ++ ++ /* set capabilities */ ++ info->desc.caps = DICAPS_KEYS; ++ ++ ++ /* allocate and fill private data */ ++ data = D_CALLOC( 1, sizeof(Enigma2remoteData) ); ++ if (!data) { ++ close( fd ); ++ return D_OOM(); ++ } ++ ++ data->fd = fd; ++ data->device = device; ++ ++ /* start input thread */ ++ data->thread = direct_thread_create( DTT_INPUT, enigma2remoteEventThread, data, "Enigma2 Input" ); ++ ++ /* set private data pointer */ ++ *driver_data = data; ++ ++ return DFB_OK; ++} ++ ++/* ++ * Fetch one entry from the device's keymap if supported. ++ */ ++static DFBResult ++driver_get_keymap_entry( CoreInputDevice *device, ++ void *driver_data, ++ DFBInputDeviceKeymapEntry *entry ) ++{ ++ return DFB_UNSUPPORTED; ++} ++ ++/* ++ * End thread, close device and free private data. ++ */ ++static void ++driver_close_device( void *driver_data ) ++{ ++ Enigma2remoteData *data = (Enigma2remoteData*) driver_data; ++ ++ /* stop input thread */ ++ direct_thread_cancel( data->thread ); ++ direct_thread_join( data->thread ); ++ direct_thread_destroy( data->thread ); ++ ++ /* close file */ ++ fclose( data->fd ); ++ ++ /* free private data */ ++ D_FREE ( data ); ++} +diff -Nur DirectFB-1.4.11/inputdrivers/enigma2remote/Makefile.am DirectFB-1.4.11_2/inputdrivers/enigma2remote/Makefile.am +--- DirectFB-1.4.11/inputdrivers/enigma2remote/Makefile.am 1969-12-31 16:00:00.000000000 -0800 ++++ DirectFB-1.4.11_2/inputdrivers/enigma2remote/Makefile.am 2012-03-13 03:25:08.437293917 -0700 +@@ -0,0 +1,32 @@ ++## Makefile.am for DirectFB/inputdrivers/dreamboxremote ++ ++INCLUDES = \ ++ -I$(top_builddir)/include \ ++ -I$(top_builddir)/lib \ ++ -I$(top_srcdir)/include \ ++ -I$(top_srcdir)/lib \ ++ -I$(top_srcdir)/src ++ ++enigma2remote_LTLIBRARIES = libdirectfb_enigma2remote.la ++ ++if BUILD_STATIC ++enigma2remote_DATA = $(enigma2remote_LTLIBRARIES:.la=.o) ++endif ++ ++enigma2remotedir = $(MODULEDIR)/inputdrivers ++ ++libdirectfb_enigma2remote_la_SOURCES = \ ++ enigma2remote.c ++ ++libdirectfb_enigma2remote_la_LDFLAGS = \ ++ -module \ ++ -avoid-version \ ++ $(DFB_LDFLAGS) ++ ++libdirectfb_enigma2remote_la_LIBADD = \ ++ $(top_builddir)/lib/direct/libdirect.la \ ++ $(top_builddir)/src/libdirectfb.la ++ ++ ++include $(top_srcdir)/rules/libobject.make ++ diff --git a/patches/DirectFB-1.6.3/directfb-1.6.3.no-vt.diff b/patches/DirectFB-1.6.3/directfb-1.6.3.no-vt.diff new file mode 100644 index 0000000..57a9be9 --- /dev/null +++ b/patches/DirectFB-1.6.3/directfb-1.6.3.no-vt.diff @@ -0,0 +1,106 @@ +diff -Nur DirectFB-1.4.11.orig/systems/stmfbdev/stmfbdev.c DirectFB-1.4.11/systems/stmfbdev/stmfbdev.c +--- DirectFB-1.4.11.orig/systems/stmfbdev/stmfbdev.c 2010-11-15 13:35:37.000000000 -0800 ++++ DirectFB-1.4.11/systems/stmfbdev/stmfbdev.c 1969-12-31 16:00:00.000000000 -0800 +@@ -195,11 +195,13 @@ + if (ret) + goto error; + ++#ifdef HAVE_VT + if (dfb_config->vt) { + ret = dfb_vt_initialize(); + if (ret) + goto error; + } ++#endif + + /* Retrieve fixed information like video ram size */ + if (ioctl( stmfbdev->fd, FBIOGET_FSCREENINFO, &shared->fix ) < 0) { +@@ -291,11 +293,13 @@ + if (ret) + goto error; + ++#ifdef HAVE_VT + if (dfb_config->vt) { + ret = dfb_vt_join(); + if (ret) + goto error; + } ++#endif + + /* Map the framebuffer */ + stmfbdev->framebuffer_base = mmap( NULL, stmfbdev->shared->fix.smem_len, +@@ -349,11 +353,13 @@ + munmap( dfb_stmfbdev->framebuffer_base, + dfb_stmfbdev->shared->fix.smem_len ); + ++#ifdef HAVE_VT + if (dfb_config->vt) { + ret = dfb_vt_shutdown( emergency ); + if (ret) + return ret; + } ++#endif + + close( dfb_stmfbdev->fd ); + +@@ -384,11 +390,13 @@ + munmap( dfb_stmfbdev->framebuffer_base, + dfb_stmfbdev->shared->fix.smem_len ); + ++#ifdef HAVE_VT + if (dfb_config->vt) { + ret = dfb_vt_leave( emergency ); + if (ret) + return ret; + } ++#endif + + close( dfb_stmfbdev->fd ); + +@@ -490,6 +498,7 @@ + system_input_filter( CoreInputDevice *device, + DFBInputEvent *event ) + { ++#ifdef HAVE_VT + if (dfb_config->vt && dfb_config->vt_switching) { + switch (event->type) { + case DIET_KEYPRESS: +@@ -510,6 +519,7 @@ + break; + } + } ++#endif + + return false; + } + +diff -Nur DirectFB-1.4.11.orig/inputdrivers/linux_input/linux_input.c DirectFB-1.4.11/inputdrivers/linux_input/linux_input.c +--- DirectFB-1.4.11.orig/inputdrivers/linux_input/linux_input.c 2010-11-15 13:35:37.000000000 -0800 ++++ DirectFB-1.4.11/inputdrivers/linux_input/linux_input.c 1969-12-31 16:00:00.000000000 -0800 +@@ -1275,8 +1275,10 @@ + // Only allow USB keyboard and mouse support if the systems driver has + // the Virtual Terminal file ("/dev/tty0") open and available for use. + // FIXME: Additional logic needed for system drivers not similar to fbdev? ++#if HAVE_VT + if (!dfb_stm_fbdev->vt || dfb_stm_fbdev->vt->fd < 0) + return 0; ++#endif + } + + /* Use the devices specified in the configuration. */ +@@ -1874,6 +1876,7 @@ + /* Track associated entry in device_nums and device_names array. */ + data->index = number; + ++#ifdef HAVE_VT + if (info->desc.min_keycode >= 0 && info->desc.max_keycode >= info->desc.min_keycode) { + if (dfb_system_type() == CORE_FBDEV) { + FBDev *dfb_fbdev = dfb_system_data(); +@@ -1892,6 +1895,7 @@ + if (data->vt_fd < 0) + D_WARN( "no keymap support (requires /dev/tty0 - CONFIG_VT)" ); + } ++#endif + + /* check if the device has LEDs */ + ret = ioctl( fd, EVIOCGBIT(EV_LED, sizeof(ledbit)), ledbit ); diff --git a/patches/DirectFB-1.6.3/series b/patches/DirectFB-1.6.3/series new file mode 100644 index 0000000..1e99103 --- /dev/null +++ b/patches/DirectFB-1.6.3/series @@ -0,0 +1,3 @@ +DirectFB-1.6.3.stm.patch +directfb-1.6.3.no-vt.diff +directfb-1.6.3.enigma2remote.diff diff --git a/rules/directfb.in b/rules/directfb.in index 2fee80f..731550a 100644 --- a/rules/directfb.in +++ b/rules/directfb.in @@ -1,9 +1,9 @@ ## SECTION=multimedia_directfb menuconfig DIRECTFB - tristate - prompt "directfb " - + tristate + prompt "directfb" + select HOST_FLUXCOMP select HOST_DIRECTFB select MENU_XORG_FONTS select LIBPNG if DIRECTFB_IMAGE_PNG @@ -39,6 +39,9 @@ config DIRECTFB_X11 config DIRECTFB_FBDEV bool "Framebuffer Device support" +config DIRECTFB_STMFBDEV + bool "STM Framebuffer Device support" + config DIRECTFB_V4L bool "Video for Linux support" @@ -48,6 +51,12 @@ config DIRECTFB_V4L2 config DIRECTFB_FONT_FREETYPE bool "build freetype2 font provider" +config DIRECTFB_FONT_LINOTYPE + bool "build linotype font provider" + +config DIRECTFB_MME + bool "build with mme support" + config DIRECTFB_WM_UNIQUE bool "enable unique (wm module)" select DIRECTFB_IMAGE_PNG @@ -152,6 +161,9 @@ config DIRECTFB_INPUT_PS2MOUSE config DIRECTFB_INPUT_TSLIB bool "tslib" +config DIRECTFB_INPUT_ENIMGA2REMOTE + bool "enigma2remote" + endmenu endif diff --git a/rules/directfb.make b/rules/directfb.make index 53dca32..def6130 100644 --- a/rules/directfb.make +++ b/rules/directfb.make @@ -17,16 +17,16 @@ PACKAGES-$(PTXCONF_DIRECTFB) += directfb # # Paths and names # -DIRECTFB_VERSION := 1.4.3 -DIRECTFB_MD5 := 223e036da906ceb4bd44708026839ff1 -DIRECTFB := DirectFB-$(DIRECTFB_VERSION) -DIRECTFB_SUFFIX := tar.gz +DIRECTFB_VERSION := 1.6.3 +DIRECTFB_MD5 := bc6703bda1ab85f1d85a1633aa7de3a5 +DIRECTFB := DirectFB-$(DIRECTFB_VERSION) +DIRECTFB_SUFFIX := tar.bz2 DIRECTFB_SOURCE := $(SRCDIR)/$(DIRECTFB).$(DIRECTFB_SUFFIX) DIRECTFB_DIR := $(BUILDDIR)/$(DIRECTFB) DIRECTFB_URL := \ - http://www.directfb.org/downloads/Core/DirectFB-1.4/$(DIRECTFB).$(DIRECTFB_SUFFIX) \ - http://www.directfb.org/downloads/Old/$(DIRECTFB).$(DIRECTFB_SUFFIX) + http://ptxdist.sat-universum.de/$(DIRECTFB).$(DIRECTFB_SUFFIX) + # ---------------------------------------------------------------------------- # Prepare @@ -41,6 +41,7 @@ DIRECTFB_INPUT-$(PTXCONF_DIRECTFB_INPUT_KEYBOARD) += keyboard DIRECTFB_INPUT-$(PTXCONF_DIRECTFB_INPUT_LINUXINPUT) += linuxinput DIRECTFB_INPUT-$(PTXCONF_DIRECTFB_INPUT_PS2MOUSE) += ps2mouse DIRECTFB_INPUT-$(PTXCONF_DIRECTFB_INPUT_TSLIB) += tslib +DIRECTFB_INPUT-$(PTXCONF_DIRECTFB_INPUT_ENIMGA2REMOTE) += enigma2remote DIRECTFB_GFX-$(PTXCONF_DIRECTFB_GFX_ATI128) += ati128 @@ -69,15 +70,20 @@ DIRECTFB_GFX-$(PTXCONF_DIRECTFB_GFX_VMWARE) += vmware # DIRECTFB_AUTOCONF := \ $(CROSS_AUTOCONF_USR) \ - --without-tests \ + --enable-static \ + --with-tests \ --with-tools \ --disable-osx \ --disable-network \ + --disable-multicore \ --disable-multi \ - --disable-voodoo \ + --enable-voodoo \ + --disable-devmem \ --disable-sdl \ + --disable-webp \ + --with-message-size=65536 \ + --disable-linotype \ --disable-vnc \ - --disable-sysfs \ --disable-zlib \ --with-gfxdrivers=$(subst $(space),$(comma),$(DIRECTFB_GFX-y)) \ --with-inputdrivers=$(subst $(space),$(comma),$(DIRECTFB_INPUT-y)) @@ -94,6 +100,12 @@ else DIRECTFB_AUTOCONF += --disable-fbdev endif +ifdef PTXCONF_DIRECTFB_STMFBDEV +DIRECTFB_AUTOCONF += --enable-stmfbdev +else +DIRECTFB_AUTOCONF += --disable-stmfbdev +endif + ifdef PTXCONF_DIRECTFB_V4L DIRECTFB_AUTOCONF += --enable-video4linux else @@ -108,10 +120,10 @@ endif ifdef PTXCONF_DIRECTFB_DEBUG DIRECTFB_AUTOCONF += --enable-debug -DIRECTFB_MODULE_DIRECTORY := /usr/lib/directfb-1.4-0 +DIRECTFB_MODULE_DIRECTORY := /usr/lib/directfb-1.6-0 else DIRECTFB_AUTOCONF += --disable-debug-support -DIRECTFB_MODULE_DIRECTORY := /usr/lib/directfb-1.4-0-pure +DIRECTFB_MODULE_DIRECTORY := /usr/lib/directfb-1.6-0-pure endif ifdef PTXCONF_DIRECTFB_TRACE @@ -120,6 +132,12 @@ else DIRECTFB_AUTOCONF += --disable-trace endif +ifdef PTXCONF_DIRECTFB_MME +DIRECTFB_AUTOCONF += --enable-mme +else +DIRECTFB_AUTOCONF += --disable-mme +endif + ifdef PTXCONF_DIRECTFB_WM_UNIQUE DIRECTFB_AUTOCONF += --enable-unique else @@ -150,6 +168,12 @@ else DIRECTFB_AUTOCONF += --disable-freetype endif +ifdef PTXCONF_DIRECTFB_FONT_LINOTYPE +DIRECTFB_AUTOCONF += --enable-linotype +else +DIRECTFB_AUTOCONF += --disable-linotype +endif + # ---------------------------------------------------------------------------- # Target-Install # ---------------------------------------------------------------------------- @@ -194,12 +218,13 @@ endif @$(call install_copy, directfb, 0, 0, 0755, -, /usr/bin/dfbinfo) - @$(call install_lib, directfb, 0, 0, 0644, libdirectfb-1.4) - @$(call install_lib, directfb, 0, 0, 0644, libfusion-1.4) - @$(call install_lib, directfb, 0, 0, 0644, libdirect-1.4) + @$(call install_lib, directfb, 0, 0, 0644, libdirectfb-1.6) + @$(call install_lib, directfb, 0, 0, 0644, libfusion-1.6) + @$(call install_lib, directfb, 0, 0, 0644, libdirect-1.6) + @$(call install_lib, directfb, 0, 0, 0644, libvoodoo-1.6) ifdef PTXCONF_DIRECTFB_WM_UNIQUE - @$(call install_lib, directfb, 0, 0, 0644, libuniquewm-1.4) + @$(call install_lib, directfb, 0, 0, 0644, libuniquewm-1.6) endif @cd $(DIRECTFB_PKGDIR) && for plugin in `find ./$(DIRECTFB_MODULE_DIRECTORY) -name "*.so"`; do \ From fec20f1313b032494a5b04ea5ac7e831613a7755 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 3 Nov 2013 22:38:39 +0100 Subject: [PATCH 19/20] add fluxcomp and host-fluxcomp --- rules/fluxcomp.in | 29 ++++++++++++++ rules/fluxcomp.make | 82 ++++++++++++++++++++++++++++++++++++++++ rules/host-fluxcomp.in | 8 ++++ rules/host-fluxcomp.make | 63 ++++++++++++++++++++++++++++++ 4 files changed, 182 insertions(+) create mode 100644 rules/fluxcomp.in create mode 100644 rules/fluxcomp.make create mode 100644 rules/host-fluxcomp.in create mode 100644 rules/host-fluxcomp.make diff --git a/rules/fluxcomp.in b/rules/fluxcomp.in new file mode 100644 index 0000000..5f0eb3e --- /dev/null +++ b/rules/fluxcomp.in @@ -0,0 +1,29 @@ +## SECTION=system_libraries + +config FLUXCOMP + tristate + prompt "fluxcomp" + help + A fast lexical analyzer generator + + Flex is a tool for generating scanners: programs which + recognized lexical patterns in text. It reads the given + input files for a description of a scanner to generate. The + description is in the form of pairs of regular expressions + and C code, called rules. Flex generates as output a C + source file, lex.yy.c, which defines a routine yylex(). This + file is compiled and linked with the -lfl library to produce + an executable. When the executable is run, it analyzes its + input for occurrences of the regular expressions. Whenever + it finds one, it executes the corresponding C code. + + The behaviour of Flex has undergone a major change since + version 2.5.4a. Flex scanners are now reentrant, and it is + now possible to have multiple scanners in the same program + with differing sets of defaults, and the scanners play nicer + with modern C and C++ compilers. The Flip side is that Flex + no longer conforms to the POSIX lex behaviour, and the + scanners require conforming implementations when flex is + used in ANSI C mode. + + Homepage: http://flex.sf.net/ diff --git a/rules/fluxcomp.make b/rules/fluxcomp.make new file mode 100644 index 0000000..922478f --- /dev/null +++ b/rules/fluxcomp.make @@ -0,0 +1,82 @@ +# -*-makefile-*- +# +# Copyright (C) 2009 by Marc Kleine-Budde +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +PACKAGES-$(PTXCONF_FLUXCOMP) += fluxcomp + +# +# Paths and names +# +FLUXCOMP_VERSION := f4ebde5d16ea1cba3e16e1ec3a1cf51a40c77eea +FLUXCOMP := fluxcomp-$(FLUXCOMP_VERSION) +FLUXCOMP_URL := git://git.directfb.org/git/directfb/core/flux +FLUXCOMP_BRANCH := master +FLUXCOMP_GIT_HEAD := $(FLUXCOMP_VERSION) +FLUXCOMP_SOURCE := $(SRCDIR)/flux.git +FLUXCOMP_DIR := $(BUILDDIR)/$(FLUXCOMP) +FLUXCOMP_LICENSE := unknown + +# ---------------------------------------------------------------------------- +# Extract +# ---------------------------------------------------------------------------- + +$(STATEDIR)/fluxcomp.extract: + @$(call targetinfo) + @$(call clean, $(FLUXCOMP_DIR)) + @$(call extract, FLUXCOMP) + + @$(call patchin, FLUXCOMP) + + cd $(FLUXCOMP_DIR) && [ -f configure ] || sh autogen.sh + @$(call touch) + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +FLUXCOMP_PATH := PATH=$(CROSS_PATH) +FLUXCOMP_ENV := $(CROSS_ENV) + +# +# autoconf +# +FLUXCOMP_AUTOCONF := $(CROSS_AUTOCONF_USR) + +# ---------------------------------------------------------------------------- +# Target-Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/fluxcomp.targetinstall: + @$(call targetinfo) + + @$(call install_init, fluxcomp) + @$(call install_fixup, fluxcomp,PRIORITY,optional) + @$(call install_fixup, fluxcomp,SECTION,base) + @$(call install_fixup, fluxcomp,AUTHOR,"Marc Kleine-Budde ") + @$(call install_fixup, fluxcomp,DESCRIPTION,missing) + +# +# HACK: +# +# we need a ipkg, because some packages may depend on us, e.g.: +# "at" +# +# because we don't provide any shared libraries, +# we just put an existing dir into the package +# +# @$(call install_copy, fluxcomp, 0, 0, 0755, /usr/sbin) + +# @$(call install_finish, fluxcomp) + + @$(call touch) + +# vim: syntax=make diff --git a/rules/host-fluxcomp.in b/rules/host-fluxcomp.in new file mode 100644 index 0000000..bed53f1 --- /dev/null +++ b/rules/host-fluxcomp.in @@ -0,0 +1,8 @@ +## SECTION=hosttools_noprompt + +config HOST_FLUXCOMP + tristate + default ALLYES + help + Flex, the fast lexical analyser generator. + diff --git a/rules/host-fluxcomp.make b/rules/host-fluxcomp.make new file mode 100644 index 0000000..35936ae --- /dev/null +++ b/rules/host-fluxcomp.make @@ -0,0 +1,63 @@ +# -*-makefile-*- +# +# Copyright (C) 2008 by mol@pengutronix.de +# +# See CREDITS for details about who has contributed to this project. +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +# +# We provide this package +# +HOST_PACKAGES-$(PTXCONF_HOST_FLUXCOMP) += host-fluxcomp +# +# Paths and names +# +HOST_FLEX_DIR = $(HOST_BUILDDIR)/$(FLUXCOMP) +# ---------------------------------------------------------------------------- +# Extract +# ---------------------------------------------------------------------------- + +$(STATEDIR)/host-fluxcomp.extract: + @$(call targetinfo) + @$(call clean, $(HOST_FLUXCOMP_DIR)) + @$(call extract, HOST_FLUXCOMP) + + @$(call patchin, HOST_FLUXCOMP) + + cd $(HOST_FLUXCOMP_DIR) && [ -f configure ] || sh autogen.sh + @$(call touch) + +# ---------------------------------------------------------------------------- +# Prepare +# ---------------------------------------------------------------------------- + +# +# autoconf +# +HOST_FLUXCOMP_CONF_TOOL := autoconf +HOST_FLUXCOMP_CONF_OPT = \ + $(HOST_AUTOCONF) \ + $(FLUXCOMP_AUTOCONF_SHARED) + +$(STATEDIR)/host-fluxcomp.compile: + @$(call targetinfo) + + cd $(HOST_FLUXCOMP_DIR) && $(HOST_FLUXCOMP_PATH) $(HOST_FLUXCOMP_CONF_ENV) \ + $(MAKE) $(PARALLELMFLAGS_BROKEN) $(HOST_FLUXCOMP_MAKEVARS) all + @$(call touch) + +# ---------------------------------------------------------------------------- +# Install +# ---------------------------------------------------------------------------- + +$(STATEDIR)/host-fluxcomp.install: + @$(call targetinfo) + @$(call world/install, HOST_FLUXCOMP) +# # don't install headers, so packages like the kernel don't use it + @rm -r $(HOST_FLUXCOMP_PKGDIR)/include + @$(call touch) + +# vim: syntax=make From e71462d6b38beb0baab4262c7f68179e026913f2 Mon Sep 17 00:00:00 2001 From: schpuntik Date: Sun, 3 Nov 2013 22:39:16 +0100 Subject: [PATCH 20/20] update flex --- rules/flex.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/flex.make b/rules/flex.make index 4ce6489..93a20d0 100644 --- a/rules/flex.make +++ b/rules/flex.make @@ -16,7 +16,7 @@ PACKAGES-$(PTXCONF_FLEX) += flex # # Paths and names # -FLEX_VERSION := 2.5.35 +FLEX_VERSION := 2.5.37 FLEX_MD5 := 10714e50cea54dc7a227e3eddcd44d57 FLEX := flex-$(FLEX_VERSION) FLEX_SUFFIX := tar.bz2