[aur-general] Building a package from a currently installed program
Hi, I have searched for this and not found anything, but it seems like it should be possible. Is there a way to package a currently installed program? I have a friend who is having trouble with a new Arch install getting Orca working. I know for sure my version of Orca is working, so I wanted to package it for him, send it to him, and let him instal with pacman. I'm just not sure how to do it. Of course, if my version of Orca works on his install that means there is a bug somewhere, but he needs it to be working in order to access information to file a bug lol, kind of a catch 22. Thanks Storm -- Registered Linux user number 508465: https://linuxcounter.net/user/508465.html My blog, Thoughts of a Dragon: http://www.stormdragon.us/ Do you get paid for tweeting? I do: http://spn.tw/r11uj "The sound of evil laughter falls around the world tonight." DragonForce - through the Fire and Flames
On Sun, Nov 25, 2012 at 04:15:05PM -0500, Storm Dragon wrote:
Hi, I have searched for this and not found anything, but it seems like it should be possible. Is there a way to package a currently installed program? I have a friend who is having trouble with a new Arch install getting Orca working. I know for sure my version of Orca is working, so I wanted to package it for him, send it to him, and let him instal with pacman. I'm just not sure how to do it. Of course, if my version of Orca works on his install that means there is a bug somewhere, but he needs it to be working in order to access information to file a bug lol, kind of a catch 22. Thanks Storm -- Registered Linux user number 508465: https://linuxcounter.net/user/508465.html My blog, Thoughts of a Dragon: http://www.stormdragon.us/ Do you get paid for tweeting? I do: http://spn.tw/r11uj "The sound of evil laughter falls around the world tonight." DragonForce - through the Fire and Flames
pacman-contrib has bacman which attempts to recreate a package from the installed files.
The day was 25/11/12 21:15 when , Storm Dragon had this to say......:
Hi, I have searched for this and not found anything, but it seems like it should be possible. Is there a way to package a currently installed program? I have a friend who is having trouble with a new Arch install getting Orca working. I know for sure my version of Orca is working, so I wanted to package it for him, send it to him, and let him instal with pacman. I'm just not sure how to do it. Of course, if my version of Orca works on his install that means there is a bug somewhere, but he needs it to be working in order to access information to file a bug lol, kind of a catch 22. Thanks Storm
I found this a while ago, I haven't tried it for a while though so I'm not sure if it still works with the newer Pacman Simon #!/bin/bash # # bacman: recreate a package from a running system # This script rebuilds an already installed package using metadata # stored into the pacman database and system files # # (c) 2008 - locci <carlocci_at_gmail_dot_com> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # shopt -s extglob shopt -s nullglob readonly progname="bacman" readonly progver="0.2.1" # # User Friendliness # usage() { echo "This program recreates a package using pacman's db and system files" echo "Usage: $progname <installed package name>" echo "Example: $progname kernel26" } if (( $# != 1 )); then usage exit 1 fi if [[ $1 == "--help" || $1 == "-h" ]]; then usage exit 0 fi if [[ $1 == "--version" || $1 == "-v" ]]; then echo "$progname version $progver" echo "Copyright (C) 2008 locci" exit 0 fi # # Fakeroot support # if (( EUID )); then if [[ -f /usr/bin/fakeroot ]]; then echo "Entering fakeroot environment" export INFAKEROOT="1" /usr/bin/fakeroot -u -- "$0" "$@" exit $? else echo "WARNING: installing fakeroot or running ${progname} as root is required to" echo " preserve the ownership permissions of files in some packages" echo "" fi fi # # Setting environmental variables # if [[ ! -r /etc/pacman.conf ]]; then echo "ERROR: unable to read /etc/pacman.conf" exit 1 fi eval $(awk '/DBPath/ {print $1$2$3}' /etc/pacman.conf) pac_db="${DBPath:-/var/lib/pacman/}/local" if [[ ! -r /etc/makepkg.conf ]]; then echo "ERROR: unable to read /etc/makepkg.conf" exit 1 fi source "/etc/makepkg.conf" if [[ -r ~/.makepkg.conf ]]; then source ~/.makepkg.conf fi pkg_arch=${CARCH:-'unknown'} pkg_dest="${PKGDEST:-$PWD}" pkg_pkger=${PACKAGER:-'Unknown Packager'} pkg_name="$1" pkg_dir=("$pac_db/$pkg_name"-+([^-])-+([^-])) pkg_namver=("${pkg_dir[@]##*/}") # # Checks everything is in place # if [[ ! -d $pac_db ]]; then echo "ERROR: pacman database directory ${pac_db} not found" exit 1 fi if (( ${#pkg_dir[@]} != 1 )); then printf "ERROR: %d entries for package %s found in pacman database\n" \ ${#pkg_dir[@]} "${pkg_name}" printf "%s\n" "${pkg_dir[@]}" exit 1 fi if [[ ! -d $pkg_dir ]]; then printf "ERROR: package %s is found in pacman database,\n" "${pkg_name}" printf " but \`%s' is not a directory\n" "${pkg_dir}" exit 1 fi # # Begin # echo "Package: ${pkg_namver}" work_dir=$(mktemp -d --tmpdir bacman.XXXXXXXXXX) cd "$work_dir" || exit 1 # # File copying # echo "Copying package files..." cat "$pkg_dir"/files | while read i; do if [[ -z $i ]]; then continue fi if [[ $i == %+([A-Z])% ]]; then current=$i continue fi case "$current" in %FILES%) ret=0 if [[ -e /$i ]]; then bsdtar -cnf - "/$i" 2> /dev/null | bsdtar -xpf - # Workaround to bsdtar not reporting a missing file as an error if ! [[ -e $work_dir/$i || -L $work_dir/$i ]]; then echo "" echo "ERROR: unable to add /$i to the package" echo " If your user does not have permssion to read this file then" echo " you will need to run $progname as root" rm -rf "$work_dir" exit 1 fi else echo "" echo "WARNING: package file /$i is missing" echo "" fi ;; esac done ret=$? if (( ret )); then rm -rf "$work_dir" exit 1 fi pkg_size=$(du -sk | awk '{print $1 * 1024}') # # .PKGINFO stuff # TODO adopt makepkg's write_pkginfo() into this or scripts/library # echo Generating .PKGINFO metadata... echo "# Generated by $progname $progver" > .PKGINFO if [[ $INFAKEROOT == "1" ]]; then echo "# Using $(fakeroot -v)" >> .PKGINFO fi echo "# $(LC_ALL=C date)" >> .PKGINFO echo "#" >> .PKGINFO cat "$pkg_dir"/{desc,files} | while read i; do if [[ -z $i ]]; then continue; fi if [[ $i == %+([A-Z])% ]]; then current=$i continue fi case "$current" in # desc %NAME%) echo "pkgname = $i" >> .PKGINFO ;; %VERSION%) echo "pkgver = $i" >> .PKGINFO ;; %DESC%) echo "pkgdesc = $i" >> .PKGINFO ;; %URL%) echo "url = $i" >> .PKGINFO ;; %LICENSE%) echo "license = $i" >> .PKGINFO ;; %ARCH%) echo "arch = $i" >> .PKGINFO ;; %BUILDDATE%) echo "builddate = $(date -u "+%s")" >> .PKGINFO ;; %PACKAGER%) echo "packager = $pkg_pkger" >> .PKGINFO ;; %SIZE%) echo "size = $pkg_size" >> .PKGINFO ;; %GROUPS%) echo "group = $i" >> .PKGINFO ;; %REPLACES%) echo "replaces = $i" >> .PKGINFO ;; %DEPENDS%) echo "depend = $i" >> .PKGINFO ;; %OPTDEPENDS%) echo "optdepend = $i" >> .PKGINFO ;; %CONFLICTS%) echo "conflict = $i" >> .PKGINFO ;; %PROVIDES%) echo "provides = $i" >> .PKGINFO ;; # files %BACKUP%) # strip the md5sum after the tab echo "backup = ${i%%$'\t'*}" >> .PKGINFO ;; esac done comp_files=".PKGINFO" if [[ -f $pkg_dir/install ]]; then cp "$pkg_dir/install" "$work_dir/.INSTALL" comp_files+=" .INSTALL" fi if [[ -f $pkg_dir/changelog ]]; then cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG" comp_files+=" .CHANGELOG" fi # # Fixes owner:group and permissions for .PKGINFO, .CHANGELOG, .INSTALL # chown root:root "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null chmod 644 "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null # # Generate the package # echo "Generating the package..." pkg_file="$pkg_dest/$pkg_namver-$pkg_arch${PKGEXT}" ret=0 # TODO: Maybe this can be set globally for robustness shopt -s -o pipefail bsdtar -cf - $comp_files * | case "$PKGEXT" in *tar.gz) gzip -c -f -n ;; *tar.bz2) bzip2 -c -f ;; *tar.xz) xz -c -z - ;; *tar.Z) compress -c -f ;; *tar) cat ;; *) echo "WARNING: '%s' is not a valid archive extension." \ "$PKGEXT" >&2; cat ;; esac > "${pkg_file}"; ret=$? if (( ret )); then echo "ERROR: unable to write package to $pkg_dest" echo " Maybe the disk is full or you do not have write access" rm -rf "$work_dir" exit 1 fi rm -rf "$work_dir" echo Done exit 0 # vim: set ts=2 sw=2 noet:
On Sun, 25 Nov 2012 16:15:05 -0500 Storm Dragon <stormdragon2976@gmail.com> wrote:
Hi, I have searched for this and not found anything, but it seems like it should be possible. Is there a way to package a currently installed program? I have a friend who is having trouble with a new Arch install getting Orca working. I know for sure my version of Orca is working, so I wanted to package it for him, send it to him, and let him instal with pacman. I'm just not sure how to do it. Of course, if my version of Orca works on his install that means there is a bug somewhere, but he needs it to be working in order to access information to file a bug lol, kind of a catch 22. Thanks Storm
Hi, if the current version from the abs doesn't fit get the version that fits from the packages.git repo: https://projects.archlinux.org/svntogit/packages.git/log/trunk?h=packages/or... -- Jabber: atsutane@freethoughts.de Blog: http://atsutane.freethoughts.de/ Key: 295AFBF4 FP: 39F8 80E5 0E49 A4D1 1341 E8F9 39E4 F17F 295A FBF4
participants (4)
-
Dave Reisner
-
Simon Stoakley
-
Storm Dragon
-
Thorsten Töpper