~ruther/guix-exprs

33f8ed35608d10441d0802d4a6d45ef82c339808 — Rutherther 4 days ago f41ee23 main
feat: add c wrapper replacement for sh wrappers

Replace a sh wrapper by a binary wrapper.
Call the original shell script.
1 files changed, 51 insertions(+), 0 deletions(-)

A modules/ruther/build/wrappers.scm
A modules/ruther/build/wrappers.scm => modules/ruther/build/wrappers.scm +51 -0
@@ 0,0 1,51 @@
(define-module (ruther build wrappers)
  #:use-module (guix build utils)
  #:use-module (ice-9 format)
  #:export (replace-script-wrapper-with-binary
            replace-wrappers-with-binaries))

(define* (executable-wrapped? executable)
  (let ((folder (dirname executable))
        (filename (basename executable)))
    (file-exists?
     (string-append folder "/." filename "-real"))))

(define* (make-c-wrapper-program target)
  (mkdir-p (dirname target))
  (call-with-output-file target
    (lambda (port)
      (display "#include <unistd.h>
int main (int argc, char* argv[])
{
  execv(\"%SCRIPT%\", argv);
} " port))))

(define* (replace-script-wrapper-with-binary wrapper target)
  (let ((wrapper-program "wrapper.c")
        (wrapper-new (or (and
                          (equal? wrapper target)
                          (string-append
                           (dirname wrapper)
                           "/."
                           (basename wrapper)
                           "-wrapper"))
                         wrapper)))
    (when (equal? wrapper target)
      (rename-file wrapper wrapper-new))
    (format #t "Replacing wrapper ~a with target ~a.~%"
            wrapper-new target)
    (make-c-wrapper-program wrapper-program)
    (substitute* wrapper-program
      (("%SCRIPT%")
       wrapper-new))
    (when (file-exists? target)
      (delete-file target))
    (invoke "gcc" wrapper-program "-o" target)))

(define* (replace-wrappers-with-binaries binaries)
  (for-each
   (lambda (binary)
     (format #t "Investigating binary ~a for wrapping.~%" binary)
     (when (executable-wrapped? binary)
       (replace-script-wrapper-with-binary binary binary)))
   binaries))