mirror of https://github.com/Wilfred/difftastic/
Add 'vendor/tree-sitter-make/' from commit 'a4b9187417d6be349ee5fd4b6e77b4172c6827dd'
git-subtree-dir: vendor/tree-sitter-make git-subtree-mainline:add_libdifftasticb1b3756fa7git-subtree-split:a4b9187417
commit
615daf8880
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Alexandre A. Muller
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
# tree-sitter-make
|
||||||
|
Tree-sitter-make is a Make parser intended to be used for syntax highlighting.
|
||||||
|
|
||||||
|
## Missing features
|
||||||
|
- [ ] Support to custom .RECIPEPREFIX
|
||||||
|
- [ ] Load directive
|
||||||
|
|
||||||
|
This parser uses GNUMakefile documentation as reference. Others makefile formats
|
||||||
|
might have features not implemented by this grammar. Feel free to open an issue
|
||||||
|
with a feature request or do a pull request to extend this grammar to support
|
||||||
|
other makefiles formats.
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
* [GNU Make manual](https://www.gnu.org/software/make/manual/html_node/index.html)
|
||||||
@ -0,0 +1,622 @@
|
|||||||
|
const CHARSET = 'a-zA-Z0-9%\\+\\-\\.@_\\*\\?\\/';
|
||||||
|
const ESCAPE_SET = 'abtnvfrE!"#\\$&\'\\(\\)\\*,;<>\\?\\[\\\\\\]^`{\\|}~'
|
||||||
|
|
||||||
|
const NL = token.immediate(/[\r\n]+/);
|
||||||
|
const WS = token.immediate(/[\t ]+/);
|
||||||
|
const SPLIT = alias(token.immediate(seq('\\', /\r?\n|\r/)), '\\');
|
||||||
|
|
||||||
|
const AUTOMATIC_VARS = [ '@', '%', '<', '?', '^', '+', '/', '*' ];
|
||||||
|
|
||||||
|
const DEFINE_OPS = ['=', ':=', '::=', '?=', '+='];
|
||||||
|
|
||||||
|
const FUNCTIONS = [
|
||||||
|
'subst',
|
||||||
|
'patsubst',
|
||||||
|
'strip',
|
||||||
|
'findstring',
|
||||||
|
'filter',
|
||||||
|
'filter-out',
|
||||||
|
'sort',
|
||||||
|
'word',
|
||||||
|
'words',
|
||||||
|
'wordlist',
|
||||||
|
'firstword',
|
||||||
|
'lastword',
|
||||||
|
'dir',
|
||||||
|
'notdir',
|
||||||
|
'suffix',
|
||||||
|
'basename',
|
||||||
|
'addsuffix',
|
||||||
|
'addprefix',
|
||||||
|
'join',
|
||||||
|
'wildcard',
|
||||||
|
'realpath',
|
||||||
|
'abspath',
|
||||||
|
'error',
|
||||||
|
'warning',
|
||||||
|
'info',
|
||||||
|
'origin',
|
||||||
|
'flavor',
|
||||||
|
'foreach',
|
||||||
|
'if',
|
||||||
|
'or',
|
||||||
|
'and',
|
||||||
|
'call',
|
||||||
|
'eval',
|
||||||
|
'file',
|
||||||
|
'value',
|
||||||
|
];
|
||||||
|
|
||||||
|
module.exports = grammar({
|
||||||
|
name: 'make',
|
||||||
|
|
||||||
|
word: $ => $.word,
|
||||||
|
|
||||||
|
inline: $ => [
|
||||||
|
$._targets,
|
||||||
|
$._target_pattern,
|
||||||
|
$._prerequisites_pattern,
|
||||||
|
$._prerequisites,
|
||||||
|
$._order_only_prerequisites,
|
||||||
|
$._target_or_pattern_assignment,
|
||||||
|
|
||||||
|
$._primary,
|
||||||
|
$._name,
|
||||||
|
$._string,
|
||||||
|
],
|
||||||
|
|
||||||
|
extras: $ => [
|
||||||
|
/[\s]/,
|
||||||
|
alias(token(seq('\\',/\r?\n|\r/)), '\\'),
|
||||||
|
$.comment
|
||||||
|
],
|
||||||
|
|
||||||
|
conflicts: $ => [],
|
||||||
|
|
||||||
|
precedences: $ => [],
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
|
||||||
|
// 3.1
|
||||||
|
makefile: $ => repeat($._thing),
|
||||||
|
|
||||||
|
_thing: $ => choice(
|
||||||
|
$.rule,
|
||||||
|
$._variable_definition,
|
||||||
|
$._directive,
|
||||||
|
seq($._function, NL)
|
||||||
|
),
|
||||||
|
|
||||||
|
// Rules {{{
|
||||||
|
// 2.1
|
||||||
|
rule: $ => choice(
|
||||||
|
$._ordinary_rule,
|
||||||
|
$._static_pattern_rule,
|
||||||
|
),
|
||||||
|
|
||||||
|
_ordinary_rule: $ => prec.right(seq(
|
||||||
|
$._targets,
|
||||||
|
choice(':', '&:', '::'),
|
||||||
|
optional(WS),
|
||||||
|
optional($._prerequisites),
|
||||||
|
choice(
|
||||||
|
$.recipe,
|
||||||
|
NL
|
||||||
|
)
|
||||||
|
)),
|
||||||
|
|
||||||
|
// 4.12.1
|
||||||
|
_static_pattern_rule: $ => prec.right(seq(
|
||||||
|
$._targets,
|
||||||
|
':',
|
||||||
|
optional(WS),
|
||||||
|
$._target_pattern,
|
||||||
|
':',
|
||||||
|
optional(WS),
|
||||||
|
optional($._prerequisites_pattern),
|
||||||
|
choice(
|
||||||
|
$.recipe,
|
||||||
|
NL
|
||||||
|
)
|
||||||
|
)),
|
||||||
|
|
||||||
|
_targets: $ => alias($.list, $.targets),
|
||||||
|
|
||||||
|
// LINT: List shall have length one
|
||||||
|
_target_pattern: $ => field(
|
||||||
|
'target',
|
||||||
|
alias($.list, $.pattern_list)
|
||||||
|
),
|
||||||
|
|
||||||
|
// 4.3
|
||||||
|
_prerequisites: $ => choice(
|
||||||
|
$._normal_prerequisites,
|
||||||
|
seq(
|
||||||
|
optional($._normal_prerequisites),
|
||||||
|
'|',
|
||||||
|
$._order_only_prerequisites
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
_normal_prerequisites: $ => field(
|
||||||
|
'normal',
|
||||||
|
alias($.list, $.prerequisites),
|
||||||
|
),
|
||||||
|
|
||||||
|
_order_only_prerequisites: $ => field(
|
||||||
|
'order_only',
|
||||||
|
alias($.list, $.prerequisites)
|
||||||
|
),
|
||||||
|
|
||||||
|
_prerequisites_pattern: $ => field(
|
||||||
|
'prerequisite',
|
||||||
|
alias($.list, $.pattern_list)
|
||||||
|
),
|
||||||
|
|
||||||
|
recipe: $ => prec.right(choice(
|
||||||
|
// the first recipe line may be attached to the
|
||||||
|
// target-and-prerequisites line with a semicolon
|
||||||
|
// in between
|
||||||
|
seq(
|
||||||
|
$._attached_recipe_line,
|
||||||
|
NL,
|
||||||
|
repeat(choice(
|
||||||
|
$.conditional,
|
||||||
|
$._prefixed_recipe_line,
|
||||||
|
))
|
||||||
|
),
|
||||||
|
seq(
|
||||||
|
NL,
|
||||||
|
repeat1(choice(
|
||||||
|
$.conditional,
|
||||||
|
$._prefixed_recipe_line
|
||||||
|
))
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
|
||||||
|
_attached_recipe_line: $ => seq(
|
||||||
|
';',
|
||||||
|
optional($.recipe_line)
|
||||||
|
),
|
||||||
|
|
||||||
|
_prefixed_recipe_line: $ => seq(
|
||||||
|
$._recipeprefix,
|
||||||
|
optional($.recipe_line),
|
||||||
|
NL
|
||||||
|
),
|
||||||
|
|
||||||
|
recipe_line: $ => seq(
|
||||||
|
optional(choice(
|
||||||
|
...['@', '-', '+'].map(c => token(prec(1,c)))
|
||||||
|
)),
|
||||||
|
optional(seq(
|
||||||
|
alias($.shell_text_with_split, $.shell_text),
|
||||||
|
repeat(seq(
|
||||||
|
// splited recipe lines may start with .RECIPEPREFIX
|
||||||
|
// that shall not be part of the shell_code
|
||||||
|
optional($._recipeprefix),
|
||||||
|
alias($.shell_text_with_split, $.shell_text),
|
||||||
|
)),
|
||||||
|
optional($._recipeprefix),
|
||||||
|
)),
|
||||||
|
alias($._shell_text_without_split, $.shell_text),
|
||||||
|
),
|
||||||
|
// }}}
|
||||||
|
// Variables {{{
|
||||||
|
_variable_definition: $ => choice(
|
||||||
|
$.VPATH_assignment,
|
||||||
|
$.RECIPEPREFIX_assignment,
|
||||||
|
$.variable_assignment,
|
||||||
|
$.shell_assignment,
|
||||||
|
$.define_directive
|
||||||
|
),
|
||||||
|
|
||||||
|
// 4.5.1
|
||||||
|
VPATH_assignment: $ => seq(
|
||||||
|
field('name','VPATH'),
|
||||||
|
optional(WS),
|
||||||
|
field('operator',choice(...DEFINE_OPS)),
|
||||||
|
field('value',$.paths),
|
||||||
|
NL
|
||||||
|
),
|
||||||
|
|
||||||
|
RECIPEPREFIX_assignment: $ => seq(
|
||||||
|
field('name','.RECIPEPREFIX'),
|
||||||
|
optional(WS),
|
||||||
|
field('operator',choice(...DEFINE_OPS)),
|
||||||
|
field('value', $.text),
|
||||||
|
NL
|
||||||
|
),
|
||||||
|
|
||||||
|
// 6.5
|
||||||
|
variable_assignment: $ => seq(
|
||||||
|
optional($._target_or_pattern_assignment),
|
||||||
|
$._name,
|
||||||
|
optional(WS),
|
||||||
|
field('operator',choice(...DEFINE_OPS)),
|
||||||
|
optional(WS),
|
||||||
|
optional(field('value', $.text)),
|
||||||
|
NL
|
||||||
|
),
|
||||||
|
|
||||||
|
_target_or_pattern_assignment: $ => seq(
|
||||||
|
field('target_or_pattern', $.list),
|
||||||
|
':',
|
||||||
|
optional(WS),
|
||||||
|
),
|
||||||
|
|
||||||
|
shell_assignment: $ => seq(
|
||||||
|
field('name',$.word),
|
||||||
|
optional(WS),
|
||||||
|
field('operator','!='),
|
||||||
|
optional(WS),
|
||||||
|
field('value',$._shell_command),
|
||||||
|
NL
|
||||||
|
),
|
||||||
|
|
||||||
|
define_directive: $ => seq(
|
||||||
|
'define',
|
||||||
|
field('name',$.word),
|
||||||
|
optional(WS),
|
||||||
|
optional(field('operator',choice(...DEFINE_OPS))),
|
||||||
|
optional(WS),
|
||||||
|
NL,
|
||||||
|
optional(field('value',
|
||||||
|
alias(repeat1($._rawline), $.raw_text)
|
||||||
|
)),
|
||||||
|
token(prec(1,'endef')),
|
||||||
|
NL
|
||||||
|
),
|
||||||
|
// }}}
|
||||||
|
// Directives {{{
|
||||||
|
_directive: $ => choice(
|
||||||
|
$.include_directive,
|
||||||
|
$.vpath_directive,
|
||||||
|
$.export_directive,
|
||||||
|
$.unexport_directive,
|
||||||
|
$.override_directive,
|
||||||
|
$.undefine_directive,
|
||||||
|
$.private_directive,
|
||||||
|
$.conditional
|
||||||
|
),
|
||||||
|
|
||||||
|
// 3.3
|
||||||
|
include_directive: $ => choice(
|
||||||
|
seq( 'include', field('filenames',$.list), NL),
|
||||||
|
seq('sinclude', field('filenames',$.list), NL),
|
||||||
|
seq('-include', field('filenames',$.list), NL),
|
||||||
|
),
|
||||||
|
|
||||||
|
// 4.5.2
|
||||||
|
vpath_directive: $ => choice(
|
||||||
|
seq('vpath', NL),
|
||||||
|
seq('vpath', field('pattern', $.word), NL),
|
||||||
|
seq('vpath', field('pattern', $.word), field('directories', $.paths), NL)
|
||||||
|
),
|
||||||
|
|
||||||
|
// 5.7.2
|
||||||
|
export_directive: $ => choice(
|
||||||
|
seq('export', NL),
|
||||||
|
seq('export', field('variables', $.list), NL),
|
||||||
|
seq('export', $.variable_assignment)
|
||||||
|
),
|
||||||
|
|
||||||
|
// 5.7.2
|
||||||
|
unexport_directive: $ => choice(
|
||||||
|
seq('unexport', NL),
|
||||||
|
seq('unexport', field('variables', $.list), NL),
|
||||||
|
),
|
||||||
|
|
||||||
|
// 6.7
|
||||||
|
override_directive: $ => choice(
|
||||||
|
seq('override', $.define_directive),
|
||||||
|
seq('override', $.variable_assignment),
|
||||||
|
seq('override', $.undefine_directive),
|
||||||
|
),
|
||||||
|
|
||||||
|
// 6.9
|
||||||
|
undefine_directive: $ => seq(
|
||||||
|
'undefine', field('variable', $.word), NL
|
||||||
|
),
|
||||||
|
|
||||||
|
// 6.13
|
||||||
|
private_directive: $ => seq(
|
||||||
|
'private', $.variable_assignment
|
||||||
|
),
|
||||||
|
// }}}
|
||||||
|
// Conditionals {{{
|
||||||
|
// 7
|
||||||
|
conditional: $ => seq(
|
||||||
|
field('condition', $._conditional_directives),
|
||||||
|
optional(field('consequence', $._conditional_consequence)),
|
||||||
|
repeat($.elsif_directive),
|
||||||
|
optional($.else_directive),
|
||||||
|
'endif',
|
||||||
|
NL
|
||||||
|
),
|
||||||
|
|
||||||
|
elsif_directive: $ => seq(
|
||||||
|
'else',
|
||||||
|
field('condition', $._conditional_directives),
|
||||||
|
optional(field('consequence', $._conditional_consequence)),
|
||||||
|
),
|
||||||
|
|
||||||
|
else_directive: $ => seq(
|
||||||
|
'else',
|
||||||
|
NL,
|
||||||
|
optional(field('consequence', $._conditional_consequence)),
|
||||||
|
),
|
||||||
|
|
||||||
|
_conditional_directives: $ => choice(
|
||||||
|
$.ifeq_directive,
|
||||||
|
$.ifneq_directive,
|
||||||
|
$.ifdef_directive,
|
||||||
|
$.ifndef_directive
|
||||||
|
),
|
||||||
|
|
||||||
|
_conditional_consequence: $ => repeat1(choice(
|
||||||
|
$._thing,
|
||||||
|
$._prefixed_recipe_line
|
||||||
|
)),
|
||||||
|
|
||||||
|
ifeq_directive: $ => seq(
|
||||||
|
'ifeq', $._conditional_args_cmp, NL
|
||||||
|
),
|
||||||
|
|
||||||
|
ifneq_directive: $ => seq(
|
||||||
|
'ifneq', $._conditional_args_cmp, NL
|
||||||
|
),
|
||||||
|
|
||||||
|
ifdef_directive: $ => seq(
|
||||||
|
'ifdef', field('variable', $._primary), NL
|
||||||
|
),
|
||||||
|
|
||||||
|
ifndef_directive: $ => seq(
|
||||||
|
'ifndef', field('variable', $._primary), NL
|
||||||
|
),
|
||||||
|
|
||||||
|
_conditional_args_cmp: $ => choice(
|
||||||
|
seq(
|
||||||
|
'(',
|
||||||
|
optional(field('arg0', $._primary)),
|
||||||
|
',',
|
||||||
|
optional(field('arg1', $._primary)),
|
||||||
|
')'
|
||||||
|
),
|
||||||
|
seq(
|
||||||
|
field('arg0', $._primary),
|
||||||
|
field('arg1', $._primary),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// Variables {{{
|
||||||
|
_variable: $ => choice(
|
||||||
|
$.variable_reference,
|
||||||
|
$.substitution_reference,
|
||||||
|
$.automatic_variable,
|
||||||
|
),
|
||||||
|
|
||||||
|
variable_reference: $ => seq(
|
||||||
|
choice('$','$$'),
|
||||||
|
choice(
|
||||||
|
delimitedVariable($._primary),
|
||||||
|
// TODO are those legal? $) $$$
|
||||||
|
alias(token.immediate(/./), $.word), // match any single digit
|
||||||
|
//alias(token.immediate('\\\n'), $.word)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
// 6.3.1
|
||||||
|
substitution_reference: $ => seq(
|
||||||
|
choice('$','$$'),
|
||||||
|
delimitedVariable(seq(
|
||||||
|
field('text',$._primary),
|
||||||
|
':',
|
||||||
|
field('pattern',$._primary),
|
||||||
|
'=',
|
||||||
|
field('replacement',$._primary),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
|
||||||
|
// 10.5.3
|
||||||
|
automatic_variable: $ => seq(
|
||||||
|
choice('$','$$'),
|
||||||
|
choice(
|
||||||
|
choice(
|
||||||
|
...AUTOMATIC_VARS
|
||||||
|
.map(c => token.immediate(prec(1,c)))
|
||||||
|
),
|
||||||
|
delimitedVariable(seq(
|
||||||
|
choice(
|
||||||
|
...AUTOMATIC_VARS
|
||||||
|
.map(c => token(prec(1,c)))
|
||||||
|
),
|
||||||
|
optional(choice(
|
||||||
|
token.immediate('D'),
|
||||||
|
token.immediate('F')
|
||||||
|
)),
|
||||||
|
))
|
||||||
|
)
|
||||||
|
),
|
||||||
|
// }}}
|
||||||
|
// Functions {{{
|
||||||
|
_function: $ => choice(
|
||||||
|
$.function_call,
|
||||||
|
$.shell_function,
|
||||||
|
),
|
||||||
|
|
||||||
|
function_call: $ => seq(
|
||||||
|
choice('$','$$'),
|
||||||
|
token.immediate('('),
|
||||||
|
field('function', choice(
|
||||||
|
...FUNCTIONS.map(f => token.immediate(f))
|
||||||
|
)),
|
||||||
|
optional(WS),
|
||||||
|
$.arguments,
|
||||||
|
')'
|
||||||
|
),
|
||||||
|
|
||||||
|
arguments: $ => seq(
|
||||||
|
field('argument',$.text),
|
||||||
|
repeat(seq(
|
||||||
|
',',
|
||||||
|
field('argument',$.text),
|
||||||
|
))
|
||||||
|
),
|
||||||
|
|
||||||
|
// 8.13
|
||||||
|
shell_function: $ => seq(
|
||||||
|
choice('$','$$'),
|
||||||
|
token.immediate('('),
|
||||||
|
field('function', 'shell'),
|
||||||
|
optional(WS),
|
||||||
|
$._shell_command,
|
||||||
|
')'
|
||||||
|
),
|
||||||
|
// }}}
|
||||||
|
// Primary and lists {{{
|
||||||
|
list: $ => prec(1,seq(
|
||||||
|
$._primary,
|
||||||
|
repeat(seq(
|
||||||
|
choice(WS, SPLIT),
|
||||||
|
$._primary
|
||||||
|
)),
|
||||||
|
optional(WS)
|
||||||
|
)),
|
||||||
|
|
||||||
|
paths: $ => seq(
|
||||||
|
$._primary,
|
||||||
|
repeat(seq(
|
||||||
|
choice(...[':',';'].map(c=>token.immediate(c))),
|
||||||
|
$._primary
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
|
||||||
|
_primary: $ => choice(
|
||||||
|
$.word,
|
||||||
|
$.archive,
|
||||||
|
$._variable,
|
||||||
|
$._function,
|
||||||
|
$.concatenation,
|
||||||
|
$.string,
|
||||||
|
),
|
||||||
|
|
||||||
|
concatenation: $ => prec.right(seq(
|
||||||
|
$._primary,
|
||||||
|
repeat1(prec.left($._primary))
|
||||||
|
)),
|
||||||
|
// }}}
|
||||||
|
// Names {{{
|
||||||
|
_name: $ => field('name',$.word),
|
||||||
|
|
||||||
|
string: $ => field('string',choice(
|
||||||
|
seq('"', optional($._string), '"'),
|
||||||
|
seq("'", optional($._string), "'"),
|
||||||
|
)),
|
||||||
|
|
||||||
|
_string: $ => repeat1(choice(
|
||||||
|
$._variable,
|
||||||
|
$._function,
|
||||||
|
token(prec(-1,/([^'"$\r\n\\]|\\\\|\\[^\r\n])+/)),
|
||||||
|
)),
|
||||||
|
|
||||||
|
word: $ => token(repeat1(choice(
|
||||||
|
new RegExp ('['+CHARSET+']'),
|
||||||
|
new RegExp ('\\\\['+ESCAPE_SET+']'),
|
||||||
|
new RegExp ('\\\\[0-9]{3}'),
|
||||||
|
))),
|
||||||
|
|
||||||
|
// 11.1
|
||||||
|
archive: $ => seq(
|
||||||
|
field('archive', $.word),
|
||||||
|
token.immediate('('),
|
||||||
|
field('members', $.list),
|
||||||
|
token.immediate(')'),
|
||||||
|
),
|
||||||
|
// }}}
|
||||||
|
// Tokens {{{
|
||||||
|
// TODO external parser for .RECIPEPREFIX
|
||||||
|
_recipeprefix: $ => '\t',
|
||||||
|
|
||||||
|
// TODO prefixed line in define is recipe
|
||||||
|
_rawline: $ => token(/.*[\r\n]+/), // any line
|
||||||
|
|
||||||
|
_shell_text_without_split: $ => text($,
|
||||||
|
noneOf(...['\\$', '\\r', '\\n', '\\']),
|
||||||
|
choice(
|
||||||
|
$._variable,
|
||||||
|
$._function,
|
||||||
|
alias('$$',$.escape),
|
||||||
|
alias('//',$.escape),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// The SPLIT chars shall be included the injected code
|
||||||
|
shell_text_with_split: $ => seq(
|
||||||
|
$._shell_text_without_split,
|
||||||
|
SPLIT,
|
||||||
|
),
|
||||||
|
|
||||||
|
_shell_command: $ => alias(
|
||||||
|
$.text,
|
||||||
|
$.shell_command
|
||||||
|
),
|
||||||
|
|
||||||
|
text: $ => text($,
|
||||||
|
choice(
|
||||||
|
noneOf(...['\\$', '\\(', '\\)', '\\n', '\\r', '\\']),
|
||||||
|
SPLIT
|
||||||
|
),
|
||||||
|
choice(
|
||||||
|
$._variable,
|
||||||
|
$._function,
|
||||||
|
alias('$$',$.escape),
|
||||||
|
alias('//',$.escape),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
// }}}
|
||||||
|
|
||||||
|
comment: $ => token(prec(-1,/#.*/)),
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
function noneOf(...characters) {
|
||||||
|
const negatedString = characters.map(c => c == '\\' ? '\\\\' : c).join('')
|
||||||
|
return new RegExp('[^' + negatedString + ']')
|
||||||
|
}
|
||||||
|
|
||||||
|
function delimitedVariable(rule) {
|
||||||
|
return choice(
|
||||||
|
seq(token.immediate('('), rule, ')'),
|
||||||
|
seq(token.immediate('{'), rule, '}')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function text($, text, fenced_vars) {
|
||||||
|
const raw_text = token(repeat1(choice(
|
||||||
|
text,
|
||||||
|
new RegExp ('\\\\['+ESCAPE_SET+']'),
|
||||||
|
new RegExp ('\\\\[0-9]{3}'),
|
||||||
|
new RegExp ('\\\\[^\n\r]'), // used in cmd like sed \1
|
||||||
|
)))
|
||||||
|
return choice(
|
||||||
|
seq(
|
||||||
|
raw_text,
|
||||||
|
repeat(seq(
|
||||||
|
fenced_vars,
|
||||||
|
optional(raw_text)
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
seq(
|
||||||
|
fenced_vars,
|
||||||
|
repeat(seq(
|
||||||
|
optional(raw_text),
|
||||||
|
fenced_vars
|
||||||
|
)),
|
||||||
|
optional(raw_text)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"name": "tree-sitter-make",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "make grammar for tree-sitter",
|
||||||
|
"author": "Alexandre Muller",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "bindings/node",
|
||||||
|
"homepage": "https://github.com/alemuller/tree-sitter-make#readme",
|
||||||
|
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/alemuller/tree-sitter-make/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/alemuller/tree-sitter-make#readme",
|
||||||
|
|
||||||
|
"keywords": [
|
||||||
|
"parsing",
|
||||||
|
"incremental",
|
||||||
|
"tree-sitter",
|
||||||
|
"make",
|
||||||
|
"makefile",
|
||||||
|
"GNUMAKEFILE"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"nan": "^2.12.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"tree-sitter-cli": "^0.19.4"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "tree-sitter test"
|
||||||
|
},
|
||||||
|
"tree-sitter": [
|
||||||
|
{
|
||||||
|
"scope": "source.mk",
|
||||||
|
"file-types": [
|
||||||
|
"makefile",
|
||||||
|
"Makefile",
|
||||||
|
"MAKEFILE",
|
||||||
|
"GNUmakefile",
|
||||||
|
"mk",
|
||||||
|
"mak",
|
||||||
|
"dsp"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,171 @@
|
|||||||
|
[
|
||||||
|
"("
|
||||||
|
")"
|
||||||
|
"{"
|
||||||
|
"}"
|
||||||
|
] @punctuation.bracket
|
||||||
|
|
||||||
|
[
|
||||||
|
":"
|
||||||
|
"&:"
|
||||||
|
"::"
|
||||||
|
"|"
|
||||||
|
";"
|
||||||
|
"\""
|
||||||
|
"'"
|
||||||
|
","
|
||||||
|
] @punctuation.delimiter
|
||||||
|
|
||||||
|
[
|
||||||
|
"$"
|
||||||
|
"$$"
|
||||||
|
] @punctuation.special
|
||||||
|
|
||||||
|
(automatic_variable
|
||||||
|
[ "@" "%" "<" "?" "^" "+" "/" "*" "D" "F"] @punctuation.special)
|
||||||
|
|
||||||
|
(automatic_variable
|
||||||
|
"/" @error . ["D" "F"])
|
||||||
|
|
||||||
|
[
|
||||||
|
"="
|
||||||
|
":="
|
||||||
|
"::="
|
||||||
|
"?="
|
||||||
|
"+="
|
||||||
|
"!="
|
||||||
|
"@"
|
||||||
|
"-"
|
||||||
|
"+"
|
||||||
|
] @operator
|
||||||
|
|
||||||
|
[
|
||||||
|
(text)
|
||||||
|
(string)
|
||||||
|
(raw_text)
|
||||||
|
] @string
|
||||||
|
|
||||||
|
(variable_assignment (word) @string)
|
||||||
|
|
||||||
|
[
|
||||||
|
"ifeq"
|
||||||
|
"ifneq"
|
||||||
|
"ifdef"
|
||||||
|
"ifndef"
|
||||||
|
"else"
|
||||||
|
"endif"
|
||||||
|
"if"
|
||||||
|
"or" ; boolean functions are conditional in make grammar
|
||||||
|
"and"
|
||||||
|
] @conditional
|
||||||
|
|
||||||
|
"foreach" @repeat
|
||||||
|
|
||||||
|
[
|
||||||
|
"define"
|
||||||
|
"endef"
|
||||||
|
"vpath"
|
||||||
|
"undefine"
|
||||||
|
"export"
|
||||||
|
"unexport"
|
||||||
|
"override"
|
||||||
|
"private"
|
||||||
|
; "load"
|
||||||
|
] @keyword
|
||||||
|
|
||||||
|
[
|
||||||
|
"include"
|
||||||
|
"sinclude"
|
||||||
|
"-include"
|
||||||
|
] @include
|
||||||
|
|
||||||
|
[
|
||||||
|
"subst"
|
||||||
|
"patsubst"
|
||||||
|
"strip"
|
||||||
|
"findstring"
|
||||||
|
"filter"
|
||||||
|
"filter-out"
|
||||||
|
"sort"
|
||||||
|
"word"
|
||||||
|
"words"
|
||||||
|
"wordlist"
|
||||||
|
"firstword"
|
||||||
|
"lastword"
|
||||||
|
"dir"
|
||||||
|
"notdir"
|
||||||
|
"suffix"
|
||||||
|
"basename"
|
||||||
|
"addsuffix"
|
||||||
|
"addprefix"
|
||||||
|
"join"
|
||||||
|
"wildcard"
|
||||||
|
"realpath"
|
||||||
|
"abspath"
|
||||||
|
"call"
|
||||||
|
"eval"
|
||||||
|
"file"
|
||||||
|
"value"
|
||||||
|
"shell"
|
||||||
|
] @keyword.function
|
||||||
|
|
||||||
|
[
|
||||||
|
"error"
|
||||||
|
"warning"
|
||||||
|
"info"
|
||||||
|
] @exception
|
||||||
|
|
||||||
|
;; Variable
|
||||||
|
(variable_assignment
|
||||||
|
name: (word) @constant)
|
||||||
|
|
||||||
|
(variable_reference
|
||||||
|
(word) @constant)
|
||||||
|
|
||||||
|
(comment) @comment
|
||||||
|
|
||||||
|
((word) @clean @string.regex
|
||||||
|
(#match? @clean "[%\*\?]"))
|
||||||
|
|
||||||
|
(function_call
|
||||||
|
function: "error"
|
||||||
|
(arguments (text) @text.danger))
|
||||||
|
|
||||||
|
(function_call
|
||||||
|
function: "warning"
|
||||||
|
(arguments (text) @text.warning))
|
||||||
|
|
||||||
|
(function_call
|
||||||
|
function: "info"
|
||||||
|
(arguments (text) @text.note))
|
||||||
|
|
||||||
|
;; Install Command Categories
|
||||||
|
;; Others special variables
|
||||||
|
;; Variables Used by Implicit Rules
|
||||||
|
[
|
||||||
|
"VPATH"
|
||||||
|
".RECIPEPREFIX"
|
||||||
|
] @constant.builtin
|
||||||
|
|
||||||
|
(variable_assignment
|
||||||
|
name: (word) @clean @constant.builtin
|
||||||
|
(#match? @clean "^(AR|AS|CC|CXX|CPP|FC|M2C|PC|CO|GET|LEX|YACC|LINT|MAKEINFO|TEX|TEXI2DVI|WEAVE|CWEAVE|TANGLE|CTANGLE|RM|ARFLAGS|ASFLAGS|CFLAGS|CXXFLAGS|COFLAGS|CPPFLAGS|FFLAGS|GFLAGS|LDFLAGS|LDLIBS|LFLAGS|YFLAGS|PFLAGS|RFLAGS|LINTFLAGS|PRE_INSTALL|POST_INSTALL|NORMAL_INSTALL|PRE_UNINSTALL|POST_UNINSTALL|NORMAL_UNINSTALL|MAKEFILE_LIST|MAKE_RESTARTS|MAKE_TERMOUT|MAKE_TERMERR|\.DEFAULT_GOAL|\.RECIPEPREFIX|\.EXTRA_PREREQS)$"))
|
||||||
|
|
||||||
|
(variable_reference
|
||||||
|
(word) @clean @constant.builtin
|
||||||
|
(#match? @clean "^(AR|AS|CC|CXX|CPP|FC|M2C|PC|CO|GET|LEX|YACC|LINT|MAKEINFO|TEX|TEXI2DVI|WEAVE|CWEAVE|TANGLE|CTANGLE|RM|ARFLAGS|ASFLAGS|CFLAGS|CXXFLAGS|COFLAGS|CPPFLAGS|FFLAGS|GFLAGS|LDFLAGS|LDLIBS|LFLAGS|YFLAGS|PFLAGS|RFLAGS|LINTFLAGS|PRE_INSTALL|POST_INSTALL|NORMAL_INSTALL|PRE_UNINSTALL|POST_UNINSTALL|NORMAL_UNINSTALL|MAKEFILE_LIST|MAKE_RESTARTS|MAKE_TERMOUT|MAKE_TERMERR|\.DEFAULT_GOAL|\.RECIPEPREFIX|\.EXTRA_PREREQS\.VARIABLES|\.FEATURES|\.INCLUDE_DIRS|\.LOADED)$"))
|
||||||
|
|
||||||
|
;; Standart targets
|
||||||
|
(targets
|
||||||
|
(word) @constant.macro
|
||||||
|
(#match? @constant.macro "^(all|install|install-html|install-dvi|install-pdf|install-ps|uninstall|install-strip|clean|distclean|mostlyclean|maintainer-clean|TAGS|info|dvi|html|pdf|ps|dist|check|installcheck|installdirs)$"))
|
||||||
|
|
||||||
|
(targets
|
||||||
|
(word) @constant.macro
|
||||||
|
(#match? @constant.macro "^(all|install|install-html|install-dvi|install-pdf|install-ps|uninstall|install-strip|clean|distclean|mostlyclean|maintainer-clean|TAGS|info|dvi|html|pdf|ps|dist|check|installcheck|installdirs)$"))
|
||||||
|
|
||||||
|
;; Builtin targets
|
||||||
|
(targets
|
||||||
|
(word) @constant.macro
|
||||||
|
(#match? @constant.macro "^\.(PHONY|SUFFIXES|DEFAULT|PRECIOUS|INTERMEDIATE|SECONDARY|SECONDEXPANSION|DELETE_ON_ERROR|IGNORE|LOW_RESOLUTION_TIME|SILENT|EXPORT_ALL_VARIABLES|NOTPARALLEL|ONESHELL|POSIX)$"))
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,223 @@
|
|||||||
|
#ifndef TREE_SITTER_PARSER_H_
|
||||||
|
#define TREE_SITTER_PARSER_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define ts_builtin_sym_error ((TSSymbol)-1)
|
||||||
|
#define ts_builtin_sym_end 0
|
||||||
|
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
|
||||||
|
|
||||||
|
typedef uint16_t TSStateId;
|
||||||
|
|
||||||
|
#ifndef TREE_SITTER_API_H_
|
||||||
|
typedef uint16_t TSSymbol;
|
||||||
|
typedef uint16_t TSFieldId;
|
||||||
|
typedef struct TSLanguage TSLanguage;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
TSFieldId field_id;
|
||||||
|
uint8_t child_index;
|
||||||
|
bool inherited;
|
||||||
|
} TSFieldMapEntry;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t index;
|
||||||
|
uint16_t length;
|
||||||
|
} TSFieldMapSlice;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool visible;
|
||||||
|
bool named;
|
||||||
|
bool supertype;
|
||||||
|
} TSSymbolMetadata;
|
||||||
|
|
||||||
|
typedef struct TSLexer TSLexer;
|
||||||
|
|
||||||
|
struct TSLexer {
|
||||||
|
int32_t lookahead;
|
||||||
|
TSSymbol result_symbol;
|
||||||
|
void (*advance)(TSLexer *, bool);
|
||||||
|
void (*mark_end)(TSLexer *);
|
||||||
|
uint32_t (*get_column)(TSLexer *);
|
||||||
|
bool (*is_at_included_range_start)(const TSLexer *);
|
||||||
|
bool (*eof)(const TSLexer *);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TSParseActionTypeShift,
|
||||||
|
TSParseActionTypeReduce,
|
||||||
|
TSParseActionTypeAccept,
|
||||||
|
TSParseActionTypeRecover,
|
||||||
|
} TSParseActionType;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
struct {
|
||||||
|
uint8_t type;
|
||||||
|
TSStateId state;
|
||||||
|
bool extra;
|
||||||
|
bool repetition;
|
||||||
|
} shift;
|
||||||
|
struct {
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t child_count;
|
||||||
|
TSSymbol symbol;
|
||||||
|
int16_t dynamic_precedence;
|
||||||
|
uint16_t production_id;
|
||||||
|
} reduce;
|
||||||
|
uint8_t type;
|
||||||
|
} TSParseAction;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t lex_state;
|
||||||
|
uint16_t external_lex_state;
|
||||||
|
} TSLexMode;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
TSParseAction action;
|
||||||
|
struct {
|
||||||
|
uint8_t count;
|
||||||
|
bool reusable;
|
||||||
|
} entry;
|
||||||
|
} TSParseActionEntry;
|
||||||
|
|
||||||
|
struct TSLanguage {
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t symbol_count;
|
||||||
|
uint32_t alias_count;
|
||||||
|
uint32_t token_count;
|
||||||
|
uint32_t external_token_count;
|
||||||
|
uint32_t state_count;
|
||||||
|
uint32_t large_state_count;
|
||||||
|
uint32_t production_id_count;
|
||||||
|
uint32_t field_count;
|
||||||
|
uint16_t max_alias_sequence_length;
|
||||||
|
const uint16_t *parse_table;
|
||||||
|
const uint16_t *small_parse_table;
|
||||||
|
const uint32_t *small_parse_table_map;
|
||||||
|
const TSParseActionEntry *parse_actions;
|
||||||
|
const char * const *symbol_names;
|
||||||
|
const char * const *field_names;
|
||||||
|
const TSFieldMapSlice *field_map_slices;
|
||||||
|
const TSFieldMapEntry *field_map_entries;
|
||||||
|
const TSSymbolMetadata *symbol_metadata;
|
||||||
|
const TSSymbol *public_symbol_map;
|
||||||
|
const uint16_t *alias_map;
|
||||||
|
const TSSymbol *alias_sequences;
|
||||||
|
const TSLexMode *lex_modes;
|
||||||
|
bool (*lex_fn)(TSLexer *, TSStateId);
|
||||||
|
bool (*keyword_lex_fn)(TSLexer *, TSStateId);
|
||||||
|
TSSymbol keyword_capture_token;
|
||||||
|
struct {
|
||||||
|
const bool *states;
|
||||||
|
const TSSymbol *symbol_map;
|
||||||
|
void *(*create)(void);
|
||||||
|
void (*destroy)(void *);
|
||||||
|
bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
|
||||||
|
unsigned (*serialize)(void *, char *);
|
||||||
|
void (*deserialize)(void *, const char *, unsigned);
|
||||||
|
} external_scanner;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lexer Macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define START_LEXER() \
|
||||||
|
bool result = false; \
|
||||||
|
bool skip = false; \
|
||||||
|
bool eof = false; \
|
||||||
|
int32_t lookahead; \
|
||||||
|
goto start; \
|
||||||
|
next_state: \
|
||||||
|
lexer->advance(lexer, skip); \
|
||||||
|
start: \
|
||||||
|
skip = false; \
|
||||||
|
lookahead = lexer->lookahead;
|
||||||
|
|
||||||
|
#define ADVANCE(state_value) \
|
||||||
|
{ \
|
||||||
|
state = state_value; \
|
||||||
|
goto next_state; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SKIP(state_value) \
|
||||||
|
{ \
|
||||||
|
skip = true; \
|
||||||
|
state = state_value; \
|
||||||
|
goto next_state; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ACCEPT_TOKEN(symbol_value) \
|
||||||
|
result = true; \
|
||||||
|
lexer->result_symbol = symbol_value; \
|
||||||
|
lexer->mark_end(lexer);
|
||||||
|
|
||||||
|
#define END_STATE() return result;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse Table Macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SMALL_STATE(id) id - LARGE_STATE_COUNT
|
||||||
|
|
||||||
|
#define STATE(id) id
|
||||||
|
|
||||||
|
#define ACTIONS(id) id
|
||||||
|
|
||||||
|
#define SHIFT(state_value) \
|
||||||
|
{{ \
|
||||||
|
.shift = { \
|
||||||
|
.type = TSParseActionTypeShift, \
|
||||||
|
.state = state_value \
|
||||||
|
} \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define SHIFT_REPEAT(state_value) \
|
||||||
|
{{ \
|
||||||
|
.shift = { \
|
||||||
|
.type = TSParseActionTypeShift, \
|
||||||
|
.state = state_value, \
|
||||||
|
.repetition = true \
|
||||||
|
} \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define SHIFT_EXTRA() \
|
||||||
|
{{ \
|
||||||
|
.shift = { \
|
||||||
|
.type = TSParseActionTypeShift, \
|
||||||
|
.extra = true \
|
||||||
|
} \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define REDUCE(symbol_val, child_count_val, ...) \
|
||||||
|
{{ \
|
||||||
|
.reduce = { \
|
||||||
|
.type = TSParseActionTypeReduce, \
|
||||||
|
.symbol = symbol_val, \
|
||||||
|
.child_count = child_count_val, \
|
||||||
|
__VA_ARGS__ \
|
||||||
|
}, \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define RECOVER() \
|
||||||
|
{{ \
|
||||||
|
.type = TSParseActionTypeRecover \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define ACCEPT_INPUT() \
|
||||||
|
{{ \
|
||||||
|
.type = TSParseActionTypeAccept \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // TREE_SITTER_PARSER_H_
|
||||||
@ -0,0 +1,330 @@
|
|||||||
|
=======================================
|
||||||
|
Conditionals, ifeq, ifneq, ifdef, ifdef
|
||||||
|
=======================================
|
||||||
|
ifeq ("string $(sort 1 2 3)", 'string ${VAR}')
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq (arg0, arg1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef var
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifndef var
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (string
|
||||||
|
string: (function_call
|
||||||
|
(arguments
|
||||||
|
argument: (text))))
|
||||||
|
arg1: (string
|
||||||
|
string: (variable_reference
|
||||||
|
(word)))))
|
||||||
|
(conditional
|
||||||
|
condition: (ifneq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word)))
|
||||||
|
(conditional
|
||||||
|
condition: (ifdef_directive
|
||||||
|
variable: (word)))
|
||||||
|
(conditional
|
||||||
|
condition: (ifndef_directive
|
||||||
|
variable: (word))))
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Conditionals, parenthesis, parenthesis
|
||||||
|
======================================
|
||||||
|
ifeq (arg0, arg1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))))
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Conditionals, single quote, single quote
|
||||||
|
========================================
|
||||||
|
ifeq 'arg0' 'arg1'
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (string)
|
||||||
|
arg1: (string))))
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Conditionals, double quote, double quote
|
||||||
|
========================================
|
||||||
|
ifeq "arg0" "arg1"
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (string)
|
||||||
|
arg1: (string))))
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Conditionals, double quote, single quote
|
||||||
|
========================================
|
||||||
|
ifeq "arg0" 'arg1'
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (string)
|
||||||
|
arg1: (string))))
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Conditionals, single quote, double quote
|
||||||
|
========================================
|
||||||
|
ifeq 'arg0' "arg1"
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (string)
|
||||||
|
arg1: (string))))
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Conditionals, else
|
||||||
|
======================================
|
||||||
|
ifeq (arg0, arg1)
|
||||||
|
else
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
(else_directive)))
|
||||||
|
|
||||||
|
=============================
|
||||||
|
Conditionals, else if, single
|
||||||
|
=============================
|
||||||
|
ifeq (arg0, arg1)
|
||||||
|
else ifeq (arg0, arg1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
(elsif_directive
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word)))))
|
||||||
|
|
||||||
|
===================================
|
||||||
|
Conditionals, else if, single, else
|
||||||
|
===================================
|
||||||
|
ifeq (arg0, arg1)
|
||||||
|
else ifeq (arg0, arg1)
|
||||||
|
else
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
(elsif_directive
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word)))
|
||||||
|
(else_directive)))
|
||||||
|
|
||||||
|
===============================
|
||||||
|
Conditionals, else if, multiple
|
||||||
|
===============================
|
||||||
|
ifeq (arg0, arg1)
|
||||||
|
else ifeq (arg0, arg1)
|
||||||
|
else ifneq (arg0, arg1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
(elsif_directive
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word)))
|
||||||
|
(elsif_directive
|
||||||
|
condition: (ifneq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word)))))
|
||||||
|
|
||||||
|
===============================
|
||||||
|
Conditionals, else if, multiple, else
|
||||||
|
===============================
|
||||||
|
ifeq (arg0, arg1)
|
||||||
|
else ifeq (arg0, arg1)
|
||||||
|
else ifneq (arg0, arg1)
|
||||||
|
else
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
(elsif_directive
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word)))
|
||||||
|
(elsif_directive
|
||||||
|
condition: (ifneq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word)))
|
||||||
|
(else_directive)))
|
||||||
|
|
||||||
|
================================
|
||||||
|
Conditionals, consequence, rules
|
||||||
|
================================
|
||||||
|
ifneq (,)
|
||||||
|
all:
|
||||||
|
echo a
|
||||||
|
else
|
||||||
|
all:
|
||||||
|
echo b
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifneq_directive)
|
||||||
|
consequence: (rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))))
|
||||||
|
(else_directive
|
||||||
|
consequence: (rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))))
|
||||||
|
|
||||||
|
===============================
|
||||||
|
Conditionals, in recipe
|
||||||
|
===============================
|
||||||
|
foo:
|
||||||
|
ifeq (x,y)
|
||||||
|
echo a
|
||||||
|
else
|
||||||
|
echo b
|
||||||
|
endif
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
consequence: (recipe_line
|
||||||
|
(shell_text))
|
||||||
|
(else_directive
|
||||||
|
consequence: (recipe_line
|
||||||
|
(shell_text)))))))
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
Conditionals, rules, recipe, prec.right
|
||||||
|
=======================================
|
||||||
|
ifeq (a,b)
|
||||||
|
all:
|
||||||
|
echo foo
|
||||||
|
|
||||||
|
echo foo
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
consequence: (rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))))))
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
Conditionals, in recipe, in consequence
|
||||||
|
=======================================
|
||||||
|
ifneq (a,b)
|
||||||
|
all:
|
||||||
|
ifeq (a,b)
|
||||||
|
echo foo
|
||||||
|
else
|
||||||
|
echo bar
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(conditional
|
||||||
|
condition: (ifneq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
consequence: (rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(conditional
|
||||||
|
condition: (ifeq_directive
|
||||||
|
arg0: (word)
|
||||||
|
arg1: (word))
|
||||||
|
consequence: (recipe_line
|
||||||
|
(shell_text))
|
||||||
|
(else_directive
|
||||||
|
consequence: (recipe_line
|
||||||
|
(shell_text))))))))
|
||||||
|
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
=========================================
|
||||||
|
Define directive (whitespace after name)
|
||||||
|
=========================================
|
||||||
|
define two-lines
|
||||||
|
echo foo
|
||||||
|
echo bar
|
||||||
|
endef
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(define_directive
|
||||||
|
name: (word)
|
||||||
|
value: (raw_text)))
|
||||||
|
|
||||||
|
============================================
|
||||||
|
Define directive (whitespace after operator)
|
||||||
|
============================================
|
||||||
|
define two-lines =
|
||||||
|
echo foo
|
||||||
|
echo bar
|
||||||
|
endef
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(define_directive
|
||||||
|
name: (word)
|
||||||
|
value: (raw_text)))
|
||||||
|
|
||||||
@ -0,0 +1,175 @@
|
|||||||
|
==================
|
||||||
|
Directive, include
|
||||||
|
==================
|
||||||
|
include foo *.mk
|
||||||
|
-include foo *.mk
|
||||||
|
sinclude foo *.mk
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(include_directive
|
||||||
|
filenames: (list (word) (word)))
|
||||||
|
(include_directive
|
||||||
|
filenames: (list (word) (word)))
|
||||||
|
(include_directive
|
||||||
|
filenames: (list (word) (word))))
|
||||||
|
|
||||||
|
================
|
||||||
|
Directive, vpath
|
||||||
|
================
|
||||||
|
vpath
|
||||||
|
vpath %.p
|
||||||
|
vpath %.p ../foo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(vpath_directive)
|
||||||
|
(vpath_directive
|
||||||
|
pattern: (word))
|
||||||
|
(vpath_directive
|
||||||
|
pattern: (word)
|
||||||
|
directories: (paths (word))))
|
||||||
|
|
||||||
|
================================
|
||||||
|
Directive, vpath, list delimiter
|
||||||
|
================================
|
||||||
|
vpath % foo:bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(vpath_directive
|
||||||
|
pattern: (word)
|
||||||
|
directories: (paths (word) (word))))
|
||||||
|
|
||||||
|
======================
|
||||||
|
Directive, export, all
|
||||||
|
======================
|
||||||
|
export
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(export_directive))
|
||||||
|
|
||||||
|
================================
|
||||||
|
Directive, export, variable name
|
||||||
|
================================
|
||||||
|
export foo bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(export_directive
|
||||||
|
variables: (list (word) (word))))
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Directive, export, variable assignment
|
||||||
|
======================================
|
||||||
|
export foo = bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(export_directive
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text))))
|
||||||
|
|
||||||
|
========================
|
||||||
|
Directive, unexport, all
|
||||||
|
========================
|
||||||
|
unexport
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(unexport_directive))
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Directive, unexport, variable name
|
||||||
|
==================================
|
||||||
|
unexport foo bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(unexport_directive
|
||||||
|
variables: (list (word) (word))))
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Directive, override, variable assignment
|
||||||
|
========================================
|
||||||
|
override v = foo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(override_directive
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text))))
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Directive, override, variable definition
|
||||||
|
========================================
|
||||||
|
override define foo =
|
||||||
|
endef
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(override_directive
|
||||||
|
(define_directive
|
||||||
|
name: (word))))
|
||||||
|
|
||||||
|
=============================
|
||||||
|
Directive, override, undefine
|
||||||
|
=============================
|
||||||
|
override undefine foo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(override_directive
|
||||||
|
(undefine_directive
|
||||||
|
variable: (word))))
|
||||||
|
|
||||||
|
===================
|
||||||
|
Directive, undefine
|
||||||
|
===================
|
||||||
|
undefine foo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(undefine_directive
|
||||||
|
variable: (word)))
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
Directive, private, variable assignment
|
||||||
|
=======================================
|
||||||
|
private foo = bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(private_directive
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text))))
|
||||||
|
|
||||||
|
================================================================
|
||||||
|
Directive, private, variable assignment, target/pattern-specific
|
||||||
|
================================================================
|
||||||
|
%.o : CFLAGS = -O
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
target_or_pattern: (list (word))
|
||||||
|
name: (word)
|
||||||
|
value: (text)))
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
|
||||||
|
|
||||||
@ -0,0 +1,770 @@
|
|||||||
|
================================================================================
|
||||||
|
Rule, targets, single
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
%.o:
|
||||||
|
*.o:
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word)))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word)))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, targets, multiple
|
||||||
|
================================================================================
|
||||||
|
target %.o *.o:
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, targets, archive
|
||||||
|
================================================================================
|
||||||
|
foo(bar):
|
||||||
|
foo(bar baz):
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(archive
|
||||||
|
archive: (word)
|
||||||
|
members: (list
|
||||||
|
(word)))))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(archive
|
||||||
|
archive: (word)
|
||||||
|
members: (list
|
||||||
|
(word)
|
||||||
|
(word))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, grouped targets
|
||||||
|
================================================================================
|
||||||
|
foo %.n *.o &:
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, pre-requisites, normal, single
|
||||||
|
================================================================================
|
||||||
|
target: foo
|
||||||
|
target: %.c
|
||||||
|
target: *.d
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word)))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word)))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, pre-requisites, normal, multiple
|
||||||
|
================================================================================
|
||||||
|
target: foo %.b c.o
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, pre-requisites, normal, archive
|
||||||
|
================================================================================
|
||||||
|
target: foo(foo) bar(foo bar)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(archive
|
||||||
|
archive: (word)
|
||||||
|
members: (list
|
||||||
|
(word)))
|
||||||
|
(archive
|
||||||
|
archive: (word)
|
||||||
|
members: (list
|
||||||
|
(word)
|
||||||
|
(word))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, pre-requisites, normal, multiple, splited lines, one per line
|
||||||
|
================================================================================
|
||||||
|
target: foo\
|
||||||
|
%.b\
|
||||||
|
c.o
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, pre-requisites, normal, multiple, splited lines, multiple per line
|
||||||
|
================================================================================
|
||||||
|
target: foo %.b c.o\
|
||||||
|
foo %.b c.o\
|
||||||
|
foo %.b c.o
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, pre-requisites, order only, single
|
||||||
|
================================================================================
|
||||||
|
foo: | bar
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
order_only: (prerequisites
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, pre-requisites, order only, multiple, splited line, multiple per line
|
||||||
|
================================================================================
|
||||||
|
target: | foo %.b c.o\
|
||||||
|
foo %.b c.o\
|
||||||
|
foo %.b c.o
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
order_only: (prerequisites
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, pre-requisites, normal and order-only
|
||||||
|
================================================================================
|
||||||
|
target: foo \
|
||||||
|
bar | baz \
|
||||||
|
foobar
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word)
|
||||||
|
(word))
|
||||||
|
order_only: (prerequisites
|
||||||
|
(word)
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, empty rule
|
||||||
|
================================================================================
|
||||||
|
target: ;
|
||||||
|
|
||||||
|
target:
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe)))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
echo "foobar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, custom .RECIPEPREFIX I (TODO)
|
||||||
|
================================================================================
|
||||||
|
.RECIPEPREFIX = >
|
||||||
|
|
||||||
|
target:
|
||||||
|
>echo "foobar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, custom .RECIPEPREFIX II (TODO)
|
||||||
|
================================================================================
|
||||||
|
.RECIPEPREFIX = a
|
||||||
|
|
||||||
|
target:
|
||||||
|
aecho "foobar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, custom .RECIPEPREFIX III (TODO)
|
||||||
|
================================================================================
|
||||||
|
.RECIPEPREFIX = >
|
||||||
|
|
||||||
|
target: ;
|
||||||
|
>echo "foobar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, suppress echoing
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
@echo "foobar"
|
||||||
|
|
||||||
|
target: ; @echo "foobar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, NOT comment
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
# foo
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, splitted
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
echo "foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
target:
|
||||||
|
echo "foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text))))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, splited, supress echoing
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
@echo "foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
target:
|
||||||
|
@echo "foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text))))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, splited, escape
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
@echo "\\foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, single line, splited, backslash (sed)
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
sed -e 's/\([^-]*-g\)/r\1/'
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets (word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, multiple lines
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
foo
|
||||||
|
bar
|
||||||
|
baz
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, multiple lines, comments
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
|
||||||
|
foo
|
||||||
|
# comment
|
||||||
|
baz
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))
|
||||||
|
(comment)
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, multiple lines, whitespace after ":"
|
||||||
|
================================================================================
|
||||||
|
all:
|
||||||
|
@echo foo\
|
||||||
|
bar
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, attached to targets-and-prerequisites, single line
|
||||||
|
================================================================================
|
||||||
|
target: ; echo "foobar"
|
||||||
|
|
||||||
|
target: ;
|
||||||
|
echo "foobar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, attached to targets-and-prerequisites, single line, splited
|
||||||
|
================================================================================
|
||||||
|
target: ; echo "foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
target: ; echo "foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text))))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, attached to targets-and-prerequisites, multiple lines
|
||||||
|
================================================================================
|
||||||
|
target: ; @echo "foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
target: ; @echo "foo\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text))))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, blank lines
|
||||||
|
================================================================================
|
||||||
|
target:
|
||||||
|
|
||||||
|
echo "foo\
|
||||||
|
bar\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
|
||||||
|
echo "foobar"
|
||||||
|
|
||||||
|
target: ;
|
||||||
|
|
||||||
|
@echo "foo\
|
||||||
|
bar\
|
||||||
|
bar"
|
||||||
|
|
||||||
|
echo "foobar"
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text)
|
||||||
|
(shell_text))
|
||||||
|
(recipe_line
|
||||||
|
(shell_text))))
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)
|
||||||
|
(shell_text)
|
||||||
|
(shell_text))
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, automatic variable I
|
||||||
|
================================================================================
|
||||||
|
%.o: %.c
|
||||||
|
gcc -c -o $@ $<
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text
|
||||||
|
(automatic_variable)
|
||||||
|
(automatic_variable))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, automatic variable II
|
||||||
|
================================================================================
|
||||||
|
%.o: %.c
|
||||||
|
gcc -c -o $(@) ${<}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text
|
||||||
|
(automatic_variable)
|
||||||
|
(automatic_variable))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, automatic variable, file and directory names variants
|
||||||
|
================================================================================
|
||||||
|
foo : bar/lose
|
||||||
|
cd $(@D)
|
||||||
|
gobble ${@F} > ../$@
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text
|
||||||
|
(automatic_variable)))
|
||||||
|
(recipe_line
|
||||||
|
(shell_text
|
||||||
|
(automatic_variable)
|
||||||
|
(automatic_variable))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, automatic variable, secondary expansion I
|
||||||
|
================================================================================
|
||||||
|
foo: foo.1 bar.1 $$< $$^ $$+
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word)
|
||||||
|
(word)
|
||||||
|
(automatic_variable)
|
||||||
|
(automatic_variable)
|
||||||
|
(automatic_variable))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, recipe, automatic variable, secondary expansion II
|
||||||
|
================================================================================
|
||||||
|
%oo: $$< $$^ $$+ $$*
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(automatic_variable)
|
||||||
|
(automatic_variable)
|
||||||
|
(automatic_variable)
|
||||||
|
(automatic_variable))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, complete
|
||||||
|
================================================================================
|
||||||
|
target: prereq | prereq2
|
||||||
|
recipe
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
normal: (prerequisites
|
||||||
|
(word))
|
||||||
|
order_only: (prerequisites
|
||||||
|
(word))
|
||||||
|
(recipe
|
||||||
|
(recipe_line
|
||||||
|
(shell_text)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, static pattern
|
||||||
|
================================================================================
|
||||||
|
foo.o bar.o: %.o: %.c
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word)
|
||||||
|
(word))
|
||||||
|
target: (pattern_list
|
||||||
|
(word))
|
||||||
|
prerequisite: (pattern_list
|
||||||
|
(word))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Rule, static pattern, whitespace
|
||||||
|
================================================================================
|
||||||
|
foo : bar : baz
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(rule
|
||||||
|
(targets
|
||||||
|
(word))
|
||||||
|
target: (pattern_list
|
||||||
|
(word))
|
||||||
|
prerequisite: (pattern_list
|
||||||
|
(word))))
|
||||||
@ -0,0 +1,145 @@
|
|||||||
|
======================================
|
||||||
|
Shell function (AKA command expansion)
|
||||||
|
======================================
|
||||||
|
v = $(shell echo *.ls)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(shell_function
|
||||||
|
(shell_command)))))
|
||||||
|
|
||||||
|
==========================
|
||||||
|
Shell function, line split
|
||||||
|
==========================
|
||||||
|
v = $(shell echo foo\
|
||||||
|
bar\
|
||||||
|
baz)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(shell_function
|
||||||
|
(shell_command)))))
|
||||||
|
|
||||||
|
=================================================
|
||||||
|
Shell function, line split, condensate whitespace
|
||||||
|
=================================================
|
||||||
|
v = $(shell echo foo$\
|
||||||
|
bar)
|
||||||
|
|
||||||
|
v = $(shell echo foo$ bar)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(shell_function
|
||||||
|
(shell_command
|
||||||
|
(variable_reference
|
||||||
|
(word))))))
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(shell_function
|
||||||
|
(shell_command
|
||||||
|
(variable_reference
|
||||||
|
(word)))))))
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Shell function, escaped delimiter '\)'
|
||||||
|
======================================
|
||||||
|
v = $(shell echo "\(foo\)")
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(shell_function
|
||||||
|
(shell_command)))))
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Shell function, escaped dolar signal
|
||||||
|
======================================
|
||||||
|
v = $(shell echo $$PWD)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(shell_function
|
||||||
|
(shell_command
|
||||||
|
(escape))))))
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Shell function, variable reference
|
||||||
|
==================================
|
||||||
|
v = $(shell echo $(foo) ${bar})
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(shell_function
|
||||||
|
(shell_command
|
||||||
|
(variable_reference (word))
|
||||||
|
(variable_reference (word)))))))
|
||||||
|
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Shell assignment (AKA command expansion)
|
||||||
|
======================================
|
||||||
|
v != echo *.ls
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(shell_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (shell_command)))
|
||||||
|
|
||||||
|
============================
|
||||||
|
Shell assignment, line split
|
||||||
|
============================
|
||||||
|
v != echo foo\
|
||||||
|
bar\
|
||||||
|
baz
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(shell_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (shell_command)))
|
||||||
|
|
||||||
|
===================================================
|
||||||
|
Shell assignment, line split, condensate whitespace
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Shell assignment, escaped delimiter '\)'
|
||||||
|
========================================
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Shell assignment, escaped dolar signal
|
||||||
|
======================================
|
||||||
|
|
||||||
|
====================================
|
||||||
|
Shell assignment, variable reference
|
||||||
|
====================================
|
||||||
|
|
||||||
@ -0,0 +1,314 @@
|
|||||||
|
=======================================
|
||||||
|
Variable, recursively expanded, setting
|
||||||
|
=======================================
|
||||||
|
v = foo.o bar.o
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text)))
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Variable, simply expanded, setting
|
||||||
|
==================================
|
||||||
|
v := foo.o bar.o
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text)))
|
||||||
|
|
||||||
|
=========================================
|
||||||
|
Variable, simply expanded, POSIX, setting
|
||||||
|
=========================================
|
||||||
|
v ::= foo.o bar.o
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text)))
|
||||||
|
|
||||||
|
=======================
|
||||||
|
Variable, splitted line
|
||||||
|
=======================
|
||||||
|
var := foo\
|
||||||
|
bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text)))
|
||||||
|
|
||||||
|
=======================
|
||||||
|
Variable, special chars
|
||||||
|
=======================
|
||||||
|
var := 'hello\
|
||||||
|
world'
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text)))
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Variable, define directive
|
||||||
|
==================================
|
||||||
|
define two-lines
|
||||||
|
echo foo
|
||||||
|
echo bar
|
||||||
|
endef
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(define_directive
|
||||||
|
name: (word)
|
||||||
|
value: (raw_text)))
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Variable, define directive, operator
|
||||||
|
==================================
|
||||||
|
define two-lines :=
|
||||||
|
echo foo
|
||||||
|
echo bar
|
||||||
|
endef
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(define_directive
|
||||||
|
name: (word)
|
||||||
|
value: (raw_text)))
|
||||||
|
|
||||||
|
=====================================
|
||||||
|
Variable, define directive, make code
|
||||||
|
=====================================
|
||||||
|
define rule =
|
||||||
|
foo: bar
|
||||||
|
baz
|
||||||
|
endef
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(define_directive
|
||||||
|
name: (word)
|
||||||
|
value: (raw_text)))
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
Variable, define directive, whitespace
|
||||||
|
======================================
|
||||||
|
define foo =
|
||||||
|
bar
|
||||||
|
endef
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(define_directive
|
||||||
|
name: (word)
|
||||||
|
value: (raw_text)))
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
Variable, define directive, NOT comments
|
||||||
|
======================================
|
||||||
|
define foo =
|
||||||
|
#comment
|
||||||
|
endef
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(define_directive
|
||||||
|
name: (word)
|
||||||
|
value: (raw_text)))
|
||||||
|
|
||||||
|
================================
|
||||||
|
Variable, VPATH, Linux delimiter
|
||||||
|
================================
|
||||||
|
VPATH = foo:../bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(VPATH_assignment
|
||||||
|
value: (paths (word) (word))))
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Variable, VPATH, Windows delimiter
|
||||||
|
==================================
|
||||||
|
VPATH = foo;../bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(VPATH_assignment
|
||||||
|
value: (paths (word) (word))))
|
||||||
|
|
||||||
|
=================================
|
||||||
|
Variable, target/pattern-specific
|
||||||
|
=================================
|
||||||
|
%.o : v = foo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
target_or_pattern: (list (word))
|
||||||
|
name: (word)
|
||||||
|
value: (text)))
|
||||||
|
|
||||||
|
=====================
|
||||||
|
Variable, empty value
|
||||||
|
=====================
|
||||||
|
v =
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)))
|
||||||
|
|
||||||
|
=====================
|
||||||
|
Variable, reference
|
||||||
|
=====================
|
||||||
|
v = $(v) ${v}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(variable_reference (word))
|
||||||
|
(variable_reference (word)))))
|
||||||
|
|
||||||
|
==============================
|
||||||
|
Variable, reference, nested
|
||||||
|
==============================
|
||||||
|
v = $($(v)) $(${v}) ${${v}} ${$(v)}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(variable_reference
|
||||||
|
(variable_reference (word)))
|
||||||
|
(variable_reference
|
||||||
|
(variable_reference (word)))
|
||||||
|
(variable_reference
|
||||||
|
(variable_reference (word)))
|
||||||
|
(variable_reference
|
||||||
|
(variable_reference (word))))))
|
||||||
|
|
||||||
|
===============================================
|
||||||
|
Variable, substitution reference I
|
||||||
|
===============================================
|
||||||
|
v := $(foo:.o=.c)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(substitution_reference
|
||||||
|
text: (word)
|
||||||
|
pattern: (word)
|
||||||
|
replacement: (word)))))
|
||||||
|
|
||||||
|
===============================================
|
||||||
|
Variable, substitution reference II
|
||||||
|
===============================================
|
||||||
|
v := $(foo:%.o=%.c)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text
|
||||||
|
(substitution_reference
|
||||||
|
text: (word)
|
||||||
|
pattern: (word)
|
||||||
|
replacement: (word)))))
|
||||||
|
|
||||||
|
===============================================
|
||||||
|
Variable, VPATH, concatenation, var reference and text
|
||||||
|
===============================================
|
||||||
|
VPATH = foo/$(bar)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(VPATH_assignment
|
||||||
|
value: (paths
|
||||||
|
(concatenation
|
||||||
|
(word)
|
||||||
|
(variable_reference (word))))))
|
||||||
|
|
||||||
|
========================================================
|
||||||
|
Variable, concatenation, var reference and var reference
|
||||||
|
========================================================
|
||||||
|
VPATH = $(foo)$(bar)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(VPATH_assignment
|
||||||
|
value: (paths
|
||||||
|
(concatenation
|
||||||
|
(variable_reference (word))
|
||||||
|
(variable_reference (word))))))
|
||||||
|
|
||||||
|
==========================================
|
||||||
|
Variable, computed variable, concatenation
|
||||||
|
==========================================
|
||||||
|
VPATH := $($(foo)_$(bar))
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(VPATH_assignment
|
||||||
|
value: (paths
|
||||||
|
(variable_reference
|
||||||
|
(concatenation
|
||||||
|
(variable_reference (word))
|
||||||
|
(word)
|
||||||
|
(variable_reference (word)))))))
|
||||||
|
|
||||||
|
==============================================
|
||||||
|
Variable, shell command (not shell assignment)
|
||||||
|
==============================================
|
||||||
|
v = echo "foo" > bar
|
||||||
|
v = echo "foo" !> bar
|
||||||
|
v = echo "foo" 1> bar
|
||||||
|
v = echo "foo" &> bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(makefile
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text))
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text))
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text))
|
||||||
|
(variable_assignment
|
||||||
|
name: (word)
|
||||||
|
value: (text)))
|
||||||
Loading…
Reference in New Issue