]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/backend-library.scm
Merge branch 'lilypond/translation' of ssh://git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / scm / backend-library.scm
index 42cc2688da6b3a558f6e59e655cb9cc690be9937..36492323da3a956b8902b0bef817322178545da2 100644 (file)
@@ -1,14 +1,28 @@
-;;;; backend-library.scm -- helpers for the backends.
+;;;; This file is part of LilyPond, the GNU music typesetter.
 ;;;;
 ;;;;
-;;;;  source file of the GNU LilyPond music typesetter
-;;;; 
-;;;; (c) 2005--2006 Jan Nieuwenhuizen <janneke@gnu.org>
-;;;; Han-Wen Nienhuys <hanwen@cs.uu.nl>
+;;;; Copyright (C) 2005--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;;
+;;;; LilyPond is free software: you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation, either version 3 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; LilyPond is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 ;; backend helpers.
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 ;; backend helpers.
 
-(define-public (ly:system command)
+(use-modules (scm ps-to-png)
+            (ice-9 optargs))
+
+(define-public (ly:system command . rest)
   (let* ((status 0)
         (dev-null "/dev/null")
         (silenced (if (or (ly:get-option 'verbose)
   (let* ((status 0)
         (dev-null "/dev/null")
         (silenced (if (or (ly:get-option 'verbose)
                       command
                       (format #f "~a > ~a 2>&1 " command dev-null))))
     (if (ly:get-option 'verbose)
                       command
                       (format #f "~a > ~a 2>&1 " command dev-null))))
     (if (ly:get-option 'verbose)
-       (ly:message (_ "Invoking `~a'...") command))
-    
-    (set! status (system silenced))
+       (begin
+         (ly:message (_ "Invoking `~a'...") command))
+         (ly:progress "\n"))
+
+    (set! status
+         (if (pair? rest)
+             (system-with-env silenced (car rest))
+             (system silenced)))
+       
     (if (> status 0)
        (begin
          (ly:message (_ "`~a' failed (~a)") command status)
     (if (> status 0)
        (begin
          (ly:message (_ "`~a' failed (~a)") command status)
          ;; hmmm.  what's the best failure option? 
          (throw 'ly-file-failed)))))
 
          ;; hmmm.  what's the best failure option? 
          (throw 'ly-file-failed)))))
 
+(define-public (system-with-env cmd env)
+
+  "Execute CMD in fork, with ENV (a list of strings) as the environment"
+  (let*
+      ;; laziness: should use execle?
+      
+      ((pid (primitive-fork)))
+    (if (= 0 pid)
+       ;; child
+       (begin
+         (environ env)
+         (system cmd))
+       
+       ;; parent
+       (cdr (waitpid pid)))))
+
 (define-public (sanitize-command-option str)
   "Kill dubious shell quoting"
   
 (define-public (sanitize-command-option str)
   "Kill dubious shell quoting"
   
   
 (define-public (postscript->pdf paper-width paper-height name)
   (let* ((pdf-name (string-append
   
 (define-public (postscript->pdf paper-width paper-height name)
   (let* ((pdf-name (string-append
-                   (basename (basename name ".ps") ".eps")
+                   (dir-basename name ".ps" ".eps")
                    ".pdf"))
         (is-eps (string-match "\\.eps$" name))
         (paper-size-string (if is-eps
                    ".pdf"))
         (is-eps (string-match "\\.eps$" name))
         (paper-size-string (if is-eps
-                               " -dEPSCrop "
-                               (format "-dDEVICEWIDTHPOINTS=~,2f \
--dDEVICEHEIGHTPOINTS=~,2f "
-                                       paper-width
-                                       paper-height)))
+                               "-dEPSCrop"
+                               (ly:format "-dDEVICEWIDTHPOINTS=~$\
+ -dDEVICEHEIGHTPOINTS=~$"
+                                       paper-width paper-height)))
 
 
-        (cmd (format #f
+        (cmd (ly:format
                      "~a\
  ~a\
  ~a\
  ~a\
                      "~a\
  ~a\
  ~a\
  ~a\
- -dCompatibilityLevel=1.4 \
+ -dCompatibilityLevel=1.4\
  -dNOPAUSE\
  -dBATCH\
  -dNOPAUSE\
  -dBATCH\
- -r1200 \
+ -r1200\
  -sDEVICE=pdfwrite\
  -sOutputFile=~S\
  -c .setpdfwrite\
  -sDEVICE=pdfwrite\
  -sOutputFile=~S\
  -c .setpdfwrite\
 "
                      (search-gs)
                      (if (ly:get-option 'verbose) "" "-q")
 "
                      (search-gs)
                      (if (ly:get-option 'verbose) "" "-q")
-                     (if (ly:get-option 'gs-font-load)
-                         " -dNOSAFER "
-                         " -dSAFER ")
+                     (if (or (ly:get-option 'gs-load-fonts)
+                             (ly:get-option 'gs-load-lily-fonts))
+                         "-dNOSAFER"
+                         "-dSAFER")
                      paper-size-string
                      pdf-name
                      name)))
                      paper-size-string
                      pdf-name
                      name)))
     (if (eq? PLATFORM 'windows)
        (begin
          (set! cmd (string-regexp-substitute "=" "#" cmd))
     (if (eq? PLATFORM 'windows)
        (begin
          (set! cmd (string-regexp-substitute "=" "#" cmd))
-         (set! cmd (string-regexp-substitute "-dSAFER " "" cmd))))
-
-    (if (access? pdf-name W_OK)
-       (delete-file pdf-name))
+         (set! cmd (string-regexp-substitute "-dSAFER " "" cmd))
+         (if (access? pdf-name W_OK)
+             (delete-file pdf-name))))
 
     (ly:message (_ "Converting to `~a'...") pdf-name)
     (ly:progress "\n")
 
     (ly:message (_ "Converting to `~a'...") pdf-name)
     (ly:progress "\n")
-    (ly:system cmd)
-    ))
-
-(use-modules (scm ps-to-png))
+    (ly:system cmd)))
 
 (define-public (postscript->png resolution paper-width paper-height name)
 
 (define-public (postscript->png resolution paper-width paper-height name)
+  (let* ((verbose (ly:get-option 'verbose))
+        (rename-page-1 #f))
+
     ;; Do not try to guess the name of the png file,
     ;; GS produces PNG files like BASE-page%d.png.
     ;; Do not try to guess the name of the png file,
     ;; GS produces PNG files like BASE-page%d.png.
-    ;;(ly:message (_ "Converting to `~a'...")
-    ;;     (string-append (basename name ".ps") "-page1.png" )))
-  (let ((verbose (ly:get-option 'verbose))
-       (rename-page-1 #f))
-
     (ly:message (_ "Converting to ~a...") "PNG")
     (ly:message (_ "Converting to ~a...") "PNG")
-    (make-ps-images name resolution paper-width paper-height rename-page-1 verbose
-                   (ly:get-option 'anti-alias-factor))
+    (make-ps-images name
+                   #:resolution resolution
+                   #:page-width paper-width
+                   #:page-height paper-height
+                   #:rename-page-1 rename-page-1
+                   #:be-verbose verbose
+                   #:anti-alias-factor (ly:get-option 'anti-alias-factor)
+                   #:pixmap-format (ly:get-option 'pixmap-format))
     (ly:progress "\n")))
 
 (define-public (postprocess-output paper-book module filename formats)
     (ly:progress "\n")))
 
 (define-public (postprocess-output paper-book module filename formats)
-  (let*
-      ((completed (completize-formats formats))
-       (base (string-regexp-substitute "\\.[a-z]+$" "" filename))
-       (intermediate (remove
-                     (lambda (x)
-                       (member x formats)) 
-                     completed)))
-
-    (for-each
-     (lambda (f)
-       ((eval (string->symbol (format "convert-to-~a" f)) module)
-       paper-book filename))
-     completed)
-
+  (let* ((completed (completize-formats formats))
+        (base (dir-basename filename ".ps" ".eps"))
+        (intermediate (remove (lambda (x) (member x formats)) completed)))
+    (for-each (lambda (f)
+               ((eval (string->symbol (format "convert-to-~a" f))
+                      module) paper-book filename)) completed)
     (if (ly:get-option 'delete-intermediate-files)
     (if (ly:get-option 'delete-intermediate-files)
-       (for-each
-        (lambda (f)
-          (delete-file (string-append base "." f)))
-        intermediate))
-    ))
+       (for-each (lambda (f)
+                   (if (file-exists? f) (delete-file f)))
+                 (map (lambda (x) (string-append base "." x)) intermediate)))))
 
 (define-public (completize-formats formats)
   (define new-fmts '())
 
 (define-public (completize-formats formats)
   (define new-fmts '())
-
   (if (member "png" formats)
       (set! formats (cons "ps" formats)))
   (if (member "pdf" formats)
       (set! formats (cons "ps" formats)))
   (if (member "png" formats)
       (set! formats (cons "ps" formats)))
   (if (member "pdf" formats)
       (set! formats (cons "ps" formats)))
-
-  (for-each
-   (lambda (x)
-     (if (member x formats) (set! new-fmts (cons x new-fmts))))
-   '("tex" "dvi" "ps" "pdf" "png"))
-
+  (for-each (lambda (x)
+             (if (member x formats) (set! new-fmts (cons x new-fmts))))
+           '("ps" "pdf" "png"))
   (uniq-list (reverse new-fmts)))
 
 (define (header-to-file file-name key value)
   (uniq-list (reverse new-fmts)))
 
 (define (header-to-file file-name key value)
              (if (equal? "-" file-name) "<stdout>" file-name))
   (if (equal? file-name "-")
       (display value)
              (if (equal? "-" file-name) "<stdout>" file-name))
   (if (equal? file-name "-")
       (display value)
-      (display value (open-file file-name "w")))
+      (let ((port (open-file file-name "w")))
+       (display value port)
+       (close-port port)))
+
   (ly:progress "\n")
   "")
 
   (ly:progress "\n")
   "")
 
       scope)))
   (apply string-append (map output-scope scopes)))
 
       scope)))
   (apply string-append (map output-scope scopes)))
 
+(define missing-stencil-list '())
+
+(define-public (backend-testing output-module)
+  (define (missing-stencil-expression name)
+    (begin
+      (ly:warning (_ "missing stencil expression `~S'") name)
+      ""))
+
+  (map (lambda (x)
+        (if (not (module-defined? output-module x))
+            (begin
+              (module-define! output-module x
+                              (lambda* (#:optional y . z)
+                                (missing-stencil-expression x)))
+              (set! missing-stencil-list (append (list x)
+                                                 missing-stencil-list)))))
+       (ly:all-stencil-commands)))
+
+(define-public (remove-stencil-warnings output-module)
+  (for-each
+    (lambda (x)
+      (module-remove! output-module x))
+    missing-stencil-list))