| # Copyright 1999-2004 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Header: /var/cvsroot/gentoo-x86/eclass/rox.eclass,v 1.31 2010/03/07 20:42:13 lack Exp $ |
| |
| # ROX eclass Version 3 |
| |
| # This eclass was created by Sergey Kuleshov (svyatogor@gentoo.org) and |
| # Alexander Simonov (devil@gentoo.org.ua) to ease installation of ROX desktop |
| # applications. Enhancements and python additions by Peter Hyman. |
| # Small fixes and current maintenance by Jim Ramsay (lack@gentoo.org) |
| |
| # These variables are used in the GLOBAL scope to decide on DEPENDs, so they |
| # must be set BEFORE you 'inherit rox': |
| # |
| # ROX_VER - the minimum version of rox filer required. Default is 2.1.0 |
| # ROX_LIB_VER - version of rox-lib required if any |
| # ROX_CLIB_VER - version of rox-clib required if any |
| # |
| # These variables are only used inside functions, and so may be set anywhere in |
| # the ebuild: |
| # |
| # APPNAME - the actual name of the application as the app folder is named |
| # WRAPPERNAME - the name of the wrapper installed into /usr/bin |
| # Defaults to 'rox-${PN}', or just ${PN} if it already starts with 'rox'. |
| # This does not normally need to be overridden. |
| # If overridden with the reserved word 'skip' no wrapper will be created. |
| # APPNAME_COLLISION - If not set, the old naming convention for wrappers of |
| # /usr/bin/${APPNAME} will still be around. Needs only be set in packages |
| # with known collisions (such as Pager, which collides with afterstep) |
| # APPCATEGORY - the .desktop categories this application should be placed in. |
| # If unset, no .desktop file will be created. For a list of acceptable |
| # category names, see |
| # http://standards.freedesktop.org/menu-spec/latest/apa.html |
| # APPMIME - the .desktop MimeTypes value to include. This is a |
| # semicolon-delimited list of mime-types. Any characters in [[:space:]] are |
| # ignored. If the supported mime-types are dependent upon USE flags, the new |
| # 'usemime' function may be useful. For example: |
| # APPMIME="a/foo-1;a/foo-2 |
| # $(usemime three "a/three") |
| # text/plain" |
| # will be expanded to either "a/foo-1;a/foo-2;a/three;text/plain" if |
| # USE=three or "a/foo-1;a/foo-2;text/plain" if not. |
| # WARNING: the 'usemime' function cannot be used in global scope. You should |
| # set APPMIME (or at least the USE-dependant parts) in your own src_install |
| # before calling rox_src_install. See rox-extra/archive for an example. |
| # KEEP_SRC - this flag, if set, will not remove the source directory |
| # but will do a 'make clean' in it. This is useful if users wish to |
| # preserve the source code for some reason |
| |
| # For examples refer to ebuilds in rox-extra/ or rox-base/ |
| |
| # need python to byte compile modules, if any |
| # need autotools to run autoreconf, if required |
| inherit python autotools eutils multilib |
| |
| ROX_VER=${ROX_VER:-"2.1.0"} |
| |
| RDEPEND=">=rox-base/rox-${ROX_VER}" |
| |
| if [[ ${ROX_LIB_VER} ]]; then |
| RDEPEND="${RDEPEND} |
| >=rox-base/rox-lib-${ROX_LIB_VER}" |
| fi |
| |
| if [[ ${ROX_CLIB_VER} ]]; then |
| RDEPEND="${RDEPEND} |
| >=rox-base/rox-clib-${ROX_CLIB_VER}" |
| DEPEND="${DEPEND} |
| >=rox-base/rox-clib-${ROX_CLIB_VER} |
| >=dev-util/pkgconfig-0.20" |
| fi |
| |
| # This is the new wrapper name (for /usr/bin/) |
| # It is also used for the icon name in /usr/share/pixmaps |
| # |
| # Use rox-${PN} unless ${PN} already starts with 'rox' |
| _a="rox-${PN}" |
| _b=${_a/rox-rox*} |
| WRAPPERNAME=${_b:-${PN}} |
| unset _a _b |
| |
| # This is the location where all applications are installed |
| LIBDIR="/usr/$(get_libdir)" |
| APPDIR="${LIBDIR}/rox" |
| |
| # External Functions |
| |
| # Used for assembling APPMIME with USE-dependent parts |
| # WARNING: Cannot be used in global scope. |
| # Set this in src_install just before you call rox_src_install |
| usemime() { |
| local myuse="$1"; shift |
| use "${myuse}" && echo "$@" |
| } |
| |
| # Utility Functions |
| |
| # Expands APPMIME properly, removing whitespace, newlines, and putting in ';' |
| # where needed. |
| expandmime() { |
| local old_IFS=$IFS |
| IFS=$'; \t\n' |
| echo "$*" |
| IFS=$old_IFS |
| } |
| |
| # Creates a .desktop file for this rox application |
| # (Adapted from eutils::make_desktop_entry) |
| # |
| # rox_desktop_entry <exec> <name> <icon> <type> [<extra> ...] |
| # exec - The executable to run |
| # name - The name to display |
| # icon - The icon file to display |
| # Any other arguments will be appended verbatim to the desktop file. |
| # |
| # The name of the desktop file will be ${exec}.desktop |
| # |
| rox_desktop_entry() { |
| # Coppied from etuils:make_desktop_entry |
| local exec=${1}; shift |
| local name=${1}; shift |
| local icon=${1}; shift |
| local type=${1}; shift |
| |
| local desktop="${exec}.desktop" |
| |
| cat <<-EOF > "${desktop}" |
| [Desktop Entry] |
| Name=${name} |
| Type=Application |
| Comment=${DESCRIPTION} |
| Exec=${exec} |
| TryExec=${exec%% *} |
| Icon=${icon} |
| Categories=${type}; |
| EOF |
| |
| local extra=${1}; shift |
| while [[ "${extra}" ]]; do |
| echo "${extra}" >> "${desktop}" |
| extra=${1}; shift |
| done |
| |
| # Subshell, so as to not pollute the caller's env. |
| ( |
| insinto /usr/share/applications |
| doins "${desktop}" |
| ) |
| } |
| |
| # |
| # Install the wrapper in /usr/bin for commandline execution |
| # |
| # Environment needed: |
| # WRAPPERNAME, APPDIR, LIBDIR, APPNAME, APPNAME_COLLISION |
| # |
| rox_install_wrapper() { |
| if [[ "${WRAPPERNAME}" != "skip" ]]; then |
| #create a script in bin to run the application from command line |
| dodir /usr/bin/ |
| cat >"${D}/usr/bin/${WRAPPERNAME}" <<EOF |
| #!/bin/sh |
| if [ "\${LIBDIRPATH}" ]; then |
| export LIBDIRPATH="\${LIBDIRPATH}:${LIBDIR}" |
| else |
| export LIBDIRPATH="${LIBDIR}" |
| fi |
| |
| if [ "\${APPDIRPATH}" ]; then |
| export APPDIRPATH="\${APPDIRPATH}:${APPDIR}" |
| else |
| export APPDIRPATH="${APPDIR}" |
| fi |
| exec "${APPDIR}/${APPNAME}/AppRun" "\$@" |
| EOF |
| chmod 755 "${D}/usr/bin/${WRAPPERNAME}" |
| |
| # Old name of cmdline wrapper: /usr/bin/${APPNAME} |
| if [[ ! "${APPNAME_COLLISION}" ]]; then |
| ln -s ${WRAPPERNAME} "${D}/usr/bin/${APPNAME}" |
| # TODO: Migrate this away... eventually |
| else |
| ewarn "The wrapper script /usr/bin/${APPNAME} has been removed" |
| ewarn "due to a name collision. You must run ${APPNAME} as" |
| ewarn "/usr/bin/${WRAPPERNAME} instead." |
| fi |
| fi |
| } |
| |
| # |
| # Copy the .DirIcon into the pixmaps dir, and create the .desktop file |
| # |
| rox_install_desktop() { |
| # Create a .desktop file if the proper category is supplied |
| if [[ -n "${APPCATEGORY}" ]]; then |
| # Copy the .DirIcon into /usr/share/pixmaps with the proper extension |
| if [[ -f "${APPNAME}/.DirIcon" ]]; then |
| local APPDIRICON=${APPNAME}/.DirIcon |
| local APPICON |
| case "$(file -b ${APPDIRICON})" in |
| "PNG image"*) |
| APPICON=${WRAPPERNAME}.png |
| ;; |
| "XML 1.0 document text"* | \ |
| "SVG Scalable Vector Graphics image"*) |
| APPICON=${WRAPPERNAME}.svg |
| ;; |
| "X pixmap image text"*) |
| APPICON=${WRAPPERNAME}.xpm |
| ;; |
| "symbolic link"*) |
| APPDIRICON=$(dirname ${APPDIRICON})/$(readlink ${APPDIRICON}) |
| APPICON=${WRAPPERNAME}.${APPDIRICON##*.} |
| ;; |
| *) |
| # Unknown... Remark on it, and just copy without an extension |
| ewarn "Could not detect the file type of the application icon," |
| ewarn "copying without an extension." |
| APPICON=${WRAPPERNAME} |
| ;; |
| esac |
| # Subshell, so as to not pollute the caller's env. |
| ( |
| insinto /usr/share/pixmaps |
| newins "${APPDIRICON}" "${APPICON}" |
| ) |
| fi |
| |
| rox_desktop_entry "${WRAPPERNAME}" "${APPNAME}" "${WRAPPERNAME}" \ |
| "${APPCATEGORY}" "MimeType=$(expandmime $APPMIME)" |
| fi |
| } |
| |
| # Exported functions |
| rox_src_compile() { |
| cd "${APPNAME}" |
| #Some packages need to be compiled. |
| chmod 755 AppRun |
| if [[ -d src/ ]]; then |
| # Bug 150303: Check with Rox-Clib will fail if the user has 0install |
| # installed on their system somewhere, so remove the check for it in the |
| # configure script, and adjust the path that the 'libdir' program uses |
| # to search for it: |
| if [[ -f src/configure.in ]]; then |
| cd src |
| sed -i.bak -e 's/ROX_CLIB_0LAUNCH/ROX_CLIB/' configure.in |
| # TODO: This should really be 'eautoreconf', but that breaks |
| # some packages (such as rox-base/pager-1.0.1) |
| eautoconf |
| cd .. |
| fi |
| export LIBDIRPATH="${LIBDIR}" |
| |
| # Most rox self-compiles have a 'read' call to wait for the user to |
| # press return if the compile fails. |
| # Find and remove this: |
| sed -i.bak -e 's/\<read\>/#read/' AppRun |
| |
| ./AppRun --compile || die "Failed to compile the package" |
| if [[ -n "${KEEP_SRC}" ]]; then |
| emake -C src clean |
| else |
| rm -rf src |
| fi |
| if [[ -d build ]]; then |
| rm -rf build |
| fi |
| |
| # Restore the original AppRun |
| mv AppRun.bak AppRun |
| fi |
| } |
| |
| rox_src_install() { |
| if [[ -d "${APPNAME}/Help/" ]]; then |
| for i in "${APPNAME}"/Help/*; do |
| dodoc "${i}" |
| done |
| fi |
| |
| insinto "${APPDIR}" |
| |
| # Use 'cp -pPR' and not 'doins -r' here so we don't have to do a flurry of |
| # 'chmod' calls on the executables in the appdir - Just be sure that all the |
| # files in the original appdir prior to this step are correct, as they will |
| # all be preserved. |
| cp -pPR ${APPNAME} "${D}${APPDIR}/${APPNAME}" |
| |
| # Install the wrapper in /usr/bin |
| rox_install_wrapper |
| |
| # Install the .desktop application file |
| rox_install_desktop |
| } |
| |
| rox_pkg_postinst() { |
| python_mod_optimize "${APPDIR}/${APPNAME}" >/dev/null 2>&1 |
| |
| einfo "${APPNAME} has been installed into ${APPDIR}" |
| if [[ "${WRAPPERNAME}" != "skip" ]]; then |
| einfo "You can run it by typing ${WRAPPERNAME} at the command line." |
| einfo "Or, you can run it by pointing the ROX file manager to the" |
| else |
| einfo "You can run it by pointing the ROX file manager to the" |
| fi |
| einfo "install location -- ${APPDIR} -- and click" |
| einfo "on ${APPNAME}'s icon, drag it to a panel, desktop, etc." |
| } |
| |
| rox_pkg_postrm() { |
| python_mod_cleanup "${APPDIR}" |
| } |
| |
| |
| EXPORT_FUNCTIONS src_compile src_install pkg_postinst pkg_postrm |