If set to false, systems will spread vertically down the last
page. Pieces that amply fill two pages or more should have this
-set to true. It also affects the last page of book parts, i.e.
+set to false. It also affects the last page of book parts, i.e.
parts of a book created with @code{\bookpart} blocks.
@end table
-\version "2.14.0"
+\version "2.15.31"
\header {
lsrtags = "text, tweaks-and-overrides, contexts-and-engravers"
#(define (Text_align_engraver ctx)
(let ((scripts '())
(note-column #f))
-
- `((acknowledgers
- (note-column-interface
- . ,(lambda (trans grob source)
- ;; cache NoteColumn in this Voice context
- (set! note-column grob)))
-
- (text-script-interface
- . ,(lambda (trans grob source)
- ;; whenever a TextScript is acknowledged,
- ;; add it to `scripts' list
- (set! scripts (cons grob scripts)))))
-
- (stop-translation-timestep
- . ,(lambda (trans)
- ;; if any TextScript grobs exist,
- ;; set NoteColumn as X-parent
- (and (pair? scripts)
- (for-each (lambda (script)
- (set! (ly:grob-parent script X) note-column))
- scripts))
- ;; clear scripts ready for next timestep
- (set! scripts '()))))))
+ (make-engraver
+ (acknowledgers
+ ((note-column-interface trans grob source)
+ ;; cache NoteColumn in this Voice context
+ (set! note-column grob))
+ ((text-script-interface trans grob source)
+ ;; whenever a TextScript is acknowledged,
+ ;; add it to `scripts' list
+ (set! scripts (cons grob scripts))))
+ ((stop-translation-timestep trans)
+ ;; if any TextScript grobs exist,
+ ;; set NoteColumn as X-parent
+ (for-each (lambda (script)
+ (set! (ly:grob-parent script X) note-column))
+ scripts)
+ ;; clear scripts ready for next timestep
+ (set! scripts '())))))
\layout {
\context {
-\version "2.14.0"
+\version "2.15.31"
\header {
%%% Grob utilities
%%%
%%% These are literal rewrites of some C++ methods used by the ambitus engraver.
-#(define (ly:event::in-event-class event class-name)
- "Check if @var{event} the given class.
-Rewrite of @code{Stream_event::internal_in_event_class} from @file{lily/stream-event.cc}."
- (memq class-name (ly:make-event-class (ly:event-property event 'class))))
#(define (ly:separation-item::add-conditional-item grob grob-item)
"Add @var{grob-item} to the array of conditional elements of @var{grob}.
;; Get the event that caused the note-grob creation
;; and check that it is a note-event.
(let ((note-event (ly:grob-property note-grob 'cause)))
- (if (ly:event::in-event-class note-event 'note-event)
+ (if (ly:in-event-class? note-event 'note-event)
;; get the pitch from the note event
(let ((pitch (ly:event-property note-event 'pitch)))
;; if this pitch is lower than the current ambitus lower
(lambda (context)
(let ((ambitus #f))
;; when music is processed: make the ambitus object, if not already built
- `((process-music . ,(lambda (translator)
- (if (not ambitus)
- (set! ambitus (make-ambitus translator)))))
- ;; set the ambitus clef and key signature state
- (stop-translation-timestep . ,(lambda (translator)
- (if ambitus
- (initialize-ambitus-state ambitus translator))))
- ;; when a note-head grob is built, update the ambitus notes
- (acknowledgers
- (note-head-interface . ,(lambda (engraver grob source-engraver)
- (if ambitus
- (update-ambitus-notes ambitus grob)))))
- ;; finally, typeset the ambitus according to its upper and lower notes
- ;; (if any).
- (finalize . ,(lambda (translator)
- (if ambitus
- (typeset-ambitus ambitus translator))))))))
+ (make-engraver
+ ((process-music translator)
+ (if (not ambitus)
+ (set! ambitus (make-ambitus translator))))
+ ;; set the ambitus clef and key signature state
+ ((stop-translation-timestep translator)
+ (if ambitus
+ (initialize-ambitus-state ambitus translator)))
+ ;; when a note-head grob is built, update the ambitus notes
+ (acknowledgers
+ ((note-head-interface engraver grob source-engraver)
+ (if ambitus
+ (update-ambitus-notes ambitus grob))))
+ ;; finally, typeset the ambitus according to its upper and lower notes
+ ;; (if any).
+ ((finalize translator)
+ (if ambitus
+ (typeset-ambitus ambitus translator)))))))
%%%
%%% Example
-\version "2.14.0"
+\version "2.15.31"
\header {
lsrtags = "pitches"
}
#(define Ez_numbers_engraver
- (list
- (cons 'acknowledgers
- (list
- (cons 'note-head-interface
- (lambda (engraver grob source-engraver)
- (let* ((context (ly:translator-context engraver))
- (tonic-pitch (ly:context-property context 'tonic))
- (tonic-name (ly:pitch-notename tonic-pitch))
- (grob-pitch
- (ly:event-property (event-cause grob) 'pitch))
- (grob-name (ly:pitch-notename grob-pitch))
- (delta (modulo (- grob-name tonic-name) 7))
- (note-names
- (make-vector 7 (number->string (1+ delta)))))
- (ly:grob-set-property! grob 'note-names note-names))))))))
+ (make-engraver
+ (acknowledgers
+ ((note-head-interface engraver grob source-engraver)
+ (let* ((context (ly:translator-context engraver))
+ (tonic-pitch (ly:context-property context 'tonic))
+ (tonic-name (ly:pitch-notename tonic-pitch))
+ (grob-pitch
+ (ly:event-property (event-cause grob) 'pitch))
+ (grob-name (ly:pitch-notename grob-pitch))
+ (delta (modulo (- grob-name tonic-name) 7))
+ (note-names
+ (make-vector 7 (number->string (1+ delta)))))
+ (ly:grob-set-property! grob 'note-names note-names))))))
#(set-global-staff-size 26)
$(shell bash -O nullglob -c "echo $(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}")) \
$(shell bash -O nullglob -c "echo input/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}") \
$(shell bash -O nullglob -c "echo input/*/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}") \
+ $(shell bash -O nullglob -c "echo input/*/*/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}") \
+ $(shell bash -O nullglob -c "echo input/regression/lilypond-book/$(outdir)/*.{info,tex}") \
$(shell bash -O nullglob -c "echo Documentation/$(outdir)/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}") \
$(shell bash -O nullglob -c "echo Documentation/$(outdir)/*/*.{midi,html,pdf,png,jpg,jpeg,txt,ly,ily,signature,css,zip,js,idx,php}")
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=15
-PATCH_LEVEL=30
+PATCH_LEVEL=31
MY_PATCH_LEVEL=
VERSION_STABLE=2.14.2
-VERSION_DEVEL=2.15.29
+VERSION_DEVEL=2.15.30
STEPMAKE_PROGS(MAKEINFO, makeinfo, REQUIRED, 4.11)
STEPMAKE_PROGS(TEXI2HTML, texi2html, OPTIONAL, 1.82)
-STEPMAKE_PROGS(DBLATEX, dblatex, OPTIONAL)
+STEPMAKE_PROGS(DBLATEX, dblatex, OPTIONAL, 0.1.4)
STEPMAKE_PROGS(PDFLATEX, pdflatex, OPTIONAL)
STEPMAKE_PROGS(NETPBM, pngtopnm, OPTIONAL)
STEPMAKE_PROGS(IMAGEMAGICK, convert, OPTIONAL)
--- /dev/null
+\header {
+ texidoc = "A mode switching command like @code{\\lyricsto} will
+`pop state' when seeing the lookahead token @code{\\time}, a music
+function, after its non-delimited argument. This must not cause the
+extra token parsing state for the music function to disappear."
+}
+
+\paper {
+ ragged-right = ##t
+}
+
+\version "2.15.31"
+
+x=\lyrics { oh }
+
+<<
+ \new Voice = m { c'4 r r }
+ \lyricsto "m" \x
+ \time 3/4
+>>
}
-\version "2.14.0"
+\version "2.15.31"
\layout {
\context {
(set! instance-counter (1+ instance-counter))
(let ((instance-id instance-counter)
(private-note-counter 0))
- `((listeners
- (note-event
- . ,(lambda (engraver event)
- (set! private-note-counter (1+ private-note-counter))
- (let ((text (ly:engraver-make-grob engraver 'TextScript event)))
- (ly:grob-set-property! text 'text
- (format #f "~a.~a" instance-id
- private-note-counter))))))))))
+ (make-engraver
+ (listeners
+ ((note-event engraver event)
+ (set! private-note-counter (1+ private-note-counter))
+ (let ((text (ly:engraver-make-grob engraver 'TextScript event)))
+ (ly:grob-set-property! text 'text
+ (format #f "~a.~a" instance-id
+ private-note-counter)))))))))
}
}
}
-\version "2.14.0"
+\version "2.15.31"
\layout {
\context {
\Voice
\consists
- #(list
- (cons 'initialize
- (lambda (trans)
- (display (list "initialize"
- (ly:context-current-moment
- (ly:translator-context trans)) "\n") (current-error-port))))
- (cons 'start-translation-timestep
- (lambda (trans)
- (display (list "start-trans"
- (ly:context-current-moment
- (ly:translator-context trans)) "\n") (current-error-port))))
- (cons 'listeners
- (list
- (cons 'rest-event (lambda (engraver event)
- (let*
- ((x (ly:engraver-make-grob engraver 'TextScript event)))
- (display (list "caught event" event "\ncreate:\n" x "\n") (current-error-port))
- (ly:grob-set-property! x 'text "hi"))
- ))
- ))
- (cons 'acknowledgers
- (list
- (cons 'note-head-interface
- (lambda (engraver grob source-engraver)
- (display (list "saw head: " grob " coming from " source-engraver) (current-error-port))
- ))
- ))
- (cons 'end-acknowledgers
- (list
- (cons 'beam-interface
- (lambda (engraver grob source-engraver)
- (display (list "saw end of beam: " grob " coming from " source-engraver) (current-error-port))
- ))
- ))
- (cons 'process-music
- (lambda (trans)
- (display (list "process-music"
- (ly:context-current-moment
- (ly:translator-context trans)) "\n") (current-error-port))))
- (cons 'process-acknowledged
- (lambda (trans)
- (display (list "process-acknowledged"
- (ly:context-current-moment
- (ly:translator-context trans)) "\n") (current-error-port))))
- (cons 'stop-translation-timestep
- (lambda (trans)
- (display (list "stop-trans"
- (ly:context-current-moment
- (ly:translator-context trans)) "\n") (current-error-port))))
- (cons 'finalize
- (lambda (trans)
- (display (list "finalize"
- (ly:context-current-moment
- (ly:translator-context trans)) "\n") (current-error-port))))
- )
-
+ #(make-engraver
+ ((initialize trans)
+ (display (list "initialize"
+ (ly:context-current-moment
+ (ly:translator-context trans)) "\n") (current-error-port)))
+ ((start-translation-timestep trans)
+ (display (list "start-trans"
+ (ly:context-current-moment
+ (ly:translator-context trans)) "\n") (current-error-port)))
+ (listeners
+ ((rest-event engraver event)
+ (let*
+ ((x (ly:engraver-make-grob engraver 'TextScript event)))
+ (display (list "caught event" event "\ncreate:\n" x "\n") (current-error-port))
+ (ly:grob-set-property! x 'text "hi"))))
+ (acknowledgers
+ ((note-head-interface engraver grob source-engraver)
+ (display (list "saw head: " grob " coming from " source-engraver) (current-error-port))))
+ (end-acknowledgers
+ ((beam-interface engraver grob source-engraver)
+ (display (list "saw end of beam: " grob " coming from " source-engraver) (current-error-port))))
+ ((process-music trans)
+ (display (list "process-music"
+ (ly:context-current-moment
+ (ly:translator-context trans)) "\n") (current-error-port)))
+ ((process-acknowledged trans)
+ (display (list "process-acknowledged"
+ (ly:context-current-moment
+ (ly:translator-context trans)) "\n") (current-error-port)))
+ ((stop-translation-timestep trans)
+ (display (list "stop-trans"
+ (ly:context-current-moment
+ (ly:translator-context trans)) "\n") (current-error-port)))
+ ((finalize trans)
+ (display (list "finalize"
+ (ly:context-current-moment
+ (ly:translator-context trans)) "\n") (current-error-port))))
}}
-\version "2.14.0"
+\version "2.15.31"
\header {
texidoc = "Use @code{define-event-class}, scheme engraver methods,
(finished '())
(current-event '())
(event-drul '(() . ())))
- (list (cons 'listeners
- (list (cons 'scheme-text-span-event
- (lambda (engraver event)
- (if (= START (ly:event-property event 'span-direction))
- (set-car! event-drul event)
- (set-cdr! event-drul event))))))
- (cons 'acknowledgers
- (list (cons 'note-column-interface
- (lambda (engraver grob source-engraver)
- (if (ly:spanner? span)
- (begin
- (ly:pointer-group-interface::add-grob span 'note-columns grob)
- (add-bound-item span grob)))
- (if (ly:spanner? finished)
- (begin
- (ly:pointer-group-interface::add-grob finished 'note-columns grob)
- (add-bound-item finished grob)))))))
- (cons 'process-music
- (lambda (trans)
- (if (ly:stream-event? (cdr event-drul))
- (if (null? span)
- (ly:warning "You're trying to end a scheme text spanner but you haven't started one.")
- (begin (set! finished span)
- (ly:engraver-announce-end-grob trans finished current-event)
- (set! span '())
- (set! current-event '())
- (set-cdr! event-drul '()))))
- (if (ly:stream-event? (car event-drul))
- (begin (set! current-event (car event-drul))
- (set! span (ly:engraver-make-grob trans 'SchemeTextSpanner current-event))
- (set-axis! span Y)
- (set-car! event-drul '())))))
- (cons 'stop-translation-timestep
- (lambda (trans)
- (if (and (ly:spanner? span)
- (null? (ly:spanner-bound span LEFT)))
- (set! (ly:spanner-bound span LEFT)
- (ly:context-property context 'currentMusicalColumn)))
- (if (ly:spanner? finished)
- (begin
- (if (null? (ly:spanner-bound finished RIGHT))
- (set! (ly:spanner-bound finished RIGHT)
- (ly:context-property context 'currentMusicalColumn)))
- (set! finished '())
- (set! event-drul '(() . ()))))))
- (cons 'finalize
- (lambda (trans)
- (if (ly:spanner? finished)
- (begin
- (if (null? (ly:spanner-bound finished RIGHT))
- (set! (ly:spanner-bound finished RIGHT)
- (ly:context-property context 'currentMusicalColumn)))
- (set! finished '())))
- (if (ly:spanner? span)
- (begin
- (ly:warning "I think there's a dangling scheme text spanner :-(")
- (ly:grob-suicide! span)
- (set! span '()))))))))
+ (make-engraver
+ (listeners ((scheme-text-span-event engraver event)
+ (if (= START (ly:event-property event 'span-direction))
+ (set-car! event-drul event)
+ (set-cdr! event-drul event))))
+ (acknowledgers ((note-column-interface engraver grob source-engraver)
+ (if (ly:spanner? span)
+ (begin
+ (ly:pointer-group-interface::add-grob span 'note-columns grob)
+ (add-bound-item span grob)))
+ (if (ly:spanner? finished)
+ (begin
+ (ly:pointer-group-interface::add-grob finished 'note-columns grob)
+ (add-bound-item finished grob)))))
+ ((process-music trans)
+ (if (ly:stream-event? (cdr event-drul))
+ (if (null? span)
+ (ly:warning "You're trying to end a scheme text spanner but you haven't started one.")
+ (begin (set! finished span)
+ (ly:engraver-announce-end-grob trans finished current-event)
+ (set! span '())
+ (set! current-event '())
+ (set-cdr! event-drul '()))))
+ (if (ly:stream-event? (car event-drul))
+ (begin (set! current-event (car event-drul))
+ (set! span (ly:engraver-make-grob trans 'SchemeTextSpanner current-event))
+ (set-axis! span Y)
+ (set-car! event-drul '()))))
+ ((stop-translation-timestep trans)
+ (if (and (ly:spanner? span)
+ (null? (ly:spanner-bound span LEFT)))
+ (set! (ly:spanner-bound span LEFT)
+ (ly:context-property context 'currentMusicalColumn)))
+ (if (ly:spanner? finished)
+ (begin
+ (if (null? (ly:spanner-bound finished RIGHT))
+ (set! (ly:spanner-bound finished RIGHT)
+ (ly:context-property context 'currentMusicalColumn)))
+ (set! finished '())
+ (set! event-drul '(() . ())))))
+ ((finalize trans)
+ (if (ly:spanner? finished)
+ (begin
+ (if (null? (ly:spanner-bound finished RIGHT))
+ (set! (ly:spanner-bound finished RIGHT)
+ (ly:context-property context 'currentMusicalColumn)))
+ (set! finished '())))
+ (if (ly:spanner? span)
+ (begin
+ (ly:warning "I think there's a dangling scheme text spanner :-(")
+ (ly:grob-suicide! span)
+ (set! span '())))))))
schemeTextSpannerStart =
#(make-span-event 'SchemeTextSpanEvent START)
if (ly_symbol2scm ("consists") == tag)
l1 = scm_cons (arg, l1);
else if (ly_symbol2scm ("remove") == tag
- && get_translator (arg))
+ && (scm_is_pair (arg)
+ || ly_is_procedure (arg)
+ || get_translator (arg)))
l1 = scm_delete_x (arg, l1);
}
{
void (*listen_callback) (void *, SCM);
void (*mark_callback) (void *);
+ bool (*equal_callback) (void *, void *);
} Listener_function_table;
class Listener
void listen (SCM ev) const;
bool operator == (Listener const &other) const
- { return target_ == other.target_ && type_ == other.type_; }
+ { return type_ == other.type_
+ && (*type_->equal_callback)((void *) target_, (void *) other.target_ );
+ }
DECLARE_SIMPLE_SMOBS (Listener);
};
cl *s = (cl *)self; \
scm_gc_mark (s->self_scm ()); \
} \
+bool \
+cl :: method ## _is_equal (void *a, void *b) \
+{ \
+ return a == b; \
+} \
Listener \
cl :: method ## _listener () const \
{ \
static Listener_function_table callbacks; \
callbacks.listen_callback = &cl::method ## _callback; \
callbacks.mark_callback = &cl::method ## _mark; \
+ callbacks.equal_callback = &cl::method ## _is_equal; \
return Listener (this, &callbacks); \
}
inline void name (SCM); \
static void name ## _callback (void *self, SCM ev); \
static void name ## _mark (void *self); \
+ static bool name ## _is_equal (void *a, void *b); \
Listener name ## _listener () const
#endif /* LISTENER_HH */
void
Lily_lexer::pop_state ()
{
+ bool extra = (YYSTATE == extratoken);
+
+ if (extra)
+ yy_pop_state ();
+
if (YYSTATE == notes || YYSTATE == chords)
pitchname_tab_stack_ = scm_cdr (pitchname_tab_stack_);
yy_pop_state ();
+
+ if (extra) {
+ hidden_state_ = YYSTATE;
+ yy_push_state (extratoken);
+ }
}
int
| context_def_mod STRING {
$$ = scm_list_2 ($1, $2);
}
- | context_def_mod embedded_scm {
- if (ly_symbol2scm ("consists") != $1)
- {
- $$ = SCM_EOL;
- parser->parser_error (@1, _ ("only \\consists takes non-string argument."));
- }
- else
- {
- $$ = scm_list_2 ($1, $2);
- }
+ | context_def_mod embedded_scm
+ {
+ if (!scm_is_string ($2)
+ && ly_symbol2scm ("consists") != $1
+ && ly_symbol2scm ("remove") != $1)
+ {
+ $$ = SCM_EOL;
+ parser->parser_error (@1, _ ("only \\consists and \\remove take non-string argument."));
+ }
+ else
+ {
+ $$ = scm_list_2 ($1, $2);
+ }
}
;
scm_gc_mark ((SCM)target);
}
+static
+bool equal_listen_closure (void *a, void *b)
+{
+ SCM target_a = (SCM) a;
+ SCM target_b = (SCM) b;
+
+ return ly_is_equal (target_a, target_b);
+}
+
Listener_function_table listen_closure
=
{
- call_listen_closure, mark_listen_closure
+ call_listen_closure, mark_listen_closure, equal_listen_closure
};
/* static */
-\version "2.15.0"
+\version "2.15.31"
%%%% Helper functions
\layout {
\context {
\Voice
- \consists #(list
- (cons 'listeners
- (list
- (cons 'tempo-change-event format-tempo)
- (cons 'rest-event format-rest)
- (cons 'note-event format-note)
- (cons 'articulation-event format-articulation)
- (cons 'text-script-event format-text)
- (cons 'slur-event format-slur)
- (cons 'breathing-event format-breathe)
- (cons 'dynamic-event format-dynamic)
- (cons 'crescendo-event format-cresc)
- (cons 'decrescendo-event format-decresc)
- (cons 'text-span-event format-textspan)
- (cons 'tie-event format-tie)
- )))
+ \consists #(make-engraver
+ (listeners
+ (tempo-change-event . format-tempo)
+ (rest-event . format-rest)
+ (note-event . format-note)
+ (articulation-event . format-articulation)
+ (text-script-event . format-text)
+ (slur-event . format-slur)
+ (breathing-event . format-breathe)
+ (dynamic-event . format-dynamic)
+ (crescendo-event . format-cresc)
+ (decrescendo-event . format-decresc)
+ (text-span-event . format-textspan)
+ (tie-event . format-tie)))
}
}
-I $(top-build-dir)/Documentation/$(outdir)
LILYPOND_BOOK_INCLUDES += $(DOCUMENTATION_INCLUDES)
-MAKEINFO_FLAGS += --force --enable-encoding $(DOCUMENTATION_INCLUDES)
+MAKEINFO_FLAGS += --enable-encoding $(DOCUMENTATION_INCLUDES)
MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS)
# texi2html xref map files
$(outdir)/%.tex: %.latex
$(LILYPOND_BOOK_COMMAND) --pdf -o $(outdir) $<
-# Add the tex => pdf rule only if we have dblatex
+# Add the tex => pdf rule only if we have pdflatex
ifeq (,$(findstring pdflatex,$(MISSING_OPTIONAL)))
$(outdir)/%.pdf: $(outdir)/%.tex
cd $(outdir) && $(PDFLATEX) $(notdir $<)
OUT_HTMLY_FILES = ${HTMLY_FILES:%.htmly=$(outdir)/%.html}
OUT_XML_FILES = ${XML_FILES:%.xml=$(outdir)/%.html}
# If we have pdflatex, create the pdf, otherwise only the .tex file!
-ifeq (,$(findstring dblatex,$(MISSING_OPTIONAL)))
+ifeq (,$(findstring pdflatex,$(MISSING_OPTIONAL)))
OUT_LYTEX_FILES = ${LYTEX_FILES:%.lytex=$(outdir)/%.pdf}
OUT_LATEX_FILES = ${LATEX_FILES:%.latex=$(outdir)/%.pdf}
OUT_TEX_FILES = ${TEX_FILES:%.tex=$(outdir)/%.pdf}
(= 0 (modulo count n)))
(define-public (all-repeat-counts-visible count context) #t)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; make-engraver helper macro
+
+(defmacro-public make-engraver forms
+ "Helper macro for creating Scheme engravers.
+
+The usual form for an engraver is an association list (or alist)
+mapping symbols to either anonymous functions or to another such
+alist.
+
+@code{make-engraver} accepts forms where the first element is either
+an argument list starting with the respective symbol, followed by the
+function body (comparable to the way @code{define} is used for
+defining functions), or a single symbol followed by subordinate forms
+in the same manner. You can also just make an alist pair
+literally (the @samp{car} is quoted automatically) as long as the
+unevaluated @samp{cdr} is not a pair. This is useful if you already
+have defined your engraver functions separately.
+
+Symbols mapping to a function would be @code{initialize},
+@code{start-translation-timestep}, @code{process-music},
+@code{process-acknowledged}, @code{stop-translation-timestep}, and
+@code{finalize}. Symbols mapping to another alist specified in the
+same manner are @code{listeners} with the subordinate symbols being
+event classes, and @code{acknowledgers} and @code{end-acknowledgers}
+with the subordinate symbols being interfaces."
+ (let loop ((forms forms))
+ (if (cheap-list? forms)
+ `(list
+ ,@(map (lambda (form)
+ (if (pair? (car form))
+ `(cons ',(caar form) (lambda ,(cdar form) ,@(cdr form)))
+ `(cons ',(car form) ,(loop (cdr form)))))
+ forms))
+ forms)))
'|'.join ([l.code for l in langdefs.LANGUAGES]) + '))(/|$)',
find_files = r'.*?\.(?:midi|html|pdf|png|jpe?g|txt|i?ly|signature|css|zip|js|..\.idx|php)$|VERSION',
exclude_files = r'lily-[0-9a-f]+.*\.(pdf|txt)')
+# extra files: info and tex output from lilypond-book regtests
+extra_files = mirrortree.walk_tree (
+ tree_roots = ['input/regression/lilypond-book'],
+ process_dirs = outdir,
+ exclude_dirs = r'(^|/)(out|out-test)(/|$)',
+ find_files = r'.+\.(info|tex)$',
+ exclude_files = r'lily-[0-9a-f]+.*\.tex')[2]
+files.extend(extra_files)
# actual mirrorring stuff
html_files = []
AC_DEFUN(STEPMAKE_GUILE, [
- STEPMAKE_PATH_PROG(GUILE, guile, $1)
+ STEPMAKE_PATH_PROG(GUILE, guile guile1, $1)
])
test -n "$target_alias" && target_guile_config=$target_alias-guile-config
test -n "$host_alias" && host_guile_config=$host_alias-guile-config
AC_MSG_CHECKING([for guile-config])
- for guile_config in $GUILE_CONFIG $target_guile_config $host_guile_config $build_guile_config guile-config; do
+ for guile_config in $GUILE_CONFIG $target_guile_config $host_guile_config $build_guile_config guile-config guile1-config; do
AC_MSG_RESULT([$guile_config])
if ! $guile_config --version > /dev/null 2>&1 ; then
AC_MSG_WARN([cannot execute $guile_config])
done
STEPMAKE_OPTIONAL_REQUIRED(GUILE_CONFIG, $guile_config, $1)
if test $? -ne 0; then
- STEPMAKE_ADD_ENTRY($1, 'guile-config (guile-devel, guile-dev or libguile-dev package)')
+ STEPMAKE_ADD_ENTRY($1, 'guile-config (guile-devel, guile-dev or libguile-dev package) or guile1-config (guile1-devel package)')
fi
STEPMAKE_CHECK_SEARCH_RESULT(GUILE_CONFIG)
DOCUMENTATION_INCLUDES += -I $(top-src-dir)/Documentation
-MAKEINFO_FLAGS += --enable-encoding $(DOCUMENTATION_INCLUDES)
+MAKEINFO_FLAGS += --enable-encoding --error-limit=0 $(DOCUMENTATION_INCLUDES)
MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS)
# texi2html xref map files
TEXI2HTML_SPLIT = --prefix=index --split=section
TEXI2HTML_INCLUDES += --I=$(src-dir) --I=$(outdir) $(DOCUMENTATION_INCLUDES) --I=$(XREF_MAPS_DIR)
-TEXI2HTML_FLAGS += $(TEXI2HTML_INCLUDES) $(TEXI2HTML_INIT) $(TEXI2HTML_LANG)
+TEXI2HTML_FLAGS += --error-limit=0 $(TEXI2HTML_INCLUDES) $(TEXI2HTML_INIT) $(TEXI2HTML_LANG)
TEXI2HTML = TOP_SRC_DIR=$(top-src-dir) PERL_UNICODE=SD $(TEXI2HTML_PROGRAM)
###########