Makefiles 101: cómo usar make como herramienta de automatización de tareas

Foto de Agto Nugroho en Unsplash

Parece que los desarrolladores tienen miedo de usar make, ya que lo asocian con la dolorosa experiencia de compilar cosas desde cero: el temido ./configure && make && make install.

Parte de este miedo se debe a la descripción de lo que hace make (1):

El propósito de la utilidad make es determinar automáticamente qué partes de un programa grande necesitan ser recompiladas, y emitir los comandos para recompilarlas.
Free Software Foundation Las páginas de manual de Linux

No todos saben que make se puede usar fácilmente para administrar tareas en sus proyectos. En este artículo, me gustaría compartir una breve introducción sobre cómo los Makefiles me ayudan a automatizar algunas tareas en mis actividades diarias. Esta breve guía se centrará en usar make como una herramienta de automatización para tareas en lugar de una herramienta para compilar código.

Ejecutando tareas

Comencemos simplemente creando un Makefile y definiendo una tarea para ejecutar:

tarea:
  fecha

Si ejecuta make task, se encontrará con el siguiente error:

/ tmp ᐅ hacer tarea
Makefile: 2: *** falta separador. Detener.

Y eso se debe a que los Makefiles usan pestañas para sangrar el código. Actualicemos nuestro ejemplo usando pestañas en lugar de espacios y ... Voilà.

/ tmp ᐅ hacer tarea
fecha
Vie 15 Jun 08:34:15 + 04 2018

¿Qué clase de brujería es esta? Bueno, entienda que quería ejecutar la tarea de sección de su archivo MAKE y ejecutó el código (fecha) dentro de esa sección en un shell, generando tanto el comando como su salida. Si desea omitir la salida del comando que se está ejecutando, simplemente puede prefijarlo con un signo @:

tarea:
  @fecha

Ejecutando el comando make nuevamente:

/ tmp ᐅ hacer tarea
Vie 15 Jun 08:34:15 + 04 2018

La primera tarea en un Makefile es la predeterminada, lo que significa que podemos ejecutar make sin ningún argumento:

/ tmp ᐅ make
Vie 15 Jun 08:37:11 + 04 2018

Ejecutar tareas adicionales

Puede agregar tareas adicionales en su Makefile y llamarlas con make $ TASK:

tarea:
  @fecha
algunos:
  dormir 1
  echo "Dormido"
cosa:
  California

Ejecutando el comando make nuevamente:

/ tmp ᐅ hacer algo
California
     Junio ​​2018
Su Mo Tu We Th Fr Sa
                1 2
 3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Ejecutar tareas en un orden específico

Muchas veces querrás ejecutar una tarea antes de la actual. Piense en ello como antes o después de ganchos en sus pruebas automatizadas. Esto se puede hacer especificando una lista de tareas justo después del nombre de la tarea:

tarea: cosa alguna
  @fecha
...

Ejecutando el comando make nuevamente:

/ tmp ᐅ hacer tarea
California
     Junio ​​2018
Su Mo Tu We Th Fr Sa
                1 2
 3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
dormir 1
echo "Dormido"
Dormido
Vie 15 Jun 08:40:23 + 04 2018

Usar variables con make

Definir y usar variables es bastante sencillo:

VAR = 123
print_var:
        echo $ {VAR}
...

Ejecutando el comando make nuevamente:

/ tmp ᐅ make print_var
echo 123
123

Pero tenga cuidado, ya que sus variables de shell no funcionarán de inmediato:

print_user:
        echo $ USER

Ejecutando el comando make nuevamente:

/ tmp ᐅ make print_user
echo SER
SER

Deberá escapar de ellos con $ {VAR} o $$ VAR.

Pasar banderas también es un poco diferente de lo que estás acostumbrado. Se posicionan como banderas pero usan la misma sintaxis que las variables de entorno:

print_foo:
  echo $$ FOO

Ejecutando el comando make nuevamente:

/ tmp ᐅ make print_foo
echo $ FOO
/ tmp ᐅ make print_foo FOO = bar
echo $ FOO
bar

Hacer y la cáscara

5.3.1 Elección del caparazón
------------------------
El programa utilizado como shell se toma de la variable 'SHELL'. Si esta variable no está configurada en su archivo MAKE, el programa '/ bin / sh' se usa como shell.

Make usará sh para ejecutar código en una tarea. Esto significa que algunas cosas podrían no funcionar, ya que probablemente esté utilizando alguna sintaxis específica de bash. Para cambiar, simplemente puede especificar la variable SHELL. En nuestro caso, nos gustaría usar SHELL: = / bin / bash.

Como se vio anteriormente, a veces necesitará usar una sintaxis peculiar y personalizada para obtener un comando de shell normal para trabajar en make. Al igual que las variables deben escaparse con un $$ o $ {...}, deberá usar el shell cuando use la sustitución de comandos:

subshell:
  echo $ (shell echo $ {USER})

Ejecutando el comando make nuevamente:

/ tmp ᐅ hacer subshell
echo alex
alex

¿No me crees? Intenta eliminar la instrucción de shell. Esto es lo que vas a obtener:

/ tmp ᐅ hacer subshell
eco

Conclusión

Hay mucho más que hacer y muchas cosas más extravagantes que tal vez necesites descubrir para disminuir el WPS (WTF por segundo) cuando trabajes con él.

Eso no niega el hecho de que make es una herramienta extremadamente útil que nos permite automatizar flujos de trabajo con facilidad (sin tener que configurar tuberías muy complicadas) escribiendo líneas separadas por tabulaciones con un montón de comandos de shell.

Publicado originalmente en odino.org (15 de junio de 2018).
Puedes seguirme en Twitter: ¡los comentarios son bienvenidos!