Author Topic: Como Crear Paquetes Ipk?  (Read 7672 times)

AXIM

  • Full Member
  • ***
  • Posts: 107
    • View Profile
Como Crear Paquetes Ipk?
« on: January 26, 2007, 05:50:44 am »
1º Esto es una consulta, para los que sepan
2º Mi ejemplo es que; quiero, pretendo adaptar Wlandecrypter a las zaurus, y comvertir el paquete de instalación, WepAttack & Wlandecrypter 0.5 Linux a instalables "ipk" para usar desde mi Zaurus.
3º la info de la que dispongo;


Descripción de archivos necesarios para crear el paquete .ipk

Creación de la estructura de directorios para el paquete .ipk

Para crear un paquete .ipk primero se necesita crear la estructura de directorios en la PC de escritorio con la misma estructura de directorios que existe en la Zaurus. La figura  muestra la estructura de directorios que se debe crear en la PC de escritorio.

[img]http://es.tldp.org/Manuales-LuCAS/doc-tesis-desarrollo-linux-PDAs/tesis-navegable/imagenes/apps/ipkg_dir.png\" border=\"0\" class=\"linked-image\" /]

Mini-manual sobre creación de paquetes para pdaxrom.
Estructura de los paquetes ipk
ipkg-temporal/
|-- CONTROL
|   `-- control
|-- etc
|   `-- file.conf
`-- usr
    |--apps
    |  `-- ejecutable
    |      `--AppInfo
    |      `--AppRun
    |      `--.DirIcon
    |-- bin
    |   `-- ejecutable
    `-- share
        |-- applications
        |   `-- ejecutable.desktop
        `-- pixmaps
            `-- ejecutable.png

elementos importantes:

- Fichero de control: Contiene información del paquete sobre su funcion, autor, versión. Un ejemplo de este fichero:

Package: liferea
Version: 1.0.21
Architecture: armv5tel
Maintainer: alex@hispasource.com
Description: news feed reader
Depends: libgtkhtml

Para obtener las dependencias correctas existe un script que nos dará las dependencias usando el comando lcc.

- /usr/apps y /usr/share: Contiene información e iconos para los manejadores de escritorio. En /usr/share/applications se guarda el icono que aparecera en los paneles de matchbox y en /usr/apps se guardan los iconos para rox. Es recomendable incluir ambos en los paquetes.

- Scripts: En el directorio CONTROL podemos introducir scripts que se ejecutarán durante la instalación y la desinstalación del paquete. Son muy utiles cuando además de copiar ficheros hay que realizar cualquier otra acción como crear un usuario. Son los siguientes:
· preinst:se ejecuta antes de copiar los ficheros.
· postinst:se ejecuta despues de instalar.
· prerm: se ejecuta antes de borrar los ficheros.
· postrm: se ejecuta una vez desinstalado el paquete.
Compilación

Existen dos opciones para compilar paquetes, aqui trataremos la más sencilla, compilar sobre la propia zaurus o un emulador como Xen. La otra forma es hacerlo con el toolchain (compilación cruzada), tiene un problema, y es que en la mayoría de los casos hace falta modificar los configures.

El procedimiento de compilación es el siguiente:
./configure && make (creamos config y compilamos).
mkdir ipkg-temporal
make DESTDIR=/ruta_completa/ipkg-temporal install

El resultado seá un paquete compilado y preparado para instalar en el directorio ipkg-temporal, ahora es el momento de preparar el fichero control y los ficheros de /usr/apps y /usr/share/application. También se puede aprovechar y eliminar la documentación o ponerla en otro paquete.
Reducir binarios
Para reducir el tamaño de los binarios tenemos que ejecutar: arm-linux-strip ejecutable El tamaño del binario se reduce en algunos casos considerablemente. Se debe hacer tanto con ejecutables como con librerias.
Crear fichero ipk

Existe un script diseñado para crear los paquetes, se llama mkipkg y esta en /opt/native. Con la ultima versión que estoy utilizando falla a la hora de hacer un tar --excude, tuve que modificarlo minimamente para adaptarlo a la version de tar que viene con pdaxrom.


Este manual en inglés


Necesito un empujon...

AXIM

  • Full Member
  • ***
  • Posts: 107
    • View Profile
Como Crear Paquetes Ipk?
« Reply #1 on: January 26, 2007, 07:28:51 am »
Pues algo más de info googleando...

Code: [Select]
http://blogantastico.blogspot.com/2006/12/creando-paquetes-ipk-para-la-fonera.html
Creando paquetes ipk para la fonera
Extracto biogénico de la mente de Nitz a las 17:55  

Bueno, pues aún no teniéndola leo todo lo que pillo sobre el tema.

Para empezar, podemos decir que la fonera tiene un procesador de 32bits MIPS de clase R4Kc (fuente) y un Linux 2.4.32 compilado especialmente para ese procesador. Por eso mismo no podemos usar programas compilados en una plataforma x86, sino que hay que compilarlos para la fonera (de eso hablaré otro día . Lo que sí que podemos hacer por el momento es crear bash scripts y ejecutarlos.

El problema viene a la hora de crear scripts que dependan de otros archivos (como por ejemplo mi fpt, que dependía de que el directorio /var/cache/fpt y el archivo /etc/fpt/sources.list estubieran creados). O tambien cuando intentamos instalar una libreria ¿Dónde la dejamos?. Para eso existen los paquetes ipk

¿Como podemos hacer un paquete con todo lo necesario? Pues siguiedo estos pasos...

Para mi practica voy a empaquetar mi propio script, con los directorios y los archivos necesarios.

Empecemos preparando el entorno

Creamos un directorio que será nuestra raiz de trabajo. Por ejemplo, en ~/paquete-fpt:
Code: [Select]
$ cd ~
$ mkdir paquete-fpt
$ cd paquete-fpt/
$ pwd
/home/user/paquete-fpt

Ahora creamos dos directorios: control y data
Code: [Select]
$ mkdir control
$ mkdir data

En data meteremos todos los archivos que hagan referencia a nuestro programa, pero siempre en una estructura de directorios como la de la fonera (osea, que si el archivo X va en el directorio /var/run/ de la fonera, crearemos el directorio ~/paquete-fpt/data/var/run/ y lo meteremos ahí).

Por otra parte, en el directorio control introduciremos toda la información que haga referencia a nuestro paquete (version, dependencias, autor...).

Finalmente debemos crear un ultimo archivo llamado debian-binary que contenga "2.0". Veamos como se crea:
Code: [Select]
$ echo 2.0 > debian-binary
Hecho


Rellenando el directorio data

Bien, para empezar nos metemos en el directorio data:
Code: [Select]
$ cd data
Ahora creamos los directorios donde metermos nuestros archivos. En total serán:
bin/ - Aquí meteremos el script
var/cache/fpt/ - Aquí no meteremos nada, ya que el script usa ese directorio solo para depositar los ipk descargados
etc/fpt/ - En este directorio meteremos el sources.list con la lista de directorios.
Procedamos:
Code: [Select]
$ mkdir bin
$ mkdir -p var/cache/fpt
$ mkdir -p etc/fpt

Con todos los directorios creados, vamos a crear ahora el sources.list. ¿Qué url's quereis poner? Yo pondre las mias, que son casi las únicas que conozco por el momento (origen de porqué las conozco) (pensad que aún no tengo la fonera
Code: [Select]
$ cd etc/fpt
$ echo http://fon.rogue.be/lafonera-experimental > sources.list
$ echo http://fon.rogue.be/lafonera/ >> sources.list
$ echo http://olsrexperiment.de/sven-ola/fonera >> sources.list

(Lo sé, estos tres "echo" podiamos haberlos evitado con echo -e http://fon.rogue.be/lafonera-experimental&...a/fonera").

¡Archivo de repositorios creado! Ahora copiamos el script a su respectivo directorio (bin/):
Code: [Select]
(suponiendo que esté en ~/codes/fpt el original)
$ cd ../..
$ pwd
/home/user/paquete-fpt
$ cd bin
$ cp ~/codes/fpt .

Hecho

El archivo control

Esta parte es la más dificil (comparada con las dos tonterias que hemos hecho antes). Aquí tenemos que definir todo nuestro paquete. Empecemos entrando en el directorio control:
Code: [Select]
$ cd ../..
$ pwd
/home/user/paquete-fpt
$ cd control

Ahora hay que crear un archivo con todo lo necesario. Iremos por partes.

1) El nombre del paquete. Vamos a llamarlo "fpt", así que creamos la primera linea del archivo:
Code: [Select]
$ echo Package: fpt > control
2) La versión. En el momento de escribir este articulo andaba por la 0.1.2, así que la introducimos en la siguiente linea:
Code: [Select]
$ echo Version: 0.1.2 >> control
3) Dependencias. Mmm... como mucho depende de wget y de ipkg (pero poner que depende de ipkg en un paquete ipk que se abre con ipkg es una paradoja, así que solo ponemos wget)
Code: [Select]
$ echo Depends: wget >> control
ATENCION: Aunque nuestro script no dependa de nada, tenemos que poner almenos una linea Depends vacia, por ejemplo:
Code: [Select]
$ echo Depends: >> control
4) El código fuente. Esto es opcional, pero si queremos aportar al software libre un granito de arena podemos poner una url o algo. Yo no pongo nada (más que nada porque el mismo script es el código).
Code: [Select]
$ echo Source: >> control
5) Sección. ¿A qué rama pertenece tu programa? ¿Es una aplicación? ¿Una libreria?. Mi script es una aplicación, así que la pondré en apps.
Code: [Select]
$ echo Section: apps >> control
6) Prioridad. Le podemos poner "opcional":
Code: [Select]
$ echo Priority: optional >> control
7) Mantenimiento. ¿Quien mantiene tu script? El mio lo mantiene Nitz, de OpenFon Team, un tio algo feo, pero bueno, supongo que servirá para el cargo.
Code: [Select]
$ echo Maintainer: Nitz, OpenFon Team >> control
8) La arquitectura. Todo lo que hagamos para la fonera debe tener una arquitectura mips, por lo tanto:
Code: [Select]
$ echo Architecture: mips >> control
9) Descripción del programa. Algo así como "Utilidad para instalar paquetes precompilados".
Code: [Select]
$ echo Description: Utilidad para instalar paquetes precompilados. >> control
Fin

Empaquetando y sirviendo al cliente

Ahora toca comprimir todo y finalmente crear el .ipk.

Empezamos comprimiento el directorio data:
Code: [Select]
$ cd ..
$ pwd
/home/user/paquete-fpt
$ cd data
$ tar -cvf data.tar.gz bin/ etc/ var/

Ya tenemos un archivo data.tar.gz listo, a por el control.tar.gz

Code: [Select]
$ cd ..
$ pwd
/home/user/paquete-fpt
$ cd control
$ tar -cvf control.tar.gz control

Y por último creamos el paquete que luego renombraremos a .ipk

Code: [Select]
$ cd ..
$ pwd
/home/user/paquete-fpt
$ tar -cvf fpt_0.1.2_mips.tar.gz debian-binary data/data.tar.gz control/control.tar.gz
$ mv fpt_0.1.2_mips.tar.gz fpt_0.1.2_mips.ipk

Y ¡zas! ¡En toda la boca! Ya tenemos nuestro paquete

AXIM

  • Full Member
  • ***
  • Posts: 107
    • View Profile
Como Crear Paquetes Ipk?
« Reply #2 on: January 26, 2007, 07:40:26 am »
Herramienta ipkg-build

La herramienta ipkg-build se puede descargar de la siguiente URL:
Code: [Select]
http://ipkgfind.handhelds.ord/details.phtml?package=ipkg-build
No va el enlace ¿algún otro?

. Una vez que se descarga ésta herramienta del Web, la cual es en realidad un shell script6.19, se puede extraer en algún directorio que este incluído en el PATH6.20 como p.e. /usr/bin. A continuación se muestra el uso básico de la herramienta:

Code: [Select]
$ ipkg-build ( directorio de trabajo donde los directorios para el ipk son creados )


HOWTO
http://www.zauruszone.com/howtos/ipkg howto.shtml
[span style=\'font-size:14pt;line-height:100%\']•attendance 1.0.0 arm.ipk[/span]
Code: [Select]
# tar ztf attendance_1.0.0_arm.ipk
./debian-binary
./data.tar.gz
./control.tar.gz
# tar ztf data.tar.gz
./
./opt/
./opt/QtPalmtop/
./opt/QtPalmtop/bin/
./opt/QtPalmtop/bin/AttData.py
./opt/QtPalmtop/bin/AttendApp.py
./opt/QtPalmtop/bin/QtUtil.py
./opt/QtPalmtop/bin/attend.py
./opt/QtPalmtop/bin/check-attend.py
./opt/QtPalmtop/apps/
./opt/QtPalmtop/apps/Applications/
./opt/QtPalmtop/apps/Applications/Attendance.desktop
./opt/QtPalmtop/pics/
./opt/QtPalmtop/pics/Attendance.png
./IPKG_BUILD.6217/
./IPKG_BUILD.6217/data.tar.gz


Code: [Select]
# tar ztf control.tar.gz
./
./control
# cat control
Package: attendance
Priority: optional
Version: 1.0.0
Architecture: arm
Section: qpe/applications
Maintainer: Dave Reed
Depends: python, PyQt
Description: Attendance program
# cat debian binary
2.0





script to build ipkg:
Code: [Select]
http://www.zauruszone.com/howtos/downloads/ipkg-build
Tampoco funciona este enlace

• in a build directory create a directory CONTROL containing the
control file; in the build directory create the opt directory
and all the contents of the opt directory listed in the above
data.tar.gz file, execute: ipkg . and it will create the
attendance_1.0.0_arm.ipk file




Script de ipkg.built

Code: [Select]
#!/bin/sh

# ipkg-build -- construct a .ipk from a directory
# Carl Worth
# based on a script by Steve Redler IV, steve@sr-tech.com 5-21-2001
set -e

ipkg_extract_value() {
    sed -e "s/^[^:]*:[[:space:]]*//"
}

required_field() {
    field=$1

    value=`grep "^$field:" < $CONTROL/control | ipkg_extract_value`
    if [ -z "$value" ]; then
  echo "ipkg-build: Error: $CONTROL/control is missing field $field";
  PKG_ERROR=1
    fi
    echo $value
}

pkg_appears_sane() {
    local pkg_dir=$1

    local owd=`pwd`
    cd $pkg_dir

    PKG_ERROR=0
    if [ ! -f "$CONTROL/control" ]; then
  echo "ipkg-build: Error: Control file $pkg_dir/$CONTROL/control not found."
  cd $owd
  return 1
    fi

    pkg=`required_field Package`
    version=`required_field Version | sed 's/.*://;'`
    arch=`required_field Architecture`
    required_field Maintainer >/dev/null
    required_field Description >/dev/null

    if echo $pkg | grep '[^a-z0-9.+-]'; then
  echo "ipkg-build: Error: Package name $name contains illegal characters, (other than [a-z0-9.+-])"
  PKG_ERROR=1;
    fi

    local bad_fields=`sed -ne 's/^\([^[:space:]][^:[:space:]]\+[[:space:]]\+\)[^:].*/\1/p' < $CONTROL/control | sed -e 's/\\n//'`
    if [ -n "$bad_fields" ]; then
  bad_fields=`echo $bad_fields`
  echo "ipkg-build: Error: The following fields in $CONTROL/control are missing a ':'"
  echo "    $bad_fields"
  echo "ipkg-build: This may be due to a missing initial space for a multi-line field value"
  PKG_ERROR=1
    fi

    for script in $CONTROL/preinst $CONTROL/postinst $CONTROL/prerm $CONTROL/postrm; do
  if [ -f $script -a ! -x $script ]; then
      echo "ipkg-build: Error: package script $script is not executable"
      PKG_ERROR=1
  fi
    done

    if [ -f $CONTROL/conffiles ]; then
  for cf in `cat $CONTROL/conffiles`; do
      if [ ! -f ./$cf ]; then
    echo "ipkg-build: Error: $CONTROL/conffiles mentions conffile $cf which does not exist"
    PKG_ERROR=1
      fi
  done
    fi

    cd $owd
    return $PKG_ERROR
}

###
# ipkg-build "main"
###

case $# in
1)
    dest_dir=.
;;
2)
    dest_dir=$2
;;
*)
    echo "Usage: ipkg-build []";
    exit 1
;;
esac

pkg_dir=$1

if [ ! -d $pkg_dir ]; then
    echo "ipkg-build: Error: Directory $pkg_dir does not exist"
    exit 1
fi

# CONTROL is second so that it takes precedence
CONTROL=
[ -d $pkg_dir/DEBIAN ] && CONTROL=DEBIAN
[ -d $pkg_dir/CONTROL ] && CONTROL=CONTROL
if [ -z "$CONTROL" ]; then
    echo "ipkg-build: Error: Directory $pkg_dir has no CONTROL subdirectory."
    exit 1
fi

if ! pkg_appears_sane $pkg_dir; then
    echo "Please fix the above errors and try again."
    exit 1
fi

tmp_dir=$dest_dir/IPKG_BUILD.$$
mkdir $tmp_dir

tar -C $pkg_dir -czf $tmp_dir/data.tar.gz . --exclude=$CONTROL
tar -C $pkg_dir/$CONTROL -czf $tmp_dir/control.tar.gz .

echo "2.0" > $tmp_dir/debian-binary

pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk
tar -C $tmp_dir -czf $pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz
rm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz
rmdir $tmp_dir

echo "Packaged contents of $pkg_dir into $pkg_file"


Index of /projects/opensource/openwrt
Code: [Select]
http://www.netmonks.ca/projects/opensource/openwrt/
IPKG Howto
Code: [Select]
http://www.oesf.org/index.php?title=IPKG_Howto


Index of /pub/handhelds.org/packages/ipkg-utils
Code: [Select]
http://www.gtlib.gatech.edu/pub/handhelds.org/packages/ipkg-utils/
app-arch/ipkg-utils Gentoo
Code: [Select]
http://gentoo-portage.com/app-arch/ipkg-utils