You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.0 KiB
Markdown

---
title: "Compilación de un programa en C utilizando un Makefile"
date: 2022-10-16T23:46:57+02:00
draft: False
image: featured.png
categories:
- práctica
- Administración de Sistemas Operativos
tags:
- C
- compilación
---
**Enunciado:** Elige el programa escrito en C que prefieras y comprueba en las fuentes que exista un fichero Makefile o Configure. Deberás compilar desde las fuentes.
Realiza los pasos necesarios para compilarlo e instálalo en tu equipo en un directorio que no interfiera con tu sistema de paquetes (/opt, /usr/local, etc.)
La corrección se hará en clase y deberás ser capaz de explicar qué son todos los ficheros que se hayan instalado y realizar una desinstalación limpia.
El programa elegido es `htop`, ya que está escrito en **C**. De momento no tiene ninguno de los ficheros requeridos, pero ejecutando el script `autogen.sh` se crea el fichero configure.
## Instalación
Para obtener las fuentes ejecutamos el siguiente comando:
```bash
apt source htop
```
ó
```bash
wget http://deb.debian.org/debian/pool/main/h/htop/htop_3.0.5.orig.tar.gz
tar -xvf htop_3.0.5.orig.tar.gz
```
### Configure
De momento el fichero no existe. Ejecutamos `autogen.sh`. Necesitaremos además el paquete `autoconf`:
```bash
sudo apt install autoconf
```
```bash
./autogen.sh
```
![ejecucion script autogen](autogen.png)
Podemos comprobar que se ha generado el fichero **configure**:
![ls del directorio de htop](ls-directorio.png)
Podemos ejecutar el fichero configure directamente. Sin embargo, de cara a una desinstalación más sencilla y a poder tener más localizados los ficheros instalados, vamos a cambiar la ruta que hay por defecto, al directorio `opt`. Se hace añadiendo la siguiente opción:
```bash
sudo mkdir /opt/htop
./configure --prefix=/opt/htop/
```
![salida de la ejecución de configure](configure.png)
En el caso de que se de algún error en la salida del comando, hay que instalar las **dependencias** indicadas, y repetir el paso anterior.
```bash
sudo apt install libncurses*
```
### Makefile
Para poder ejecutar `make` necesitamos el paquete `build-essential`, que contiene las utilidades esenciales para compilar un paquete en Debian.
```bash
sudo apt install build-essential
```
Para instalar el paquete ejecutamos:
```bash
sudo make install
sudo make clean
```
Para generar el fichero `.deb` es **necesario** que el paquete descargado sea con `apt source`, o la versión específica de debian.
o bien, para generar el fichero .deb:
instalamos las siguientes dependencias:
```bash
sudo apt install libnl-3-dev libnl-genl-3-dev libsensors-dev pkg-config debhelper-compat
# o bien con apt-get build-dep
sudo apt-get build-dep htop
```
```bash
make
dpkg-buildpackage -b
make clean
sudo dpkg -i ../htop_3.0.5-7_amd64.deb
```
![ejecucion de comando make](make.png)
El paquete ya está instalado. Podemos comprobar los ficheros creados en `/opt`:
![tree del directorio htop](tree-htop.png)
Entre los ficheros que aparecen, los más importantes son el propio **binario** de htop, y el **manual**.
Para poder utilizar el comando la terminal tenemos que añadirlo al **PATH**. Para hacerlo, añadimos la siguiente línea al fichero `.bashrc`:
```bash
export PATH="/opt/htop/bin:$PATH"
```
### Manual
Ya que lo hemos instalado en un directorio personal, no se ha creado el manual. Para hacerlo tenemos que crear un enlace simbólico:
```bash
sudo mkdir /usr/local/man/man1
sudo ln -s /opt/htop/share/man/man1/* /usr/local/man/man1/
```
## Desinstalación
Para desinstalar el paquete vamos a utilizar otra vez el comando make, esta vez con la opción `uninstall`:
```bash
sudo make uninstall
```
![ejecucion de make uninstall](desinstalar.png)
Tras eso, comprobamos si queda algo en la ubicación de la instalación:
![estructura residual](estructura.png)
la estructura de carpetas no se ha borrado, la borramos de manera manual.
Por último, hay que eliminar la línea de `.bashrc` que añade la ruta al `PATH` y eliminar el enlace simbólico:
```bash
sudo rm /usr/local/man/man1/htop.1
```