#!/bin/sh
# Copyright (C) 2010 Matias A. Fonzo, Santiago del Estero, Argentina
#
# 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 3 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 .
# Usage:
#
# If you want to build a whole section, type:
# ./xorg-builder lib
#
# If you want to build a specific source of a section:
# ./xorg-builder lib libX11
### URL: http://xorg.freedesktop.org/releases/
# Variables #
# Iniciales:
currentWorkDir=$(pwd) # Directorio actual de trabajo.
tempDir=${tempDir:-/tmp} # Directorio temporal base.
outDir=${outDir:-/tmp/packages/xorg} # Directorio de salida de los paquetes.
buildDir=${tempDir}/xorg-buildir # Directorio temporal de construcción.
# Para el programa:
CFLAGS=${CFLAGS:=-O2 -march=i486 -mtune=i686}
CXXFLAGS=${CXXFLAGS:=-O2 -march=i486 -mtune=i686}
libSuffix=${libSuffix:-""} # Sufijo exportado usualmente para x86_64.
Arch=${Arch:-i486} # Arquitectura.
buildNum=${buildNum:-1} # Número de construcción.
numJobs=${numJobs:=-j5} # Trabajos para el compilador.
# Funciones #
# Muestra la ayuda:
Usage()
{
printf "%s\n" "" "Usage:" \
"" \
"If you want to build a whole section, type:" \
"$0 lib" \
"" \
"If you want to build a specific source of a section:" \
"$0 lib libX11" \
""
}
# Una función para crear directorios limpios:
CreateDirs()
{
local X Y
X="$1"
Y="$2"
rm -rf $X
mkdir -p $X $Y
}
# Corrige los permisos de la fuente:
FixPermissions()
{
chown -R 0:0 "$1"
find . \
\( -perm 2777 -o \
-perm 777 -o \
-perm 775 -o \
-perm 711 -o \
-perm 555 -o \
-perm 511 \
\) -exec chmod 755 {} + \
-o \
\( -perm 666 -o \
-perm 664 -o \
-perm 600 -o \
-perm 444 -o \
-perm 440 -o \
-perm 400 \
\) -exec chmod 644 {} +
}
# Corrige las locaciones de los directorios de documentación:
FixDocDirs()
{
# Movemos los directorios de documentación puesto que
# no queremos dichos directorios bajo usr/share:
for Directory in man info doc ; do
if [ -d usr/share/${Directory} ]; then
mv usr/share/${Directory} usr/${Directory}
fi
done
rmdir usr/share 2> /dev/null
}
# Función para comprimir y enlazar (si es necesario) las páginas de manual:
CompressAndLinkManpages()
{
if [ -d usr/man ]; then
(
cd usr/man
find . -type f -exec gzip -9N '{}' +
find . -type l | while read File ; do
ln -sf $(readlink $File).gz ${File}.gz
rm $File
done
)
fi
}
# Función que copia las páginas de información de GNU:
CompressInfoPages()
{
if [ -d usr/info ]; then
rm -f usr/info/dir
gzip -9N usr/info/*
fi
}
# Función que copia los archivos de documentación:
CopyDocumentation()
{
# Crea el directorio de documentación y busca para copiar los archivos:
mkdir -p usr/doc/${sourceName}-${sourceVersion}
for File in AUTHORS COPYING ChangeLog NEWS README ; do
if [ -f ${buildDir}/${sourceName}-${sourceVersion}/$File ]; then
cp -pP \
${buildDir}/${sourceName}-${sourceVersion}/$File \
usr/doc/${sourceName}-${sourceVersion}
fi
done
# Algunas fuentes instalan el directorio de documentación con sólo el
# nombre de la fuente. Cuando nosotros, lo que queremos, es tener el
# directorio de documentación bajo -:
if [ -d ${packageDir}/usr/doc/${sourceName} ]; then
mv ${packageDir}/usr/doc/${sourceName}/* usr/doc/${sourceName}-${sourceVersion}
rmdir ${packageDir}/usr/doc/${sourceName} 2> /dev/null
fi
}
## Cuerpo de la receta ##
cd src || exit 99; # Ingresa o sale del directorio que contiene las fuentes.
export CFLAGS CXXFLAGS libSuffix
for Directory in doc proto lib data app xserver driver font util ; do
# Comprueba el primer argumento:
if [ -n "$1" ]; then
if [ "$1" != $Directory ]; then
continue;
fi
else # Imprime la ayuda:
Usage
exit;
fi
# Variable del directorio del paquete (de toda una sección):
packageDir=${buildDir}/package-${Directory}
# Crea el directorio del paquete y el de salida:
CreateDirs "$packageDir" "$outDir"
# Tomamos los datos que necesitamos de cada fuente para construir el paquete:
for Tarball in ${Directory}/*.tar.lz ; do
sourceName="$(basename $Tarball .tar.lz)"
sourceVersion="${sourceName##*-}"
sourceName="${sourceName%-*}"
# Verifica el nombre de la fuente en la lista-negra:
if grep -qw "$sourceName" ${currentWorkDir}/BLACKLIST 2> /dev/null ; then
continue;
fi
# Verifica la lista de las fuentes que poseen una arquitectura independiente:
archPackage=$Arch # Resetea la variable.
if grep -q "^${sourceName}" ${currentWorkDir}/NOARCHLIST 2> /dev/null ; then
archPackage=noarch
fi
# Comprueba el segundo argumento:
if [ -n "$2" ]; then
if [ "$2" = "${sourceName}" ] || [ "$2" = "$Tarball" ]; then
# Asigna el directorio del paquete:
packageDir=${buildDir}/package-${sourceName}
CreateDirs "$packageDir" "$outDir"
else
continue;
fi
# Comprueba si el segundo argumento está incluido en la lista esperada:
if [ -f ${currentWorkDir}/BUILDLIST ]; then
if ! grep -q "^${Directory}/$sourceName" ${currentWorkDir}/BUILDLIST ; then
continue;
fi
fi
fi
(
# Hora de construir la fuente:
cd $buildDir
# Descomprime el tarball:
rm -rf ${sourceName}-${sourceVersion}
lzip -cd ${currentWorkDir}/src/$Tarball | tar -xvf -
# Ingresamos al directorio de la fuente y lo purgamos:
cd ${sourceName}-${sourceVersion}
FixPermissions .
# Si es necesario aplicamos un parche:
if [ -x ${currentWorkDir}/patches/${sourceName} ]; then
. ${currentWorkDir}/patches/${sourceName}
fi
# Configuramos la fuente:
# Determina el tipo de sistema donde se construye.
if [ "$archPackage" != "noarch" ]; then
BUILD_SYSTEM="--build=${Arch}-dragora-linux-gnu"
fi
# Si es necesario usamos un `configure' personalizado:
if [ -f ${currentWorkDir}/configure/${sourceName} ]; then
. ${currentWorkDir}/configure/${sourceName}
else # Usa el `configure' por defecto:
. ${currentWorkDir}/configure/default
fi
# Ahora -- construimos:
make $numJobs || make || exit 99;
make install DESTDIR=$packageDir
# Purgamos los binarios y las librerías para una buena medida:
(
cd $packageDir
find . -type f | xargs file | awk '/ELF/ && /executable/ || /shared object/' | \
cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
find . -type f | xargs file | awk '/current ar archive/' | \
cut -f 1 -d : | xargs strip --strip-debug 2> /dev/null
)
# Si es necesario recurrimos a pasos adicionales:
if [ -x "${currentWorkDir}/postmake/${sourceName}" ]; then
. "${currentWorkDir}/postmake/${sourceName}"
fi
# Comprimimos, enlazamos y copiamos para el resto de nuestro paquete:
cd $packageDir
FixDocDirs
CompressInfoPages
CompressAndLinkManpages
CopyDocumentation
# Introducimos los archivos de descripción:
if [ -d ${currentWorkDir}/descriptions/$sourceName ]; then
mkdir -p description/
cp ${currentWorkDir}/descriptions/${sourceName}/* ${packageDir}/description/
else # Reportar descripción perdida:
echo "$sourceName" >> ${currentWorkDir}/missing.descriptions
fi
# Determina el número de construcción para el paquete. Según,
# indicaciones en un archivo o de la variable ya establecida:
if [ -f ${currentWorkDir}/buildnum/$sourceName ]; then
buildNum=$(cut -f 1 -d ' ' ${currentWorkDir}/buildnum/${sourceName})
fi
# Hacemos el paquete:
if [ -x ${currentWorkDir}/makepkg/$sourceName ]; then
. ${currentWorkDir}/makepkg/$sourceName
else
makepkg -l \
${outDir}/${sourceName}-${sourceVersion}-${archPackage}-${buildNum}.tlz
fi
)
done
done