G-கோவைகள் Makeயை வெல்லுமா?

Table of Contents

G-கோவைகள் Makeயை வெல்லுமா?

Published by Arun Isaac on

In other languages: English

Tags: மென்பொருள், guix, lisp, scheme

Guixயின் G-கோவைகளுடன் Makeயை விடச் சிறந்த நிரல்பெயர்ப்புக் கருவியை (build tool) அமைக்க இயலுமா? அத்தகைய நிரல்பெயர்ப்புக் கருவி எவ்வாறு இருக்கும்?

பல நிரல்பெயர்ப்பு அமைப்புகளின் (build system) அடித்தளம் Make. ஆனால் Make அதன் குறைகளுக்கும் எரிச்சல்களுக்கும் பெயர் பெற்றதும் கூட. புதியதோர் சிறந்த Make போன்ற நிரல்பெயர்ப்புக் கருவி அமைக்க முயற்சிகள் ஏராளம். இப்பதிவு அம்முயற்சிகளுளொன்று—இம்முறை துல்லியம் மிக்க Guix செயல்பணி நிரல்பொதிப்பானுடன் (functional package manager).

இதைப் பற்றி என்னைச் சென்ற Guix இலண்டன் சந்திப்பில் எண்ணத் தூண்டிய டேனுக்கு நன்றி.

G-கோவைகள்: ஒருத் தொடக்கப் பாடம்

அகத்தே Guix G-கோவைகளால் செயல் பெறுவது. G-கோவைகள் Scheme மொழியில் உட்பதிந்த பொருள்வன்மையும் நயமும் மிக்க துறைசார் மொழி. G-கோவைகள் Guix மறைநிரல் (daemon) ஆக்கவேண்டிய கணிப்புகளைத் தெரிவிப்பதற்கான மொழி. G-கோவைகள் வருவிகளுக்குப் (derivations) பெயர்க்கப்பட்டு கணிப்பிற்காக Guix மறைநிரலுக்கு RPC மூலம் அனுப்பப்படுகின்றன.

இப்பதிவில் local-file, computed-file ஆகிய இரண்டை பயன்படுத்துவோம். அதைப் பற்றி அறியாதோர்க்கு முதலில் ஒரு அறிமுகம்.

கிடங்குருப்படிகளை (store items) அமைத்தல்

முதலில் computed-file. இது ஏதேனும் Scheme நிரலை இயக்கிக் கிடங்குருப்படியொன்றை அமைக்கப் பயன்படுவது. எடுத்துக்காட்டிற்கு, Hello world என்னும் உரையையுடைய foo என்னும் கிடங்குருப்படியை அமைக்கப் பயன்படும் computed-file இதோ.

;; foo.scm
(use-modules (guix gexp))

(define foo-gexp
  #~(begin
      (call-with-output-file #$output
        (lambda (port)
          (display "Hello world" port)
          (newline port)))))

(computed-file "foo" foo-gexp)

#~, #$ என்பவை gexp, ungexp ஆகும். இவை பின்மேற்கோள் (`), மேற்கோள்விலக்கி (,) ஆகியவற்றைப் போன்றவை. G-கோவை வருவியாகப் பெயர்க்கப்படும்போது #$output என்பது வெளியீட்டுக் கிடங்குருப்படியின் முழுப் பாதையாக மாற்றப்படுகிறது.

foo.scm யை இவ்வாறுப் பெயர்க்கலாம்.

$ guix build -f foo.scm
The following derivation will be built:
  /gnu/store/x1szpqlnl53sggl6zvfqjab426672v0q-foo.drv
building /gnu/store/x1szpqlnl53sggl6zvfqjab426672v0q-foo.drv...
successfully built /gnu/store/x1szpqlnl53sggl6zvfqjab426672v0q-foo.drv
/gnu/store/dnrq880msz18bs0knddvvf1lb0hb5z27-foo

/gnu/store/dnrq880msz18bs0knddvvf1lb0hb5z27-foo உள்ளே Hello world இருப்பதைக் காணலாம்.

$ cat /gnu/store/dnrq880msz18bs0knddvvf1lb0hb5z27-foo
Hello world

கிடங்கிற்குள் கோப்புகளைப் புகுத்தல்

computed-file ஒன்று கிடங்கிற்குப் புறத்தே இருக்கும் கோப்பு மீது ஏதோ வினையாற்ற வேண்டுமெனக் கருதலாம். Guix மறைநிரலால் கிடங்குருப்படிகளை மட்டுமே காண இயலும். அதனால் முதலில் நம் கோப்பைக் கிடங்கிற்குள் புகுத்த வேண்டும். இதற்குப் பயன்படுவது local-file.

foo கோப்பை கிடங்கிற்குள் புகுத்தி அதன் அளவைக் கண்டறிந்து length என்னும் கிடங்குருப்படியில் இடும் நிரலைக் கீழ்க்காணலாம்.

;; length.scm
(use-modules (guix gexp))

(define length-gexp
  #~(begin
      (use-modules (rnrs bytevectors)
                   (rnrs io ports))

      (call-with-output-file #$output
        (lambda (port)
          (display (bytevector-length
                    (call-with-input-file #$(local-file "foo")
                      get-bytevector-all))
                   port)
          (newline port)))))

(computed-file "length" length-gexp)

முன் போல், #$ அகத்தே இருக்கும் தொகுதி உட்புகுத்தப்பட்ட கோப்பின் முழுப் பாதையாக மாற்றப்படுகிறது. இன்னிரலைப் பெயர்த்து அதன் வெளியீட்டைத் திறந்துப் பார்த்தால்:

$ cat foo
The quick brown fox jumps over the lazy dog.
$ guix build -f length.scm
The following derivation will be built:
  /gnu/store/msm070kdk94vn5lwwnh6h2h0a4f0pfng-length.drv
building /gnu/store/msm070kdk94vn5lwwnh6h2h0a4f0pfng-length.drv...
successfully built /gnu/store/msm070kdk94vn5lwwnh6h2h0a4f0pfng-length.drv
/gnu/store/m5v48lgiq0wkkybm77kxcvayf1c5mhqk-length
$ cat /gnu/store/m5v48lgiq0wkkybm77kxcvayf1c5mhqk-length
45

நம் G-கோவை நிரல்பெயர்ப்பமைப்பு

Hello world

அறிமுகம் முடிந்தது. இப்போது C மொழியில் இயற்றப்பட்ட எளிய hello world நிரலை நம் G-கோவை நிரல்பெயர்ப்பு அமைப்புடன் பெயர்க்கலாம். hello.c நிரல் இதோ.

#include <stdio.h>

int main ()
{
  printf("Hello world!\n");
  return 0;
}

பெயர்ப்பு முறையை make.scm என்னும் கோப்பில் G-கோவைகளாக எழுதலாம்.

(use-modules (gnu packages commencement)
             (guix gexp))

(define hello-gexp
  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils))

        (set-path-environment-variable "PATH"
                                       '("bin")
                                       (list #$gcc-toolchain))
        (set-path-environment-variable "C_INCLUDE_PATH"
                                       '("include")
                                       (list #$gcc-toolchain))
        (set-path-environment-variable "LIBRARY_PATH"
                                       '("lib")
                                       (list #$gcc-toolchain))
        (invoke "gcc" #$(local-file "hello.c")
                "-o" #$output))))

(computed-file "hello" hello-gexp)

இதைப் பெயர்த்து இயக்கினால்:

$ guix build -f make.scm
The following derivation will be built:
  /gnu/store/0rdw34dj0wpk6xfd5pbavf0xbjp84nw0-hello.drv
building /gnu/store/0rdw34dj0wpk6xfd5pbavf0xbjp84nw0-hello.drv...
environment variable `PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/bin'
environment variable `C_INCLUDE_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/include'
environment variable `LIBRARY_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/lib'
successfully built /gnu/store/0rdw34dj0wpk6xfd5pbavf0xbjp84nw0-hello.drv
/gnu/store/y72klmvlmf4v7kbhp6krpj8rbv4xracq-hello
$ /gnu/store/y72klmvlmf4v7kbhp6krpj8rbv4xracq-hello
Hello world!

Make போன்றே, hello.c மாறினால் மட்டுமே hello பெயர்க்கப்படுகின்றது. ஆனால், Make போல் அல்லாது, hello-gexp மாறினாலும் hello மீண்டும் பெயர்க்கப்படும். இது Makefile மாறிவிட்டதென உணர்ந்துத் தக்கச் செயலாற்றும் Make போல். அதோடு நின்று விடாமல், gcc-toolchain மாறினாலோ அதை உருவாக்கப் பயன்பட்ட என்னிரலும் மாறினாலோ அதையும் உணர்ந்துத் தக்கச் செயலாற்றும் நம் நிரல்பெயர்ப்பு. guix build -f make.scm இயக்கும் ஒவ்வொரு முறையும் சரியான hello பெறுகிறோம் என்பதில் உறுதிக் கொள்ளலாம். make clean தேவையேயில்லை. Guix நிரல்தொகுப்புகளை ஆக்க guix build இயக்கும்போது பெறும் அதேத் தலைச்சிறந்த அனுபவமே இது; ஆனால் இப்போது உங்கள் சராசரி C பெயர்ப்புகளுக்கும்.

பலக் கோப்புகளுடைய C நிரல்—sent பெயர்த்தல்

Hello world நிரலுக்கான பெயர்ப்பமைப்பு மிக எளிமையாக இருக்கலாம். ஆனால் பலக் கோப்புகளுடைய இயல் வாழ்வு C நிரல்களுக்கு இத்தகைய பெயர்ப்பமைப்புகள் ஒத்து வருமா? sent எனப்படும் suckless திட்டத்தின் வில்லைக்காட்சி (slideshow) நிரலுக்கு ஒரு make.scm பெயர்ப்பமைப்பு அமைக்கலாம்.

(use-modules (gnu packages commencement)
             (gnu packages fontutils)
             (gnu packages xorg)
             (guix gexp))

(define set-up-gcc-gexp
  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils))

        (set-path-environment-variable "PATH"
                                       '("bin")
                                       (list #$gcc-toolchain))
        (set-path-environment-variable "C_INCLUDE_PATH"
                                       '("include")
                                       (list #$gcc-toolchain))
        (set-path-environment-variable "LIBRARY_PATH"
                                       '("lib")
                                       (list #$gcc-toolchain)))))

(define* (compile source-filename #:key (flags '()))
  (computed-file (string-append (basename source-filename ".c")
                                ".o")
                 #~(begin
                     #$set-up-gcc-gexp
                     (invoke "gcc" "-c" #$(local-file source-filename)
                             "-o" #$output
                             #$@flags))))

(define* (link output-filename object-files #:key (flags '()))
  (computed-file output-filename
                 #~(begin
                     #$set-up-gcc-gexp
                     (invoke "gcc" "-o" #$output
                             #$@object-files
                             #$@flags))))

(let ((include-dependencies
       (directory-union "include"
                        (list (file-append fontconfig "/include")
                              (file-append freetype "/include/freetype2")
                              (file-append libx11 "/include")
                              (file-append libxft "/include")
                              (file-append libxrender "/include")
                              (file-append xorgproto "/include")))))
  (link "sent"
        (list (let ((headers `(("arg.h" ,(local-file "sent/arg.h"))
                               ("config.h" ,(local-file "sent/config.def.h"))
                               ("drw.h" ,(local-file "sent/drw.h"))
                               ("util.h" ,(local-file "sent/util.h")))))
                (compile "sent/sent.c"
                         #:flags (list "-DVERSION=\"1\""
                                       "-I" include-dependencies
                                       "-I" (file-union "include" headers))))
              (let ((headers `(("drw.h" ,(local-file "sent/drw.h"))
                               ("util.h" ,(local-file "sent/util.h")))))
                (compile "sent/drw.c"
                         #:flags (list "-I" include-dependencies
                                       "-I" (file-union "include" headers))))
              (let ((headers `(("util.h" ,(local-file "sent/util.h")))))
                (compile "sent/util.c"
                         #:flags (list "-I" (file-union "include" headers)))))
        #:flags (list "-L" (file-append fontconfig "/lib")
                      "-L" (file-append libx11 "/lib")
                      "-L" (file-append libxft "/lib")
                      "-lfontconfig" "-lm" "-lX11" "-lXft")))

அதோ! சற்று நீளம் தான், ஆனால் இன்னும் புலப்படுகிறது. இதைக் கொண்டு sent யை பெயர்க்க முதலில் அதன் வெளியீட்டுக் கோப்பைப் பதிவிறக்கி விரிவாக்க வேண்டும்.

$ wget https://dl.suckless.org/tools/sent-1.tar.gz
$ mkdir sent
$ tar -C sent -xvf sent-1.tar.gz

பின், எப்போதும் போல் பெயர்க்கலாம்.

$ guix build -f make.scm
The following derivations will be built:
  /gnu/store/1xh1s4hs7m3mh9qfak4afzrjmhz84rlq-drw.o.drv
  /gnu/store/3z5f5z5dpz9sp13zrbfscjw9dmkknflv-util.o.drv
  /gnu/store/m7rvki1kyyh2gpwmx8y71dabj1zlihn2-sent.o.drv
  /gnu/store/2649ylh902lfd695avpy5p52h6ixawvr-sent.drv
building /gnu/store/1xh1s4hs7m3mh9qfak4afzrjmhz84rlq-drw.o.drv...
environment variable `PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/bin'
environment variable `C_INCLUDE_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/include'
environment variable `LIBRARY_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/lib'
successfully built /gnu/store/1xh1s4hs7m3mh9qfak4afzrjmhz84rlq-drw.o.drv
building /gnu/store/m7rvki1kyyh2gpwmx8y71dabj1zlihn2-sent.o.drv...
environment variable `PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/bin'
environment variable `C_INCLUDE_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/include'
environment variable `LIBRARY_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/lib'
successfully built /gnu/store/m7rvki1kyyh2gpwmx8y71dabj1zlihn2-sent.o.drv
building /gnu/store/3z5f5z5dpz9sp13zrbfscjw9dmkknflv-util.o.drv...
environment variable `PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/bin'
environment variable `C_INCLUDE_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/include'
environment variable `LIBRARY_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/lib'
successfully built /gnu/store/3z5f5z5dpz9sp13zrbfscjw9dmkknflv-util.o.drv
building /gnu/store/2649ylh902lfd695avpy5p52h6ixawvr-sent.drv...
environment variable `PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/bin'
environment variable `C_INCLUDE_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/include'
environment variable `LIBRARY_PATH' set to `/gnu/store/bymwhjw3jhh1izylgwsrlv0w0y881chq-gcc-toolchain-11.4.0/lib'
successfully built /gnu/store/2649ylh902lfd695avpy5p52h6ixawvr-sent.drv
/gnu/store/q2liz3kcivy0czys2nw8q3r5nsy2r6bi-sent

இங்கு எந்தெந்த மூலக் கோப்புகளுக்கு (source files) எந்தெந்தத் தலைப்புக் கோப்புகள் (header files) தேவையென நாமே குறிப்பிட வேண்டியிருந்தது. இதை gcc -MM போன்றவைக் கொண்டு நாம் தன்னியக்கமாகக் கண்டறியவில்லை. ஆனால் make.scm கோப்புகளில் Scheme மொழியின் மொத்த ஆற்றலையும் இறக்கலாம். அதனால் அத்தகைய தன்னியக்கத்தை அமைப்பது எளிது.

பிற எடுத்துக்காட்டுகள்

இப்பதிவின் சுருக்கம் கருதி எடுத்துக்காட்டுகளை இத்துடன் நிறுத்துகிறேன். மேலும் பிற எடுத்துக்காட்டுகளை இப்பதிவிற்கு இணையாக git களஞ்சியமொன்று அமைத்து அதில் இட்டுள்ளேன். அதில் அசையா இணைப்புடை sentக்கான (statically linked sent)1 நிரல்பெயர்ப்பமைப்பும் pandoc கொண்டு அமைத்த வலைப்பதிவொன்றிற்கான நிரல்பெயர்ப்பமைப்பும் குறிப்பிடத்தக்கதாக இருக்கலாம்.

pandoc வலைப்பதிவிற்கான நிரல்பெயர்ப்பமைப்பைக் காண:

$ git clone https://git.systemreboot.net/gexp-make/
$ cd gexp-make/pandoc-blog
$ guix build -f make.scm

கருத்தாடல்

நம் நிரல்பெயர்ப்பமைப்பின் தனிச் சிறப்புகள்

make clean, make -B தேவையில்லை

நம் நிரல்பெயர்ப்பமைப்பு மூலக்கோப்புகள், பெயர்ப்பு முறைகள், அவற்றிற்குத் தேவையான நிரல்கள், மேலும் அன்னிரல்களுக்குத் தேவையான நிரல்களென அத்தனையும் அறிந்து அவற்றில் ஏதேனும் மாறினால் தக்கச் செயலாற்ற வல்லது. அதனால் make clean, make -B போன்று எதுவும் தேவையில்லை. நிரல் பெயர்க்கும்பொழுது நமக்கு வேண்டியதுதான் கிடைக்கிறதென்பதில் முழு உறுதிக் கொள்ளலாம்.

கோப்புகளின் காலப்பதிவுகள் (timestamps) தேவையில்லை

நம் நிரல்பெயர்ப்பமைப்பு முழுக்க முழுக்க கோப்புகளின் கொத்துகளைக் (hash) கொண்டுச் செயலாற்றுவது. கோப்புகளின் காலப்பதிவுகள் நமக்குத் தேவையேயில்லை. காலப்பதிவுகளைப் பயன்படுத்துவது ஆபத்தானது. mtime comparison considered harmful காண்க.

கோப்புகளும் அடைவுகளும் ஒன்றே

Make காலப்பதிவுகளைப் பயன்படுத்துவதால் அடைவுகளைச் சரியாகக் கையாள்வதில்லை. இதைச் சமாளிக்கப் பலக் குறுக்கு வழிகள் புழக்கத்தில் உள்ளன. நமக்கு கோப்புகளும் அடைவுகளும் ஒன்றே—இரண்டும் கிடங்குருப்படிகளே.

autotools, cmake போன்றவைத் தேவையில்லை

Guix போன்றே நம் நிரல்பெயர்ப்பமைப்பு மிகத் துல்லியமானது; தேவையான நிரல்களைப் பதிப்பு, git பதிவு, அன்னிரல்களைப் பெயர்க்கப் பயன்படுத்தப்பட்ட நிரல்களென மிகத் துல்லியமாகக் குறிப்பிடலாம். இதனால் autotools, cmake போன்ற பழைய குழப்பங்கள் எவையும் தேவையில்லை. அவற்றிற்கு மாறாக நயமிக்க Scheme மட்டுமே.

தூய்மையான மூல அடைவு

எல்லா பெயர்ப்புப் பொருட்களும் Guix கிடங்கில் வாழ்கின்றன. மூல அடைவை ஒழுங்குப்படுத்துவதற்குக் கூட make clean தேவையில்லை. ஏன், gitignore கூடத் தேவையில்லை!

எல்லாம் Scheme

Make மற்றும் அதன் இடத்தைக் கைப்பற்ற முயல்பவை அத்தனையும் அவற்றிற்கெனத் தனி மொழியையும் தொடரியலையும் (syntax) கொண்டவை. நம் நிரல்பெயர்ப்பமைப்போ Scheme மொழியை மட்டுமே பயன்படுத்துகிறது. S-கோவைகள் தொடரியல் பற்றிலிருந்து நம்மை விடுவித்து நம் துறைசார் மொழிகளை எளிதாக தொகுக்க (composition) இயல்விக்கிறது. எடுத்துக்காட்டிற்கு, நம் நிரல்பெயர்ப்பமைப்பை இன்னொரு நிரலாக்க மொழிக்கு ஏதுவாக்க Scheme நிரலகமொன்று எழுதினால் போதும்.

Build Systems à la Carte பகுப்பியல்

Build Systems à la Carte (மிகச் சிறந்த கட்டுரை; கண்டிப்பாகப் படிக்கவும்!) ஆய்வுக்கட்டுரையின் சொல்லாடலில் நம் நிரல்பெயர்ப்பமைப்பு early cutoff உடைய ஒரு minimal மற்றும் cloud நிரல்பெயர்ப்பமைப்பு. முகில் பதுக்ககத்தில் (cloud cache) பெயர்ப்புத் தகவைச் சேமிப்பது; அசையா சார்நிரல்களை (static dependencies) இடத்தியல் முறையில் காலவரைப்படுத்துவது (topological scheduling).

குறைவியம் (minimality)

உள்ளீடுகளோ பெயர்ப்பு முறைகளோ மாறாவிடின் எதையும் தேவையின்றி நாம் பெயர்ப்பதில்லை. அதனால் நம் பெயர்ப்பமைப்பு குறைவியம் பெற்றது.

பெயர்ப்புத் தகவு சேமிப்பு

பெயர்ப்புப் பொருட்களை தகவல் விளி (content-addressed) Guix கிடங்கில் சேமிக்கிறோம்.

காலவரைவு

பெயர்ப்புப் பணிகளை இடத்தியல் முறையில் காலவரைப்படுத்துகிறோம்.

சார்நிரல்கள்

சார்நிரல்கள் அசையா. ஆனால், Make போன்று சற்று ஏமாற்றி, G-கோவைகளை Scheme நிரல் கொண்டு மூலக்கோப்புகளுக்கேற்ப மாற்றியமைக்க இயலும். எடுத்துக்காட்டிற்கு, மேற்கண்ட sent make.scm யில் Scheme நிரல் கொண்டு எந்தெந்த மூலக்கோப்பிற்கு எந்தெந்த தலைப்புக்கோப்பெனக் கண்டறிந்திருக்கலாம்.

விரைவான பெயர்ப்பு நிறுத்தம் (early cutoff optimization)

Guix விரைவாக பெயர்ப்புகளை நிறுத்துவதில்லை. ஆனால் பிற்காலத்தில் செய்யலாம். செய்தால் Guix திட்டத் தரவு மையத்தின் பெயர்ப்பு சுமையும் குறையும்.

முகில் பதுக்கல்

Guix கிடங்கு ஒருக் கணினியின் அனைத்து பயனருக்கும் பொதுவானது. அதனால் நம் நிரல்பெயர்ப்பமைப்பை ஒரு முகில் பெயர்ப்பமைப்பு (cloud build system) எனலாம். மேலும் guix offload போன்றவையுடன் Guix கிடங்கைப் பிணையம் மீதுப் பலக் கணினிகளுக்கும் பொதுவாக்கலாம். பெயர்ப்பு நிரல் கணிப்புச் சிக்கற்பாடுடைய துறைகளில் இது மிகுந்த பயனளிக்கலாம். FPGA துறை மனத்தில் எழுகிறது.

பரவலுக்குத் தடையும் சிலத் தீர்வும்

நம் நிரல்பெயர்ப்பமைப்பு பரவலான பயன்பாட்டு எய்துவதில் சிலத் தடைகள் உள்ளன. நம் நிரல்பெயர்ப்பமைப்பிற்கு Guix தேவை, Guix மறைநிரலும் தேவை. பிற இலினக்ஸ் இயங்குதள பயனர் இதைப் பயன்படுத்தத் தயங்குவர். இப்பெயர்ப்பமைப்பை உங்கள் திட்டத்தில் பயன்படுத்தினால் நிரல்பொதிப்பாரை வெறுப்பேற்றிவீர், உங்கள் திட்டத்தின் வளர்ச்சியைத் தடுக்கும். ஆனால் இச்சிக்கலுக்குச் சிலத் தீர்விருக்கலாம்.

root இல்லா Guix மறைநிரல்

சமீபத்தில் root இல்லா Guix மறைநிரல் வெளிவந்தது. வருங்காலத்தில் Guix மறைநிரலை பயனர் அறியாது துவக்க இயலலாம். அப்போதுப் பயனருக்கு Guix மறைநிரலை நிறுவும் தலைவலி இருக்காது.

இருப் பெயர்ப்பமைப்புகளில் ஒன்றாக

ஒருத் திட்டம் இருப் பெயர்ப்பமைப்புகள் கொள்ளலாம்—ஒன்று நம் G-கோவை பெயர்ப்பமைப்பு, மற்றொன்று Make போன்று பொதுவாக வழக்கத்திலிருக்கும் இன்னொன்று. அகவட்ட நிரலாக்கர் அதிக ஆற்றலுடைய G-கோவை பெயர்ப்பமைப்பைப் பயன்படுத்தலாம். பிறப் புறவட்டத்தார் பொதுப் பெயர்ப்பமைப்பைப் பயன்படுத்தலாம். சிலத் திட்டங்களில் புறவட்டத்தார்க்கு Make போன்று ஒரு முழுப் பெயர்ப்பமைப்பு கூடத் தேவையில்லை—ஒருச் சிறு உரைநிரல் கூடப் போதலாம்.

Makefile ஆகப் பெயர்க்க இயைந்த துறைசார் மொழி1

இன்னொரு வழி, Makefile, நமது G-கோவை நிரல்பெயர்ப்பமைப்பு இரண்டாகவும் பெயர்க்க இயைந்த துறைசார் மொழியை உருவாக்கலாம். அவ்வாறு ஒவ்வொருவரும் அவருக்கு வேண்டியதைப் பயன்படுத்தலாம். ஆனால் இது automake சென்ற வழிப் போல் தோன்றுகிறது, எச்சரிக்கை!

தனியார் பயனுக்கான களஞ்சியங்களுக்கு (private repos)

வலைப்பதிவுகள் போன்று தனியார் பயனுக்கென மட்டும் இருக்கும் களஞ்சியங்களுக்கு நம் நிரல்பெயர்ப்பமைப்பு சரியாக அமையலாம். இவற்றில் பிறர் கருத்து கருதாது அத்தனியாரேச் சரியான முடிவை எடுக்கலாம். அதேப் போன்று சிறுக் குழுகள் பயன்படுத்தும் களஞ்சியங்களுக்கும் இதுப் பொருந்தும்.

Footnotes:

1

இந்த எண்ணத்தை அறிவுறுத்திய பியோட்டருக்கு நன்றி.