/* Language: Makefile Author: Ivan Sagalaev <maniac@softwaremaniacs.org> Contributors: Joël Porquet <joel@porquet.org> Website: https://www.gnu.org/software/make/manual/html_node/Introduction.html Category: common */ function makefile(hljs) { /* Variables: simple (eg $(var)) and special (eg $@) */ const VARIABLE = { className: 'variable', variants: [ { begin: '\\$\\(' + hljs.UNDERSCORE_IDENT_RE + '\\)', contains: [ hljs.BACKSLASH_ESCAPE ] }, { begin: /\$[@%<?\^\+\*]/ } ] }; /* Quoted string with variables inside */ const QUOTE_STRING = { className: 'string', begin: /"/, end: /"/, contains: [ hljs.BACKSLASH_ESCAPE, VARIABLE ] }; /* Function: $(func arg,...) */ const FUNC = { className: 'variable', begin: /\$\([\w-]+\s/, end: /\)/, keywords: { built_in: 'subst patsubst strip findstring filter filter-out sort ' + 'word wordlist firstword lastword dir notdir suffix basename ' + 'addsuffix addprefix join wildcard realpath abspath error warning ' + 'shell origin flavor foreach if or and call eval file value' }, contains: [ VARIABLE ] }; /* Variable assignment */ const ASSIGNMENT = { begin: '^' + hljs.UNDERSCORE_IDENT_RE + '\\s*(?=[:+?]?=)' }; /* Meta targets (.PHONY) */ const META = { className: 'meta', begin: /^\.PHONY:/, end: /$/, keywords: { $pattern: /[\.\w]+/, 'meta-keyword': '.PHONY' } }; /* Targets */ const TARGET = { className: 'section', begin: /^[^\s]+:/, end: /$/, contains: [ VARIABLE ] }; return { name: 'Makefile', aliases: [ 'mk', 'mak', 'make', ], keywords: { $pattern: /[\w-]+/, keyword: 'define endef undefine ifdef ifndef ifeq ifneq else endif ' + 'include -include sinclude override export unexport private vpath' }, contains: [ hljs.HASH_COMMENT_MODE, VARIABLE, QUOTE_STRING, FUNC, ASSIGNMENT, META, TARGET ] }; } module.exports = makefile;