forked from sergiotarxz/Blag
Adding meson guide.
This commit is contained in:
parent
c6262d784d
commit
4ed4b319d4
211
content/posts/004-meson-libraries.md
Normal file
211
content/posts/004-meson-libraries.md
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
---
|
||||||
|
title: "El sistema de compilación Meson y las librerias"
|
||||||
|
date: 2022-01-24T20:32:57+01:00
|
||||||
|
draft: false
|
||||||
|
weight: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
## El sistema de compilación Meson.
|
||||||
|
|
||||||
|
### ¿Por qué usar un sistema de compilación automatizado?
|
||||||
|
|
||||||
|
Aunque es ciertamente posible escribir todo un proyecto en un único archivo, conforme
|
||||||
|
la complejidad aumente probablemente queramos dividirlo en varios ficheros, lo
|
||||||
|
cual hará cada vez más compleja nuestra llamada a `gcc` y ciertamente para
|
||||||
|
cualquier cosa no trival querremos poder usar librerías para facilitar dicho
|
||||||
|
trabajo.
|
||||||
|
|
||||||
|
Eso es lo que nos aporta Meson, la posibilidad de escalar nuestro proyecto
|
||||||
|
(o más bien su compilación.) de una forma declarativa e intuitiva.
|
||||||
|
|
||||||
|
### ¿Como comienzo a usar Meson?
|
||||||
|
|
||||||
|
La forma más sencilla de usar Meson en nuestro proyecto es crear un fichero
|
||||||
|
meson.build en su raíz, usemos por ejemplo el código final de la anterior
|
||||||
|
sección del tutorial.
|
||||||
|
|
||||||
|
Ejecutamos:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mkdir example
|
||||||
|
cd example
|
||||||
|
mkdir src include
|
||||||
|
```
|
||||||
|
|
||||||
|
Y una vez creados los directorios creamos los siguientes ficheros en
|
||||||
|
el proyecto.
|
||||||
|
|
||||||
|
`src/main.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
COLOR_CYAN = 1,
|
||||||
|
COLOR_VERDE = 2,
|
||||||
|
COLOR_AMARILLO = 4
|
||||||
|
} Color;
|
||||||
|
|
||||||
|
struct prueba {
|
||||||
|
int numero;
|
||||||
|
char *hola;
|
||||||
|
Color color;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct prueba *
|
||||||
|
create_struct_prueba_allocated (char *hola) {
|
||||||
|
struct prueba *prueba = malloc (sizeof *prueba);
|
||||||
|
|
||||||
|
prueba->numero = 42;
|
||||||
|
prueba->hola = hola;
|
||||||
|
prueba->color = COLOR_CYAN;
|
||||||
|
|
||||||
|
return prueba;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
create_array_hola_allocated (size_t *hola_len) {
|
||||||
|
char hola[] = { 'h', 'o', 'l', 'a', '\0' };
|
||||||
|
size_t hola_to_return_len = sizeof hola;
|
||||||
|
char *hola_to_return = malloc (hola_to_return_len * sizeof *hola_to_return);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < hola_to_return_len; i++) {
|
||||||
|
hola_to_return[i] = hola[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hola_len) {
|
||||||
|
*hola_len = hola_to_return_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hola_to_return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv) {
|
||||||
|
size_t hola_len = 0;
|
||||||
|
char *hola = create_array_hola_allocated (&hola_len);
|
||||||
|
struct prueba *prueba = create_struct_prueba_allocated (hola);
|
||||||
|
printf ("%d %d %s\n", prueba->numero, prueba->color, prueba->hola);
|
||||||
|
|
||||||
|
free (hola);
|
||||||
|
hola = NULL;
|
||||||
|
free (prueba);
|
||||||
|
prueba = NULL;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`meson.build`:
|
||||||
|
|
||||||
|
```
|
||||||
|
project('example', 'c')
|
||||||
|
|
||||||
|
inc = include_directories('include')
|
||||||
|
|
||||||
|
sources = [
|
||||||
|
'src/main.c',
|
||||||
|
]
|
||||||
|
|
||||||
|
executable('example',
|
||||||
|
sources,
|
||||||
|
include_directories : inc,
|
||||||
|
install : true,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Ahora simplemente ejecutando:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
meson build
|
||||||
|
meson compile -C build
|
||||||
|
sudo meson install -C build
|
||||||
|
```
|
||||||
|
|
||||||
|
Habremos compilado el proyecto y podremos ejecutarlo escribiendo:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
example
|
||||||
|
```
|
||||||
|
|
||||||
|
## Librerias
|
||||||
|
|
||||||
|
Digamos que queremos hacer una aplicación gráfica, gracias a meson
|
||||||
|
podremos usar gtk de una forma sencilla, veamos como:
|
||||||
|
|
||||||
|
En primer lugar buscaremos el nombre de la librería en
|
||||||
|
pkg-config:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
pkg-config --list-package-names | grep gtk
|
||||||
|
```
|
||||||
|
|
||||||
|
En este caso salen varias, pero la que buscamos es `gtk4`.
|
||||||
|
|
||||||
|
`meson.build`:
|
||||||
|
|
||||||
|
```
|
||||||
|
project('example', 'c')
|
||||||
|
|
||||||
|
inc = include_directories('include')
|
||||||
|
|
||||||
|
example_dependencies = [
|
||||||
|
dependency('gtk4'),
|
||||||
|
]
|
||||||
|
|
||||||
|
sources = [
|
||||||
|
'src/main.c',
|
||||||
|
]
|
||||||
|
|
||||||
|
executable('example',
|
||||||
|
sources,
|
||||||
|
dependencies : example_dependencies,
|
||||||
|
include_directories : inc,
|
||||||
|
install : true,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Copiemos el ejemplo de la documentación de GTK4:
|
||||||
|
|
||||||
|
`src/main.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
activate (GtkApplication* app, gpointer user_data) {
|
||||||
|
GtkWidget *window;
|
||||||
|
|
||||||
|
window = gtk_application_window_new (app);
|
||||||
|
gtk_window_set_title (GTK_WINDOW (window), "Window");
|
||||||
|
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
|
||||||
|
gtk_widget_show (window);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv) {
|
||||||
|
GtkApplication *app;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
|
||||||
|
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
|
||||||
|
status = g_application_run (G_APPLICATION (app), argc, argv);
|
||||||
|
g_object_unref (app);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Y compilemoslo con:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
meson compile -C build
|
||||||
|
sudo meson install -C build
|
||||||
|
example
|
||||||
|
```
|
||||||
|
|
||||||
|
Deberíamos ver una ventana vacía de GTK.
|
||||||
|
|
||||||
|
De esta forma podemos incluir cualquiera de las muchas librerias de C
|
||||||
|
para apoyarnos en el desarrollo sin necesidad de estar copiando linker flags
|
||||||
|
y cflags en nuestro código gracias a la integración de Meson y pkg-config.
|
Loading…
Reference in New Issue
Block a user