File indexing completed on 2024-05-19 04:03:43

0001 <?xml version="1.0" encoding="UTF-8"?>
0002 <!DOCTYPE language
0003 [
0004     <!ENTITY varname "(([+!?](?!=))?[^:#=\s+!?]*)++">
0005 ]>
0006 <!-- Makefile syntaxfile v0.9 by Per Wigren <wigren@home.se> -->
0007 <!-- Modified by Joseph Wenninger <jowenn@kde.org> -->
0008 <!-- Modified by Rui Santana <santana.rui@gmail.com> -->
0009 <!-- v2.0 by Andreas Nordal <andreas.nordal@gmail.com> -->
0010 <!-- small priority to allow for example Makefile.cpp to be detected as cpp file -->
0011 <!-- v2.1 by Alex Turbov <i.zaufi@gmail.com>
0012      improve comments handling -->
0013 <!-- v4 by Alex Richardson <arichardson.kde@gmail.com>
0014      added bmake support -->
0015 <!-- v10 by Peter J. Mello <admin@petermello.net>
0016      Add recognition of POSIX 2013 '::=' operator for variable assignment -->
0017 <language name="Makefile" section="Other"
0018           version="17" kateversion="5.79"
0019           extensions="GNUmakefile;Makefile;makefile;GNUmakefile.*;Makefile.*;makefile.*;*.mk"
0020           mimetype="text/x-makefile" priority="11"
0021           author="Per Wigren (wigren@home.se)" license="">
0022 
0023   <!-- https://www.gnu.org/software/make/manual/make.pdf -->
0024   <!-- https://www.gnu.org/software/make/manual/html_node/Quick-Reference.html -->
0025 
0026   <highlighting>
0027     <list name="keywords">
0028       <item>include</item>
0029       <item>-include</item>
0030       <item>sinclude</item>
0031       <item>override</item>
0032       <item>define</item>
0033       <item>undefine</item>
0034       <item>endef</item>
0035       <item>export</item>
0036       <item>unexport</item>
0037       <item>private</item>
0038       <item>vpath</item>
0039     </list>
0040     <list name="special_keywords">
0041       <item>export</item>
0042       <item>unexport</item>
0043       <item>override</item>
0044       <item>private</item>
0045     </list>
0046     <!-- https://www.gnu.org/software/make/manual/html_node/Conditional-Syntax.html -->
0047     <list name="gmake_if_keywords">
0048       <item>ifeq</item>
0049       <item>ifneq</item>
0050       <item>ifdef</item>
0051       <item>ifndef</item>
0052     </list>
0053     <list name="gmake_else_keywords"><item>else</item></list>
0054     <list name="gmake_endif_keywords"><item>endif</item></list>
0055     <!-- bmake statements: https://www.freebsd.org/cgi/man.cgi?make(1)#INCLUDE_STATEMENTS,_CONDITIONALS_AND_FOR_LOOPS -->
0056     <list name="bmake_if_keywords">
0057       <item>.if</item>
0058       <item>.ifdef</item>
0059       <item>.ifndef</item>
0060       <item>.ifmake</item>
0061       <item>.ifnmake</item>
0062     </list>
0063     <list name="bmake_else_keywords">
0064       <item>.elif</item>
0065       <item>.elifdef</item>
0066       <item>.elifndef</item>
0067       <item>.elifmake</item>
0068       <item>.elifnmake</item>
0069       <item>.else</item> <!-- TODO: anything following .else should be highlighted as an error -->
0070     </list>
0071     <list name="bmake_endif_keywords"><item>.endif</item></list>
0072 
0073     <list name="bmake_expressions">
0074       <item>defined</item>
0075       <item>empty</item>
0076       <item>exists</item>
0077       <item>target</item>
0078       <item>commands</item>
0079     </list>
0080 
0081     <list name="bmake_include_stmt">
0082       <item>.include</item>
0083       <item>.-include</item>
0084       <item>.sinclude</item>
0085       <!-- For compat bmake also handles include but this is already highlighted. <item>include</item> --> 
0086     </list>
0087     <list name="bmake_message_stmt">
0088       <item>.info</item>
0089       <item>.warning</item>
0090       <item>.error</item>
0091     </list>
0092     <!-- Use single element list here so that .for/.endfor also shows up in code completion -->
0093     <list name="bmake_for_stmt"><item>.for</item></list>
0094     <list name="bmake_endfor_stmt"><item>.endfor</item></list>
0095 
0096     <!-- https://www.freebsd.org/cgi/man.cgi?make(1)#SPECIAL_TARGETS -->
0097     <list name="bmake_special_targets">
0098       <item>.BEGIN</item>
0099       <item>.DEFAULT</item>
0100       <item>.END</item>
0101       <item>.ERROR</item>
0102       <item>.IGNORE</item>
0103       <item>.INTERRUPT</item>
0104       <item>.MAIN</item>
0105       <item>.MAKEFLAGS</item>
0106       <item>.NOPATH</item>
0107       <item>.NOTPARALLEL</item>
0108       <item>.NO_PARALLEL</item>
0109       <item>.OBJDIR</item>
0110       <item>.ORDER</item>
0111       <item>.PATH</item>
0112       <item>.PHONY</item>
0113       <item>.PRECIOUS</item>
0114       <item>.SHELL</item>
0115       <item>.SILENT</item>
0116       <item>.STALE</item>
0117       <item>.SUFFIXES</item>
0118     </list>
0119     <!-- https://www.freebsd.org/cgi/man.cgi?make(1)#SPECIAL_SOURCES_(ATTRIBUTES) -->
0120     <list name="bmake_special_sources">
0121       <item>.EXEC</item>
0122       <item>.IGNORE</item>
0123       <item>.MADE</item>
0124       <item>.MAKE</item>
0125       <item>.META</item>
0126       <item>.NOMETA</item>
0127       <item>.NOMETA_CMP</item>
0128       <item>.NOPATH</item>
0129       <item>.NOTMAIN</item>
0130       <item>.OPTIONAL</item>
0131       <item>.PHONY</item>
0132       <item>.PRECIOUS</item>
0133       <item>.RECURSIVE</item>
0134       <item>.SILENT</item>
0135       <item>.USE</item>
0136       <item>.USEBEFORE</item>
0137       <item>.WAIT</item>
0138     </list>
0139 
0140     <list name="bmake_other_stmts">
0141       <item>.unexport-env</item>
0142       <item>.unexport</item>
0143       <item>.undef</item>
0144       <item>.export-env</item>
0145       <item>.export</item>
0146     </list>
0147 
0148     <list name = "functions">
0149       <item>call</item>
0150       <item>subst</item>
0151       <item>patsubst</item>
0152       <item>strip</item>
0153       <item>findstring</item>
0154       <item>filter</item>
0155       <item>filter-out</item>
0156       <item>sort</item>
0157       <item>word</item>
0158       <item>wordlist</item>
0159       <item>words</item>
0160       <item>firstword</item>
0161       <item>lastword</item>
0162       <item>dir</item>
0163       <item>notdir</item>
0164       <item>suffix</item>
0165       <item>basename</item>
0166       <item>addsuffix</item>
0167       <item>addprefix</item>
0168       <item>join</item>
0169       <item>wildcard</item>
0170       <item>realpath</item>
0171       <item>abspath</item>
0172       <item>if</item>
0173       <item>or</item>
0174       <item>and</item>
0175       <item>foreach</item>
0176       <item>value</item>
0177       <item>eval</item>
0178       <item>origin</item>
0179       <item>flavor</item>
0180       <item>shell</item>
0181       <item>error</item>
0182       <item>warning</item>
0183       <item>info</item>
0184     </list>
0185     <contexts>
0186       <context name="normal" attribute="Normal" lineEndContext="#stay" fallthroughContext="strings_and_vars">
0187         <DetectSpaces/>
0188         <DetectChar attribute="Comment" context="Comment" char="#"/>
0189 
0190         <!-- first because a variable can have the same name as a keyword -->
0191         <RegExpr attribute="Variable" context="assign" String="&varname;(?=\s*([+!?]|::?:?)?=)" firstNonSpace="true"/>
0192 
0193         <keyword attribute="ControlFlow" String="bmake_if_keywords" context="bmake_conditional" beginRegion="bmake_if" firstNonSpace="true"/>
0194         <!--TODO: trailing non-space after .else should be highlighted as an error -->
0195         <keyword attribute="ControlFlow" String="bmake_else_keywords" context="bmake_conditional" endRegion="bmake_if" beginRegion="bmake_if" firstNonSpace="true"/>
0196         <keyword attribute="ControlFlow" String="bmake_endif_keywords" context="#stay" endRegion="bmake_if" firstNonSpace="true"/>
0197 
0198         <keyword attribute="ControlFlow" String="gmake_if_keywords" context="strings_and_vars" beginRegion="gmake_if" firstNonSpace="true" weakDeliminator=":"/>
0199         <!--TODO: trailing non-space after else should be highlighted as an error -->
0200         <keyword attribute="ControlFlow" String="gmake_else_keywords" context="gmake_else" endRegion="gmake_if" beginRegion="gmake_if" firstNonSpace="true" weakDeliminator=":"/>
0201         <keyword attribute="ControlFlow" String="gmake_endif_keywords" context="#stay" endRegion="gmake_if" firstNonSpace="true" weakDeliminator=":"/>
0202 
0203         <WordDetect attribute="Keyword" context="define" String="define" firstNonSpace="true" weakDeliminator=":"/>
0204         <WordDetect attribute="Keyword" context="override" String="override" firstNonSpace="true" weakDeliminator=":"/>
0205         <WordDetect attribute="Keyword" context="export" String="export" firstNonSpace="true" weakDeliminator=":"/>
0206         <WordDetect attribute="Keyword" context="export" String="unexport" firstNonSpace="true" weakDeliminator=":"/>
0207         <WordDetect attribute="Keyword" context="export" String="undefine" firstNonSpace="true" weakDeliminator=":"/>
0208         <keyword attribute="Keyword"  context="strings_and_vars" String="keywords" firstNonSpace="true" weakDeliminator=":"/>
0209 
0210         <keyword attribute="Keyword"  context="bmake_other_stmts" String="bmake_other_stmts" firstNonSpace="true"/>
0211         <keyword attribute="SpecialTarget" context="bmake_special_target" String="bmake_special_targets" firstNonSpace="true"/>
0212         <RegExpr attribute="SpecialTarget" context="prereq" String="\.PATH\.[^:]*:" firstNonSpace="true"/>
0213         <keyword attribute="Keyword" context="bmake_include" String="bmake_include_stmt" firstNonSpace="true"/>
0214         <keyword attribute="Keyword" context="bmake_message" String="bmake_message_stmt" firstNonSpace="true"/>
0215         <keyword attribute="Keyword" context="bmake_for_loop" String="bmake_for_stmt" firstNonSpace="true" beginRegion="for"/>
0216         <keyword attribute="Keyword" context="strings_and_vars" String="bmake_endfor_stmt" firstNonSpace="true" endRegion="for"/>
0217 
0218         <RegExpr attribute="Section" context="prereq" String="^\.[^.][^:]*:" column="0"/>
0219         <RegExpr attribute="Target"  context="target" String="^([^:\\&amp;]|\\([:\\#&amp;]|(?=[^:\\#&amp;])))*+(?=[^:]*+:|\\$)" column="0"/>
0220 
0221         <AnyChar attribute="Operator" context="silent" String="@-" firstNonSpace="1"/>
0222         <DetectIdentifier/>
0223       </context>
0224 
0225       <context name="target" attribute="Target" lineEndContext="#pop">
0226         <StringDetect attribute="TargetSeparator" context="#pop!prereq" String="::"/>
0227         <DetectChar attribute="TargetSeparator" context="#pop!prereq" char=":"/>
0228         <DetectChar attribute="Operator" context="dollar" char="$"/>
0229         <LineContinue attribute="Operator" context="#pop"/>
0230         <StringDetect attribute="TargetSeparator" context="#pop!prereq" String="&amp;::"/>
0231         <StringDetect attribute="TargetSeparator" context="#pop!prereq" String="&amp;:"/>
0232         <StringDetect attribute="Target" String="\:"/>
0233         <DetectIdentifier attribute="Target"/>
0234       </context>
0235 
0236       <context name="strings_and_vars" attribute="Normal" lineEndContext="#pop">
0237         <DetectChar attribute="Operator" context="dollar" char="$"/>
0238         <DetectChar attribute="String" context="string&quot;" char="&quot;"/>
0239         <DetectChar attribute="String" context="string'" char="'"/>
0240         <DetectChar attribute="Comment" context="Comment" char="#"/>
0241       </context>
0242 
0243       <context name="gmake_else" attribute="Normal" lineEndContext="#pop">
0244         <DetectSpaces attribute="Normal"/>
0245         <keyword attribute="ControlFlow" String="gmake_if_keywords" context="#stay"/>
0246         <IncludeRules context="strings_and_vars"/>
0247         <Detect2Chars attribute="Special" context="#stay" char="\" char1="#"/>
0248         <Detect2Chars attribute="Special" context="#stay" char="\" char1="\"/>
0249         <!-- NOTE: Allow highlighting any variable name (see bug #417379), for example:
0250                  else ifdef foo
0251                  else ifeq (bar, foo)
0252         -->
0253         <DetectIdentifier attribute="Normal"/>
0254       </context>
0255 
0256       <context name="bmake_include" attribute="Normal" lineEndContext="#pop">
0257         <DetectSpaces />
0258         <RangeDetect char="&lt;"  char1="&gt;" context="#stay" attribute="Include" />
0259         <RangeDetect char="&quot;"  char1="&quot;" context="#stay" attribute="Include" />
0260       </context>
0261 
0262 
0263       <context name="bmake_conditional" attribute="Normal" lineEndContext="#pop">
0264         <DetectSpaces/>
0265         <IncludeRules context="strings_and_vars"/>
0266         <keyword attribute="Builtin"  context="bmake_expression" String="bmake_expressions"/>
0267         <Detect2Chars attribute="RealOperator" context="#stay" char="&amp;" char1="&amp;"/>
0268         <Detect2Chars attribute="RealOperator" context="#stay" char="|" char1="|"/>
0269         <Detect2Chars attribute="RealOperator" context="#stay" char="!" char1="="/>
0270         <Detect2Chars attribute="RealOperator" context="#stay" char="=" char1="="/>
0271         <DetectChar attribute="RealOperator" context="#stay" char="!"/>
0272         <HlCHex attribute="Number" context="#stay"/>
0273         <Int attribute="Number" context="#stay"/>
0274         <DetectIdentifier attribute="Variable" context="#stay"/>
0275         <LineContinue attribute="Operator" context="#stay"/>
0276       </context>
0277 
0278       <context name="bmake_for_loop" attribute="Variable" lineEndContext="#pop">
0279         <DetectSpaces/>
0280         <IncludeRules context="strings_and_vars"/>
0281         <WordDetect attribute="RealOperator" context="#stay" String="in" />
0282       </context>
0283 
0284       <context name="bmake_other_stmts" attribute="Variable" lineEndContext="#pop">
0285         <DetectSpaces/>
0286         <IncludeRules context="strings_and_vars"/>
0287       </context>
0288 
0289       <context name="bmake_expression" attribute="Variable" lineEndContext="#pop">
0290         <DetectSpaces/>
0291         <IncludeRules context="strings_and_vars"/>
0292         <DetectChar attribute="Normal" context="#stay" char="("/>
0293         <DetectChar attribute="Normal" context="#pop" char=")"/>
0294         <DetectIdentifier attribute="Variable"/>
0295       </context>
0296 
0297       <context name="bmake_special_target" attribute="Error" lineEndContext="rule">
0298         <!-- anything but spaces before the : should be an error -->
0299         <DetectSpaces attribute="Normal" />
0300         <DetectChar attribute="SpecialTarget" context="#pop!prereq" char=":"/>
0301       </context>
0302 
0303       <context name="bmake_message" attribute="String" lineEndContext="#pop">
0304         <DetectChar attribute="Operator" context="dollar" char="$"/>
0305       </context>
0306 
0307       <context name="prereq" attribute="Prereq" lineEndContext="rule" fallthroughContext="#pop!prereq2">
0308         <DetectSpaces/>
0309         <keyword attribute="Keyword"  context="export" String="special_keywords" weakDeliminator=".@,+%-/^*?="/>
0310         <RegExpr attribute="Variable" context="assign" String="[a-zA-Z_]+(?=\s*([+!?]|::?:?)?=)|"/>
0311       </context>
0312       <context name="prereq2" attribute="Prereq" lineEndContext="rule">
0313         <DetectSpaces/>
0314         <keyword attribute="SpecialPrereq" context="#stay" String="bmake_special_sources"/>
0315         <DetectIdentifier/>
0316         <LineContinue attribute="Operator" context="#stay"/>
0317         <DetectChar attribute="Operator" context="dollar" char="$"/>
0318         <Detect2Chars attribute="Special" context="#stay" char="\" char1="#"/>
0319         <Detect2Chars attribute="Special" context="#stay" char="\" char1="\"/>
0320         <DetectChar attribute="Comment" context="Comment" char="#"/>
0321         <DetectChar attribute="Operator" context="inline-rule" char=";"/>
0322       </context>
0323 
0324       <context name="inline-rule" attribute="Normal" lineEndContext="#pop!rule" fallthroughContext="#pop!inline-rule-cmd">
0325         <DetectSpaces/>
0326         <LineContinue attribute="Operator" context="#stay"/>
0327         <AnyChar attribute="Operator" context="silent" String="@-"/>
0328       </context>
0329       <context name="inline-rule-cmd" attribute="Normal" lineEndContext="#pop!rule">
0330         <DetectSpaces/>
0331         <DetectIdentifier/>
0332         <DetectChar attribute="String" context="string&quot;" char="&quot;"/>
0333         <DetectChar attribute="String" context="string'" char="'"/>
0334         <DetectChar attribute="Operator" context="dollar" char="$"/>
0335         <Detect2Chars attribute="Special" context="#stay" char="\" char1="#"/>
0336         <Detect2Chars attribute="Special" context="#stay" char="\" char1="\"/>
0337         <AnyChar attribute="Operator" context="silent" String="@-" firstNonSpace="1"/>
0338         <DetectChar attribute="Comment" context="Comment" char="#"/>
0339         <LineContinue attribute="Operator" context="#stay"/>
0340       </context>
0341 
0342       <context name="rule" attribute="Normal" lineEndContext="#stay">
0343         <DetectChar char="&#9;" column="0"/>
0344         <DetectChar attribute="Comment" context="Comment" char="#"/>
0345         <!-- pop if there is a leading non-tab,
0346         and in particular, mark leading spaces as errors -->
0347         <RegExpr attribute="Error" context="#pop#pop#pop" String="^ ++(?!#)" column="0"/>
0348         <RegExpr context="#pop#pop#pop" String="^(?=\s*#)|^[^#\t]" lookAhead="1" column="0"/>
0349         <DetectSpaces/>
0350         <DetectIdentifier/>
0351         <DetectChar attribute="String" context="string&quot;" char="&quot;"/>
0352         <DetectChar attribute="String" context="string'" char="'"/>
0353         <DetectChar attribute="Operator" context="dollar" char="$"/>
0354         <LineContinue attribute="Operator" context="rule_continuation"/>
0355         <Detect2Chars attribute="Special" context="#stay" char="\" char1="#"/>
0356         <Detect2Chars attribute="Special" context="#stay" char="\" char1="\"/>
0357         <AnyChar attribute="Operator" context="silent" String="@-" firstNonSpace="1"/>
0358       </context>
0359       <context name="rule_continuation" attribute="Normal" lineEndContext="#stay" fallthroughContext="#pop">
0360         <DetectSpaces context="#pop"/>
0361       </context>
0362 
0363       <context name="silent" attribute="Silent" lineEndContext="#pop">
0364         <LineContinue attribute="Operator" context="#stay"/>
0365         <DetectSpaces/>
0366         <DetectIdentifier/>
0367         <DetectChar attribute="String" context="string&quot;" char="&quot;"/>
0368         <DetectChar attribute="String" context="string'" char="'"/>
0369         <DetectChar attribute="Operator" context="dollar" char="$"/>
0370         <Detect2Chars attribute="Special" context="#stay" char="\" char1="#"/>
0371         <Detect2Chars attribute="Special" context="#stay" char="\" char1="\"/>
0372         <DetectChar attribute="Comment" context="Comment" char="#"/>
0373       </context>
0374 
0375       <context name="string&quot;" attribute="String" lineEndContext="#pop">
0376         <LineContinue attribute="Operator" context="#stay"/>
0377         <DetectChar attribute="String" context="#pop" char="&quot;"/>
0378         <DetectChar attribute="Operator" context="dollar" char="$"/>
0379       </context>
0380 
0381       <context name="string'" attribute="String" lineEndContext="#pop">
0382         <LineContinue attribute="String" context="#stay"/>
0383         <DetectChar attribute="String" context="#pop" char="'"/>
0384         <DetectChar attribute="Operator" context="dollar" char="$"/>
0385       </context>
0386 
0387       <context name="assign" attribute="Operator" lineEndContext="#pop">
0388         <DetectSpaces attribute="Normal"/>
0389         <DetectChar attribute="Operator" context="value" char="="/>
0390       </context>
0391 
0392       <context name="value" attribute="String" lineEndContext="#pop#pop">
0393         <LineContinue attribute="Operator"/>
0394         <DetectChar attribute="Operator" context="dollar" char="$"/>
0395         <RegExpr attribute="Special" context="#pop#pop" String="@[-_\d\w]*@"/>
0396         <Detect2Chars attribute="String" char="\" char1="#"/>
0397         <DetectChar attribute="Comment" context="#pop#pop!Comment" char="#"/>
0398         <RegExpr attribute="String" String="[^$@\\#]+"/>
0399       </context>
0400 
0401       <context name="dollar" attribute="Operator" lineEndContext="#pop">
0402         <DetectChar attribute="Operator" context="call(" char="("/>
0403         <DetectChar attribute="Operator" context="call{" char="{"/>
0404         <RegExpr attribute="Operator" context="#pop" String="."/>
0405       </context>
0406 
0407       <context name="call(" attribute="Variable" lineEndContext="#stay" fallthroughContext="callVar(">
0408         <keyword attribute="Keyword" context="callFunc(" String="functions"/>
0409       </context>
0410 
0411       <context name="call{" attribute="Variable" lineEndContext="#stay" fallthroughContext="callVar{">
0412         <keyword attribute="Keyword" context="callFunc{" String="functions"/>
0413       </context>
0414 
0415       <context name="callVar(" attribute="Variable" lineEndContext="#stay">
0416         <DetectChar attribute="Operator" char=")" context="#pop#pop#pop"/>
0417         <DetectChar attribute="Operator" context="dollar" char="$"/>
0418         <DetectSpaces attribute="Error" context="#stay"/>
0419         <DetectChar attribute="RealOperator" context="SubstitutionRefs" char=":"/>
0420         <AnyChar attribute="Error" context="#stay" String="=#"/>
0421       </context>
0422 
0423       <context name="callVar{" attribute="Variable" lineEndContext="#stay">
0424         <DetectChar attribute="Operator" char="}" context="#pop#pop#pop"/>
0425         <DetectChar attribute="Operator" context="dollar" char="$"/>
0426         <DetectSpaces attribute="Error" context="#stay"/>
0427         <!-- Handle bmake Variable modifiers: ${variable[:modifier[:...]]} -->
0428         <Detect2Chars context="#stay" char="\" char1=":"/>
0429         <!-- other modifiers -->
0430         <DetectChar attribute="RealOperator" context="bmake_var_modifier" char=":"/>
0431         <AnyChar attribute="Error" context="#stay" String="=#"/>
0432       </context>
0433 
0434       <context name="override" attribute="Normal" lineEndContext="#pop" fallthroughContext="#pop!export">
0435         <DetectSpaces/>
0436         <WordDetect attribute="Keyword" context="#pop!define" String="define"/>
0437         <WordDetect attribute="Keyword" context="#pop!export" String="undefine"/>
0438       </context>
0439 
0440       <context name="define" attribute="Normal" lineEndContext="define_body">
0441         <DetectSpaces/>
0442         <DetectChar attribute="Comment" context="Comment" char="#"/>
0443         <RegExpr attribute="Variable" context="define_op" String="&varname;"/>
0444       </context>
0445       <context name="define_op" attribute="Operator" lineEndContext="#pop!define_body">
0446         <DetectSpaces attribute="Normal"/>
0447         <DetectChar attribute="Comment" context="Comment" char="#"/>
0448       </context>
0449       <context name="define_body" attribute="String" lineEndContext="#stay">
0450         <DetectSpaces attribute="String"/>
0451         <WordDetect attribute="Keyword" context="#pop#pop" String="endef" firstNonSpace="true"/>
0452         <DetectIdentifier attribute="String"/>
0453         <LineContinue attribute="Operator"/>
0454         <DetectChar attribute="Operator" context="dollar" char="$"/>
0455         <RegExpr attribute="Special" String="@[-_\d\w]*@"/>
0456       </context>
0457 
0458       <context name="export" attribute="Variable" lineEndContext="#pop" fallthroughContext="#pop!assign">
0459         <DetectSpaces/>
0460         <DetectIdentifier/>
0461       </context>
0462 
0463       <context name="bmake_var_modifier_arg" attribute="VarModifier" lineEndContext="#pop">
0464         <DetectChar attribute="Operator" context="dollar" char="$"/>
0465         <Detect2Chars context="#stay" char="\" char1="}"/>
0466         <DetectChar attribute="Operator" char="}" context="#pop#pop#pop#pop"/>
0467         <Detect2Chars context="#stay" char="\" char1=":"/>
0468         <DetectChar attribute="RealOperator" context="#pop!bmake_var_modifier" char=":"/>
0469       </context>
0470 
0471       <!-- TODO: once all modifiers are properly handled change fallthroughContext to "expect}" -->
0472       <context name="bmake_var_modifier" attribute="VarModifier" lineEndContext="#pop" fallthroughContext="#pop!bmake_var_modifier_arg">
0473         <DetectChar attribute="Operator" context="dollar" char="$"/>
0474 
0475                     <!--
0476           TODO :?true_string:false_string
0477           TODO :old_string=new_string This is the AT&T System V UNIX style variable substitution.
0478           TODO :@temp@string@ This is the loop expansion mechanism from the OSF Development Environment (ODE) make.
0479           TODO :!cmd! The output of running cmd is the value.
0480           TODO :[range]
0481         -->
0482         <!--  Modifiers without arguments:-->
0483         <!-- :Ox  Randomize words in variable. -->
0484         <Detect2Chars attribute="Builtin" context="#pop!expect}" char="O" char1="x"/>
0485         <!--
0486           :E Replaces each word in the variable with its suffix.
0487           :H Replaces each word in the variable with everything but the last component.
0488           :O   Order every word in variable alphabetically.
0489           :Q   Quotes every shell meta-character in the variable
0490           :R   Replaces each word in the variable with everything but its suffix.
0491           :T   Replaces each word in the variable with its last component.
0492           :u   Remove adjacent duplicate words (like uniq(1)).
0493           :L The name of the variable is the value.
0494           :P The path of the node which has the same name as the variable is the value.
0495         -->
0496         <AnyChar    attribute="Builtin" context="#pop!expect}" String="EHOQRTuLP"/>
0497         <!-- :sh  If the variable is non-empty it is run as a command and the output becomes the new value. -->
0498         <Detect2Chars attribute="Builtin" context="#pop!expect}" char="s" char1="h"/>
0499         <!-- :tA  Attempt to convert variable to an absolute path using realpath(3),-->
0500         <Detect2Chars attribute="Builtin" context="#pop!expect}" char="t" char1="A"/>
0501         <!-- :tl  Converts variable to lower-case letters.-->
0502         <Detect2Chars attribute="Builtin" context="#pop!expect}" char="t" char1="L"/>
0503         <!--  :gmtime The value is a format string for strftime(3), using the current gmtime(3). -->
0504         <StringDetect attribute="Builtin" String="gmtime" context="#pop!expect}" />
0505         <!-- :hash Compute a 32bit hash of the value and encode it as hex digits. -->
0506         <StringDetect attribute="Builtin" String="hash" context="#pop!expect}" />
0507         <!-- :localtime The value is a format string for strftime(3), using the current localtime(3). -->
0508         <StringDetect attribute="Builtin" String="localtime" context="#pop!expect}" />
0509         <!--Now the modifiers with arguments:-->
0510         <!--
0511           :Mpattern Select only those words that match pattern.
0512           :Npattern This is identical to `:M', but selects all words which do not match pattern.
0513           :Dnewval If the variable is defined newval is the value.
0514           :Unewval If the variable is undefined newval is the value.
0515         -->
0516         <!-- TODO: add new context to highligh old_string and new_string differently
0517           :S/old_string/new_string/[1gW]
0518           :C/pattern/replacement/[1gW]
0519         -->
0520         <AnyChar    attribute="Builtin" context="#pop!bmake_var_modifier_arg" String="MNDUSC"/>
0521         <!-- ::=str The variable is assigned the value str after substitution. -->
0522         <Detect2Chars attribute="Builtin" context="#pop!bmake_var_modifier_arg" char=":" char1="="/>
0523         <!-- ::?=str As for ::= but only if the variable does not already have a value. -->
0524         <StringDetect attribute="Builtin" String=":?=" context="#pop!bmake_var_modifier_arg" />
0525         <!-- ::+=str Append str to the variable. -->
0526         <StringDetect attribute="Builtin" String=":+=" context="#pop!bmake_var_modifier_arg" />
0527         <!-- ::!=cmd Assign the output of cmd to the variable. -->
0528         <StringDetect attribute="Builtin" String=":!=" context="#pop!bmake_var_modifier_arg" />
0529         <!-- :tu  Converts variable to upper-case letters. -->
0530         <Detect2Chars attribute="Builtin" context="#pop!bmake_var_modifier_arg" char="t" char1="u"/>
0531         <!-- :tW  Causes the value to be treated as a single word.  See also `:[*]'. -->
0532         <Detect2Chars attribute="Builtin" context="#pop!bmake_var_modifier_arg" char="t" char1="W"/>
0533         <!-- :tw  Causes the value to be treated as a sequence of words delimited by white space.  See also `:[@]'.-->
0534         <Detect2Chars attribute="Builtin" context="#pop!bmake_var_modifier_arg" char="t" char1="w"/>
0535         <!-- :tsc Words in the variable are normally separated by a space on
0536           expansion.  This modifier sets the separator to the character c.  If
0537           c is omitted, then no separator is used.  The common escapes
0538           (including octal numeric codes), work as expected. -->
0539         <Detect2Chars attribute="Builtin" context="#pop!bmake_var_modifier_arg" char="t" char1="s"/>
0540 
0541         <IncludeRules context="bmake_var_modifier_arg"/>
0542       </context>
0543 
0544       <context name="expect}" attribute="Error" lineEndContext="#pop#pop#pop#pop">
0545         <Detect2Chars context="#stay" char="\" char1="}"/>
0546         <DetectChar attribute="Operator" char="}" context="#pop#pop#pop#pop"/>
0547       </context>
0548 
0549       <context name="callFunc(" attribute="FuncParam" lineEndContext="#stay">
0550         <DetectChar attribute="Operator" char=")" context="#pop#pop#pop"/>
0551         <DetectChar attribute="FuncParam" char="(" context="callFuncSub("/>
0552         <IncludeRules context="callFuncCommon"/>
0553       </context>
0554       <context name="callFuncSub(" attribute="FuncParam" lineEndContext="#stay">
0555         <DetectChar attribute="FuncParam" char=")" context="#pop"/>
0556         <DetectChar attribute="FuncParam" char="(" context="callFuncSub("/>
0557         <IncludeRules context="callFuncCommon"/>
0558       </context>
0559 
0560       <context name="callFunc{" attribute="FuncParam" lineEndContext="#stay">
0561         <DetectChar attribute="Operator" char="}" context="#pop#pop#pop"/>
0562         <DetectChar attribute="FuncParam" char="{" context="callFuncSub{"/>
0563         <IncludeRules context="callFuncCommon"/>
0564       </context>
0565       <context name="callFuncSub{" attribute="FuncParam" lineEndContext="#stay">
0566         <DetectChar attribute="FuncParam" char="}" context="#pop"/>
0567         <DetectChar attribute="FuncParam" char="{" context="callFuncSub{"/>
0568         <IncludeRules context="callFuncCommon"/>
0569       </context>
0570 
0571       <context name="callFuncCommon" attribute="FuncParam" lineEndContext="#stay">
0572         <DetectChar attribute="Operator" context="dollar" char="$"/>
0573         <DetectChar attribute="Keyword" context="#stay" char=","/>
0574         <DetectChar attribute="String" context="string&quot;" char="&quot;"/>
0575         <DetectChar attribute="String" context="string'" char="'"/>
0576       </context>
0577 
0578       <!-- $(var:pattern=replacement) -->
0579       <context name="SubstitutionRefs" attribute="VarModifier" lineEndContext="#stay">
0580         <DetectChar attribute="RealOperator" context="#pop!SubstitutionRefsReplacement" char="="/>
0581         <IncludeRules context="SubstitutionRefsReplacement"/>
0582       </context>
0583       <context name="SubstitutionRefsReplacement" attribute="VarModifier" lineEndContext="#stay">
0584         <DetectChar attribute="Operator" char=")" context="#pop#pop#pop#pop"/>
0585         <DetectChar attribute="Operator" context="dollar" char="$"/>
0586       </context>
0587 
0588       <context attribute="Comment" lineEndContext="#pop" name="Comment">
0589         <LineContinue attribute="Comment" context="#stay" />
0590         <IncludeRules context="##Comments" />
0591       </context>
0592 
0593     </contexts>
0594     <itemDatas>
0595       <itemData name="Normal"    defStyleNum="dsNormal" spellChecking="0"/>
0596       <itemData name="Keyword"   defStyleNum="dsKeyword" spellChecking="0"/>
0597       <itemData name="Comment"   defStyleNum="dsComment"/>
0598       <itemData name="String"    defStyleNum="dsString" spellChecking="0"/>
0599       <itemData name="Variable"  defStyleNum="dsDataType" spellChecking="0"/>
0600       <itemData name="Target"    defStyleNum="dsDecVal" spellChecking="0"/>
0601       <itemData name="Section"   defStyleNum="dsOthers" spellChecking="0"/>
0602       <itemData name="Prereq"    defStyleNum="dsDataType" spellChecking="0"/>
0603       <itemData name="FuncParam" defStyleNum="dsString" spellChecking="0"/>
0604       <itemData name="Operator"  defStyleNum="dsChar" spellChecking="0"/>
0605       <itemData name="Silent"    defStyleNum="dsFunction" spellChecking="0"/>
0606       <itemData name="Special"   defStyleNum="dsFloat" spellChecking="0"/>
0607       <itemData name="Error"     defStyleNum="dsError" spellChecking="0"/>
0608       <itemData name="Builtin"   defStyleNum="dsBuiltIn" spellChecking="0"/>
0609       <itemData name="Number"    defStyleNum="dsDecVal" spellChecking="0"/>
0610       <itemData name="Include"   defStyleNum="dsImport" spellChecking="0"/>
0611       <itemData name="ControlFlow" defStyleNum="dsControlFlow" spellChecking="0"/>
0612       <itemData name="VarModifier" defStyleNum="dsSpecialString" spellChecking="0"/>
0613       <itemData name="RealOperator" defStyleNum="dsKeyword" spellChecking="0"/>
0614       <itemData name="SpecialTarget" defStyleNum="dsOthers" spellChecking="0" bold="1"/>
0615       <itemData name="SpecialPrereq" defStyleNum="dsDataType" spellChecking="0" bold="1"/>
0616       <itemData name="TargetSeparator" defStyleNum="dsDecVal" spellChecking="0"/>
0617     </itemDatas>
0618   </highlighting>
0619   <general>
0620     <comments>
0621       <comment name = "singleLine" start = "#"/>
0622     </comments>
0623     <!-- '-' is not a deliminator in function filter-out -->
0624     <keywords casesensitive="1" weakDeliminator = ".-"/>
0625   </general>
0626 </language>
0627 <!-- kate: syntax XML; space-indent on; indent-width 2; replace-tabs on; -->