GNU Make tukee nykyään Scheme-kieltä

Sain viime yönä sattumalta tietää, että GNU-projektin Make-toteutus tukee Guile-tulkin kautta Scheme-ohjelmointikieltä. Joku anonyymi tyyppi kertoi, että tuki on ollut GNU Makessa tammikuusta 2012 lähtien eli yli kuusi ja puoli vuotta. Ensimmäinen tuon ominaisuuden mahdollistava versio on hänen mukaansa 3.82.90. Hän oli kaivanut esiin seuraavat tiedot:

Version 3.82.90
* New feature: GNU Guile integration
  This version of GNU make can be compiled with GNU Guile integration.
  GNU Guile serves as an embedded extension language for make.
  See the "Guile Function" section in the GNU Make manual for details.

Fedora Linux 28 sisältää GNU Make version 4.2.1:

[kalevi@localhost ~]$ make --version
GNU Make 4.2.1
Built for x86_64-redhat-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Mutta kuten huomasit, dokumentaatiossa sanottiin ainoastaan: "[ … ] GNU make can be compiled with GNU Guile integration [ … ]". Nyt ellei tukea ole jostain syystä päätetty poistaa (mikä on epätodennäköistä), niin voimme olettaa, versiosta 3.82.90 eteenpäin myös kaikki uudemmat versiot tukevat Guile-tulkin embeddausta ajettavaan GNU make binääriin.

Siispä lähes takuuvarmasti GNU Maken versio 4.2.1 on sekin helposti mahdollista kääntää siten, että Scheme-kieli on tuettuna siinä. Mutta meidän tulee tajuta, että kyse on lähdekoodin käännösaikaisesta omasta valinnasta eikä mikään pakota eri jakelijoita kuten Red Hattia, Fedora-projektia, Ubuntua tai ketään muutakaan ottamaan tukea käyttöön.

Tarkistin siis Fedora 28:ssa ldd-komennolla mitä jaettuja kirjastoja sen mukana tulevaan make-ohjelmaan oli käännösaikana linkattu. Heti toiselta riviltä selviää, että 64-bittinen /lib64/libguile-2.0.so.22 kirjasto on linkattu kyseiseen binääriin:

[kalevi@localhost ~]$ ldd /usr/bin/make
linux-vdso.so.1 (0x00007ffcef3ee000)
libguile-2.0.so.22 => /lib64/libguile-2.0.so.22 (0x00007fada82e9000)
libgc.so.1 => /lib64/libgc.so.1 (0x00007fada7f8c000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fada7d88000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fada7b69000)
libc.so.6 => /lib64/libc.so.6 (0x00007fada77aa000)
libffi.so.6 => /lib64/libffi.so.6 (0x00007fada75a1000)
libunistring.so.2 => /lib64/libunistring.so.2 (0x00007fada7220000)
libgmp.so.10 => /lib64/libgmp.so.10 (0x00007fada6fa4000)
libltdl.so.7 => /lib64/libltdl.so.7 (0x00007fada6d9a000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fada6b67000)
libm.so.6 => /lib64/libm.so.6 (0x00007fada67d3000)
/lib64/ld-linux-x86-64.so.2 (0x00007fada88b8000)
libatomic_ops.so.1 => /lib64/libatomic_ops.so.1 (0x00007fada65d0000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fada63b8000)

Jos haluamme vielä lisää varmuutta, niin voimme tarkistaa mistä RPM-paketista kyseinen kirjasto on asennettu:

[kalevi@localhost ~]$ rpm -qf /lib64/libguile-2.0.so.22
guile-2.0.14-7.fc28.x86_64

En osaa sanoa miten laajalti Makefile-tiedostoissa uskaltaa nykyään käyttää Scheme-kieltä. Maailmalla on kuitenkin iso määrä vanhoja make-binääreitä, jotka eivät ymmärrä Schemen päälle yhtään ja kohdatessaan Makefile:n, jossa sitä on, ne sekoavat eivätkä pysty tulkitsemaan Makefile:ä oikein.

Lisäksi, kuten näimme, vaikka make olisikin riittävän uusi, mikään ei takaa, että siihen olisi käännnetty mukaan tuki Scheme-kielelle.

GNU-projektin sivuilla on myös Maken manuaali ja siellä on oma osionsa, jossa selitetään Guileen liittyviä asioita. Lienee hyvä jossain vaiheessa tutustua tähänkin ominaisuuteen vähän paremmin. En ole mikään maailman suurin Lisp- tai Scheme-fani, mutta kyllä niillekin kielille löytyy käyttöä monessakin asiassa.

Kun nyt tätä GNU Make integraatiota vielä mietin, niin varmaan juuri tällaisessa kontekstissa Scheme voi olla käytännöllinen laajennuskieli. Tietääkseni GNU GIMP sisältäisi myös Scheme-tuen, mutta en ole ihan varma. Joskus olen kuitenkin automatisoinut GIMP:in kuvankäsittelyä jollain skriptikielellä, jota se tuki. En vain mitenkään pysty muistamaan oliko kyseinen kieli Schemeä vai kenties ennemminkin Pythonia.