File indexing completed on 2024-05-12 15:49:58

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