include $(depth)/make/stepmake.make
+DOCUMENTATION_INCLUDES += -I $(outdir) \
+ -I $(top-build-dir)/Documentation/snippets/out \
+ -I $(top-src-dir)/Documentation/included \
+ -I $(top-src-dir)/Documentation/pictures \
+ -I $(top-src-dir)/Documentation \
+ -I $(top-src-dir)/input/regression
+
OUT_TXT_FILES = $(addprefix $(outdir)/, $(addsuffix .txt, $(README_TOP_FILES)))
$(buildscript-dir)/text2html $<
# Explicitly list the dependencies on generated content
-$(outdir)/web.texi: $(outdir)/we-wrote.itexi $(outdir)/others-did.itexi $(outdir)/weblinks.itexi
+$(outdir)/web.texi: $(outdir)/we-wrote.itexi $(outdir)/others-did.itexi $(outdir)/weblinks.itexi $(outdir)/version.itexi
ifeq ($(out),www)
## Extra images dependencies
$(OUT_TEXINFO_MANUALS): $(outdir)/pictures
$(outdir)/pictures:
- $(MAKE) -C pictures WWW-1
+ $(MAKE) -C pictures out=www WWW-1
ln -sf ../pictures/$(outdir) $@
$(outdir)/web.texi: $(outdir)/css $(outdir)/ly-examples
$(outdir)/css:
- $(MAKE) -C css
+ $(MAKE) -C css out=www WWW-1
ln -sf ../css/$(outdir) $@
$(outdir)/ly-examples:
- $(MAKE) -C ly-examples
+ $(MAKE) -C ly-examples out=www WWW-1
ln -sf ../ly-examples/$(outdir) $@
endif
>>
@end lilypond
+@item
+New commands @code{markLengthOn} and @code{markLengthOff} control
+the allowance of horizontal space for tempo and rehearsal marks.
+
+@lilypond[quote,relative=2]
+\markLengthOn
+\compressFullBarRests
+\tempo "Molto vivace" c2 c'
+\mark\default
+\tempo "Meno mosso" R1*16
+\mark\default
+g,2 g
+\bar "||"
+\markLengthOff
+\tempo "Molto vivace" c2 c'
+\mark#1
+\tempo "Meno mosso" R1*16
+\mark\default
+g,2 g
+@end lilypond
+
+@item
+Rehearsal marks at the beginning of a line are now placed to the right
+of the clef and key signature by default. As in previous versions, the
+@code{break-alignable-interface} controls the behavior.
+
+@lilypond[quote,relative=2]
+\set Score.barNumberVisibility = #all-bar-numbers-visible
+\set Timing.currentBarNumber = #72
+\bar"||" \time 3/4 \key e\major \mark#10 \tempo "Adagio" b2.
+@end lilypond
+
@item
Decimal numbers can now be written directly in music,
without a hash sign. Together with the previous change
the leading arguments of markup functions that take a markup as
their last argument.
+@funindex \markup
+@cindex markup macro
+@funindex interpret-markup
+Markup commands have a rather complex life cycle. The body of a
+markup command definition is responsible for converting the
+arguments of the markup command into a stencil expression which is
+returned. Quite often this is accomplished by calling the
+@code{interpret-markup} function on a markup expression, passing
+the @var{layout} and @var{props} arguments on to it. Those
+arguments are usually only known at a very late stage in
+typesetting. Markup expressions have their components assembled
+into markup expressions already when @code{\markup} in a LilyPond
+expression or the @code{markup} macro in Scheme is expanded. The
+evaluation and typechecking of markup command arguments happens at
+the time @code{\markup}/@code{markup} are interpreted.
+
+But the actual conversion of markup expressions into stencil
+expressions by executing the markup function bodies only happens
+when @code{interpret-markup} is called on a markup expression.
+
@node On properties
@unnumberedsubsubsec On properties
@node New markup list command definition
@subsection New markup list command definition
+@funindex define-markup-list-command
+@funindex interpret-markup-list
Markup list commands are defined with the
@code{define-markup-list-command} Scheme macro, which is similar to the
@code{define-markup-command} macro described in
@ref{New markup command definition}, except that where the latter returns
a single stencil, the former returns a list of stencils.
+In a similar vein, @code{interpret-markup-list} is used instead of
+@code{interpret-markup} for converting a markup list into a list
+of stencils.
+
In the following example, a @code{\paragraph} markup list command is
defined, which returns a list of justified lines, the first one being
indented. The indent width is taken from the @code{props} argument.
@node Inline Scheme code
@section Inline Scheme code
-TODO: the example for this section is ill-chosen since
-@example
-F = -\tweak font-size #-3 -\flageolet
-@end example
-(note the @samp{-} marking it as a post event) will actually work fine
-for the stated purpose. Until this section gets a rewrite, let's
-pretend we don't know.
+TODO: after this section had been written, LilyPond has improved
+to the point that finding a @emph{simple} example where one would
+@emph{have} to revert to Scheme has become rather hard.
+
+Until this section gets a rewrite, let's pretend we don't know.
The main disadvantage of @code{\tweak} is its syntactical
-inflexibility. For example, the following produces a syntax error.
+inflexibility. For example, the following produces a syntax error
+(or rather, it did so at some point in the past).
@example
F = \tweak font-size #-3 -\flageolet
OUT_SMALL_PNG_FILES = $(OUT_PNG_FILES:%.png=%-small.png)
ifeq ($(out),www)
-all: $(OUT_PNG_FILES) $(OUT_SMALL_PNG_FILES)
+local-WWW-1: $(OUT_PNG_FILES) $(OUT_SMALL_PNG_FILES)
endif
$(outdir)/%.png: %.ly
OUT_TXT_FILES = $(addprefix $(outdir)/, $(addsuffix .txt, $(TEXTS)))
##local-WWW-2: $(OUT_TXT_FILES) $(OUT_HTMLFILES) txt-to-html
-copy-for-me:
- $(foreach a, $(README_TOP_FILES), cp ../$(a) $(outdir)/$(a).txt && ) true
-
$(outdir)/%.txt: %
cp $< $@
rehearsal marks are aligned:
@lilypond[verbatim,quote,relative=1]
-% The rehearsal mark will be aligned to right edge of the Clef
+% The rehearsal mark will be aligned to the right edge of the Clef
\override Score.RehearsalMark.break-align-symbols = #'(clef)
\key a \major
\clef treble
\mark "↓"
e1
-% The rehearsal mark will be centered above the Time Signature
+% The rehearsal mark will be aligned to the left edge of the Time Signature
\override Score.RehearsalMark.break-align-symbols = #'(time-signature)
\key a \major
\clef treble
STEPMAKE_TEMPLATES=documentation tex texinfo topdocs
LOCALSTEPMAKE_TEMPLATES=lilypond ly
-OUT_TEXI_FILES = $(TELY_FILES:%.tely=$(outdir)/%.texi)
+OUT_TEXI_FILES = $(TEXI_FILES:%.texi=$(outdir)/%.texi) $(TELY_FILES:%.tely=$(outdir)/%.texi)
HTML_FILES=$(TEXI_FILES:%.texi=$(outdir)/%.html) $(TELY_FILES:%.tely=$(outdir)/%.html)
README_TOP_FILES=NEWS AUTHORS INSTALL README
OUTTXT_FILES= $(outdir)/NEWS.txt
include $(depth)/make/stepmake.make
+DOCUMENTATION_INCLUDES += -I $(outdir) \
+ -I $(top-src-dir)/Documentation
+
# FIXME ad-hoc file copy?
$(outdir)/NEWS.tely: $(top-src-dir)/Documentation/changes.tely
cp -f $< $@
return SCM_BOOL_T;
}
-/* Return upper and lower skylines for VerticalAxisGroup g. If the extent
- is non-empty but there is no skyline available (or pure is true), just
+/* for each grob, find its upper and lower skylines. If the grob has
+ an empty extent, delete it from the list instead. If the extent is
+ non-empty but there is no skyline available (or pure is true), just
create a flat skyline from the bounding box */
// TODO(jneem): the pure and non-pure parts seem to share very little
// code. Split them into 2 functions, perhaps?
-static Skyline_pair
-get_skylines (Grob *g,
+static void
+get_skylines (Grob *me,
+ vector<Grob *> *const elements,
Axis a,
- Grob *other_common,
- bool pure, int start, int end)
+ bool pure, int start, int end,
+ vector<Skyline_pair> *const ret)
{
- Skyline_pair skylines;
+ Grob *other_common = common_refpoint_of_array (*elements, me, other_axis (a));
- if (!pure)
+ for (vsize i = elements->size (); i--;)
{
- Skyline_pair *skys = Skyline_pair::unsmob (g->get_property (a == Y_AXIS
- ? "vertical-skylines"
- : "horizontal-skylines"));
- if (skys)
- skylines = *skys;
-
- /* This skyline was calculated relative to the grob g. In order to compare it to
- skylines belonging to other grobs, we need to shift it so that it is relative
- to the common reference. */
- Real offset = g->relative_coordinate (other_common, other_axis (a));
- skylines.shift (offset);
- }
- else if (Hara_kiri_group_spanner::request_suicide (g, start, end))
- return skylines;
- else
- {
- assert (a == Y_AXIS);
- Interval extent = g->pure_height (g, start, end);
-
- // This is a hack to get better accuracy on the pure-height of VerticalAlignment.
- // It's quite common for a treble clef to be the highest element of one system
- // and for a low note (or lyrics) to be the lowest note on another. The two will
- // never collide, but the pure-height stuff only works with bounding boxes, so it
- // doesn't know that. The result is a significant over-estimation of the pure-height,
- // especially on systems with many staves. To correct for this, we build a skyline
- // in two parts: the part we did above contains most of the grobs (note-heads, etc.)
- // while the bit we're about to do only contains the breakable grobs at the beginning
- // of the system. This way, the tall treble clefs are only compared with the treble
- // clefs of the other staff and they will be ignored if the staff above is, for example,
- // lyrics.
- if (Axis_group_interface::has_interface (g))
+ Grob *g = (*elements)[i];
+ Skyline_pair skylines;
+
+ if (!pure)
{
- extent = Axis_group_interface::rest_of_line_pure_height (g, start, end);
- Interval begin_of_line_extent = Axis_group_interface::begin_of_line_pure_height (g, start);
- if (!begin_of_line_extent.is_empty ())
+ Skyline_pair *skys = Skyline_pair::unsmob (g->get_property (a == Y_AXIS
+ ? "vertical-skylines"
+ : "horizontal-skylines"));
+ if (skys)
+ skylines = *skys;
+
+ /* This skyline was calculated relative to the grob g. In order to compare it to
+ skylines belonging to other grobs, we need to shift it so that it is relative
+ to the common reference. */
+ Real offset = g->relative_coordinate (other_common, other_axis (a));
+ skylines.shift (offset);
+ }
+ else
+ {
+ assert (a == Y_AXIS);
+ Interval extent = g->pure_height (g, start, end);
+
+ // This is a hack to get better accuracy on the pure-height of VerticalAlignment.
+ // It's quite common for a treble clef to be the highest element of one system
+ // and for a low note (or lyrics) to be the lowest note on another. The two will
+ // never collide, but the pure-height stuff only works with bounding boxes, so it
+ // doesn't know that. The result is a significant over-estimation of the pure-height,
+ // especially on systems with many staves. To correct for this, we build a skyline
+ // in two parts: the part we did above contains most of the grobs (note-heads, etc.)
+ // while the bit we're about to do only contains the breakable grobs at the beginning
+ // of the system. This way, the tall treble clefs are only compared with the treble
+ // clefs of the other staff and they will be ignored if the staff above is, for example,
+ // lyrics.
+ if (Axis_group_interface::has_interface (g)
+ && !Hara_kiri_group_spanner::request_suicide (g, start, end))
+ {
+ extent = Axis_group_interface::rest_of_line_pure_height (g, start, end);
+ Interval begin_of_line_extent = Axis_group_interface::begin_of_line_pure_height (g, start);
+ if (!begin_of_line_extent.is_empty ())
+ {
+ Box b;
+ b[a] = begin_of_line_extent;
+ b[other_axis (a)] = Interval (-infinity_f, -1);
+ skylines.insert (b, other_axis (a));
+ }
+ }
+
+ if (!extent.is_empty ())
{
Box b;
- b[a] = begin_of_line_extent;
- b[other_axis (a)] = Interval (-infinity_f, -1);
+ b[a] = extent;
+ b[other_axis (a)] = Interval (0, infinity_f);
skylines.insert (b, other_axis (a));
}
}
- if (!extent.is_empty ())
- {
- Box b;
- b[a] = extent;
- b[other_axis (a)] = Interval (0, infinity_f);
- skylines.insert (b, other_axis (a));
- }
+ if (skylines.is_empty ())
+ elements->erase (elements->begin () + i);
+ else
+ ret->push_back (skylines);
}
- return skylines;
+ reverse (*ret);
}
vector<Real>
// else centered dynamics will break when there is a fixed alignment).
vector<Real>
Align_interface::internal_get_minimum_translations (Grob *me,
- vector<Grob *> const &elems,
+ vector<Grob *> const &all_grobs,
Axis a,
bool include_fixed_spacing,
bool pure, int start, int end)
Direction stacking_dir = robust_scm2dir (me->get_property ("stacking-dir"),
DOWN);
+ vector<Grob *> elems (all_grobs); // writable copy
+ vector<Skyline_pair> skylines;
- Grob *other_common = common_refpoint_of_array (elems, me, other_axis (a));
+ get_skylines (me, &elems, a, pure, start, end, &skylines);
Real where = 0;
Real default_padding = robust_scm2double (me->get_property ("padding"), 0.0);
vector<Real> translates;
Skyline down_skyline (stacking_dir);
- Grob *last_nonempty_element = 0;
Real last_spaceable_element_pos = 0;
Grob *last_spaceable_element = 0;
Skyline last_spaceable_skyline (stacking_dir);
Real dy = 0;
Real padding = default_padding;
- Skyline_pair skyline = get_skylines (elems[j], a, other_common, pure, start, end);
-
- if (skyline.is_empty ())
- dy = 0.0;
- else if (!last_nonempty_element)
- dy = skyline[-stacking_dir].max_height () + padding;
+ if (j == 0)
+ dy = skylines[j][-stacking_dir].max_height () + padding;
else
{
- SCM spec = Page_layout_problem::get_spacing_spec (last_nonempty_element, elems[j], pure, start, end);
+ SCM spec = Page_layout_problem::get_spacing_spec (elems[j - 1], elems[j], pure, start, end);
Page_layout_problem::read_spacing_spec (spec, &padding, ly_symbol2scm ("padding"));
- dy = down_skyline.distance (skyline[-stacking_dir]) + padding;
+ dy = down_skyline.distance (skylines[j][-stacking_dir]) + padding;
Real spec_distance = 0;
if (Page_layout_problem::read_spacing_spec (spec, &spec_distance, ly_symbol2scm ("minimum-distance")))
Page_layout_problem::read_spacing_spec (spec,
&spaceable_padding,
ly_symbol2scm ("padding"));
- dy = max (dy, (last_spaceable_skyline.distance (skyline[-stacking_dir])
+ dy = max (dy, (last_spaceable_skyline.distance (skylines[j][-stacking_dir])
+ stacking_dir * (last_spaceable_element_pos - where) + spaceable_padding));
Real spaceable_min_distance = 0;
}
}
+ if (isinf (dy)) /* if the skyline is empty, maybe max_height is infinity_f */
+ dy = 0.0;
+
dy = max (0.0, dy);
down_skyline.raise (-stacking_dir * dy);
- down_skyline.merge (skyline[stacking_dir]);
+ down_skyline.merge (skylines[j][stacking_dir]);
where += stacking_dir * dy;
translates.push_back (where);
last_spaceable_element_pos = where;
last_spaceable_skyline = down_skyline;
}
- if (!skyline.is_empty ())
- last_nonempty_element = elems[j];
+ }
+
+ // So far, we've computed the translates for all the non-empty elements.
+ // Here, we set the translates for the empty elements: an empty element
+ // gets the same translation as the last non-empty element before it.
+ vector<Real> all_translates;
+ if (!translates.empty ())
+ {
+ Real w = translates[0];
+ for (vsize i = 0, j = 0; j < all_grobs.size (); j++)
+ {
+ if (i < elems.size () && all_grobs[j] == elems[i])
+ w = translates[i++];
+ all_translates.push_back (w);
+ }
}
if (pure)
{
SCM mta = me->get_property ("minimum-translations-alist");
mta = scm_cons (scm_cons (scm_cons (scm_from_int (start), scm_from_int (end)),
- ly_floatvector2scm (translates)),
+ ly_floatvector2scm (all_translates)),
mta);
me->set_property ("minimum-translations-alist", mta);
}
- return translates;
+ return all_translates;
}
void
{
Spanner *me = dynamic_cast<Spanner *> (me_grob);
- if (me->get_bound (LEFT)->break_status_dir ()
- || me->get_bound (RIGHT)->break_status_dir ())
+ Item *left = me->get_bound (LEFT);
+ Item *right = me->get_bound (RIGHT);
+ if (!left || left->break_status_dir ()
+ || !right || right->break_status_dir ())
return 0;
Drul_array<Grob *> stems (Note_column::get_stem (cols[0]),
tuplets_.pop_back ();
}
else if (!to_boolean (get_property ("skipTypesetting")))
- ev->origin ()->warning (_ ("No tuplet to end"));
+ ev->origin ()->debug_output (_ ("No tuplet to end"));
}
else
ev->origin ()->programming_error ("direction tuplet-span-event_ invalid.");
stopped_tuplets_[i].bracket_->get_bound (LEFT));
}
else
- programming_error ("stopped tuplet bracket has neither left nor right bound");
+ {
+ warning ("omitting tuplet bracket with neither left nor right bound");
+ continue;
+ }
}
// todo: scrap last_tuplets_, use stopped_tuplets_ only.
// clear stopped_tuplets_ at start_translation_timestep
.SUFFIXES: .html .info .texi .texinfo
# Explicitly list the dependencies on generated content
-$(outdir)/web.texi: $(outdir)/we-wrote.itexi $(outdir)/others-did.itexi $(outdir)/weblinks.itexi
+$(outdir)/web.texi: $(outdir)/we-wrote.itexi $(outdir)/others-did.itexi $(outdir)/weblinks.itexi $(outdir)/version.itexi
$(top-build-dir)/Documentation/$(outdir)/%/index.$(ISOLANG).html: $(outdir)/%/index.html $(TRANSLATION_LILY_IMAGES)
mkdir -p $(dir $@)
$(MASTER_TEXI_FILES): $(ITELY_FILES) $(ITEXI_FILES) $(outdir)/pictures
$(outdir)/pictures:
- $(MAKE) -C $(top-build-dir)/Documentation/pictures WWW-1
+ $(MAKE) -C $(top-build-dir)/Documentation/pictures out=www WWW-1
ln -sf $(top-build-dir)/Documentation/pictures/$(outdir) $@
$(TRANSLATION_LILY_IMAGES): $(MASTER_TEXI_FILES)
ifeq ($(out),www)
ifneq ($(NO_PDF_FILES),)
-local-WWW-1: $(OUT_TEXINFO_MANUALS) $(MASTER_TEXI_FILES) $(XREF_MAPS_FILES)
+local-WWW-1: $(OUT_TEXINFO_MANUALS) $(MASTER_TEXI_FILES) $(XREF_MAPS_FILES) $(TRANSLATION_LILY_IMAGES)
endif
ifeq ($(NO_PDF_FILES),)
-local-WWW-1: $(OUT_TEXINFO_MANUALS) $(MASTER_TEXI_FILES) $(PDF_FILES) $(XREF_MAPS_FILES)
+local-WWW-1: $(OUT_TEXINFO_MANUALS) $(MASTER_TEXI_FILES) $(PDF_FILES) $(XREF_MAPS_FILES) $(TRANSLATION_LILY_IMAGES)
endif
local-WWW-2: $(DEEP_HTML_FILES) $(BIG_PAGE_HTML_FILES) $(DOCUMENTATION_LOCALE_TARGET)
ITELY_FILES := $(call src-wildcard,*.itely)
ITEXI_FILES := $(call src-wildcard,*.itexi)
-DOCUMENTATION_INCLUDES = \
+DOCUMENTATION_INCLUDES += \
+ -I $(top-build-dir)/Documentation/$(outdir) \
+ -I $(top-build-dir)/Documentation/snippets/out \
-I $(top-src-dir)/Documentation/$(ISOLANG)/included \
+ -I $(top-src-dir)/Documentation/included \
-I $(top-src-dir)/Documentation \
- -I $(top-build-dir)/Documentation/$(outdir)
+ -I $(top-src-dir)/input/regression
-LILYPOND_BOOK_INCLUDES += $(DOCUMENTATION_INCLUDES)
MAKEINFO_FLAGS += --enable-encoding $(DOCUMENTATION_INCLUDES)
MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS)
CONVERT_LY = $(script-dir)/convert-ly.py
LILYPOND_BOOK = $(script-dir)/lilypond-book.py
-LILYPOND_BOOK_INCLUDES = -I $(outdir) -I $(src-dir) -I $(input-dir) \
- -I $(top-src-dir)/Documentation -I $(top-build-dir)/Documentation/snippets/out \
- -I $(input-dir)/regression/ -I $(top-src-dir)/Documentation/included/ \
- -I $(top-build-dir)/mf/$(outconfbase)/ \
- -I $(top-build-dir)/mf/out/ \
- -I $(top-src-dir)/Documentation/pictures \
- -I $(top-build-dir)/Documentation/pictures/$(outdir)
+LILYPOND_BOOK_INCLUDES = -I $(src-dir) $(DOCUMENTATION_INCLUDES)
## override from cmd line to speed up.
ANTI_ALIAS_FACTOR=2
def conv(str):
str = re.sub (r"\\stringTuning\s*\\notemode(\s*)@?\{\s*(.*?)\s*@?}",
r"\\stringTuning\1\2", str)
+ if re.search (r'\bstaff-padding\b', str):
+ stderr_write (NOT_SMART % "staff-padding")
+ stderr_write (_ ("Staff-padding now controls the distance to the baseline, not the nearest point."))
return str
# Guidelines to write rules (please keep this at the end of this file)
predicates, to be used in case of a type error in arguments or
result."
+ (define (currying-lambda args doc-string? body)
+ (if (and (pair? args)
+ (pair? (car args)))
+ (currying-lambda (car args) doc-string?
+ `((lambda ,(cdr args) ,@body)))
+ (if doc-string?
+ `(lambda ,args ,doc-string? ,@body)
+ `(lambda ,args ,@body))))
+
(set! signature (map (lambda (pred)
(if (pair? pred)
`(cons ,(car pred)
,(and (pair? (cdr pred)) (cadr pred)))
pred))
(cons type signature)))
- (if (and (pair? body) (pair? (car body)) (eqv? '_i (caar body)))
- ;; When the music function definition contains an i10n doc string,
- ;; (_i "doc string"), keep the literal string only
- (let ((docstring (cadar body))
- (body (cdr body)))
- `(ly:make-music-function (list ,@signature)
- (lambda ,args
- ,docstring
- ,@body)))
- `(ly:make-music-function (list ,@signature)
- (lambda ,args
- ,@body))))
+
+ (let ((docstring
+ (and (pair? body) (pair? (cdr body))
+ (if (string? (car body))
+ (car body)
+ (and (pair? (car body))
+ (eq? '_i (caar body))
+ (pair? (cdar body))
+ (string? (cadar body))
+ (null? (cddar body))
+ (cadar body))))))
+ ;; When the music function definition contains an i10n doc string,
+ ;; (_i "doc string"), keep the literal string only
+ `(ly:make-music-function
+ (list ,@signature)
+ ,(currying-lambda args docstring (if docstring (cdr body) body)))))
(defmacro-public define-music-function rest
"Defining macro returning music functions.
%.gz: %
gzip -c9 $< > $@
-
-$(outdir)/%.css: $(CSS_DIRECTORY)/%.css
- ln -f $< $@
touch $@
# Copy files while tracking their dependencies.
-$(outdir)/%.texi: %.texi
+$(outdir)/%.texi: %.texi $(outdir)/version.itexi
mkdir -p $(dir $@)
$(DO_TEXI_DEP) cp -f $< $@
TEXINFO_PAPERSIZE_OPTION= $(if $(findstring $(PAPERSIZE),a4),,-t @afourpaper)
-DOCUMENTATION_INCLUDES += -I $(top-src-dir)/Documentation
-
MAKEINFO_FLAGS += --enable-encoding --error-limit=0 $(DOCUMENTATION_INCLUDES)
MAKEINFO = LANG= $(MAKEINFO_PROGRAM) $(MAKEINFO_FLAGS)
TO_TOP_FILES=$(addprefix $(outdir)/, $(addsuffix .txt, $(README_TOP_FILES)))
-DOCUMENTATION_INCLUDES +=\
- -I $(top-src-dir)/Documentation/usage\
- -I $(top-src-dir)/Documentation/contributor\
-
#