third_party: Update waf to verison 2.0.23
[samba.git] / third_party / waf / waflib / Tools / winres.py
index 586c596cf93741206960bd992a88e8117fc3d379..73c0e95315b4983d060ace69d75a382d41a93cbe 100644 (file)
@@ -4,10 +4,12 @@
 
 "Process *.rc* files for C/C++: X{.rc -> [.res|.rc.o]}"
 
+import os
 import re
 from waflib import Task
 from waflib.TaskGen import extension
 from waflib.Tools import c_preproc
+from waflib import Utils
 
 @extension('.rc')
 def rc_file(self, node):
@@ -24,8 +26,8 @@ def rc_file(self, node):
                self.compiled_tasks = [rctask]
 
 re_lines = re.compile(
-       '(?:^[ \t]*(#|%:)[ \t]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ \t]*(.*?)\s*$)|'\
-       '(?:^\w+[ \t]*(ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)[ \t]*(.*?)\s*$)',
+       r'(?:^[ \t]*(#|%:)[ \t]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ \t]*(.*?)\s*$)|'\
+       r'(?:^\w+[ \t]*(ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)[ \t]*(.*?)\s*$)',
        re.IGNORECASE | re.MULTILINE)
 
 class rc_parser(c_preproc.c_parser):
@@ -61,6 +63,39 @@ class winrc(Task.Task):
                tmp.start(self.inputs[0], self.env)
                return (tmp.nodes, tmp.names)
 
+       def exec_command(self, cmd, **kw):
+               if self.env.WINRC_TGT_F == '/fo':
+                       # Since winres include paths may contain spaces, they do not fit in
+                       # response files and are best passed as environment variables
+                       replace_cmd = []
+                       incpaths = []
+                       while cmd:
+                               # filter include path flags
+                               flag = cmd.pop(0)
+                               if flag.upper().startswith('/I'):
+                                       if len(flag) == 2:
+                                               incpaths.append(cmd.pop(0))
+                                       else:
+                                               incpaths.append(flag[2:])
+                               else:
+                                       replace_cmd.append(flag)
+                       cmd = replace_cmd
+                       if incpaths:
+                               # append to existing environment variables in INCLUDE
+                               env = kw['env'] = dict(kw.get('env') or self.env.env or os.environ)
+                               pre_includes = env.get('INCLUDE', '')
+                               env['INCLUDE'] = pre_includes + os.pathsep + os.pathsep.join(incpaths)
+
+               return super(winrc, self).exec_command(cmd, **kw)
+
+       def quote_flag(self, flag):
+               if self.env.WINRC_TGT_F == '/fo':
+                       # winres does not support quotes around flags in response files
+                       return flag
+
+               return super(winrc, self).quote_flag(flag)
+
+
 def configure(conf):
        """
        Detects the programs RC or windres, depending on the C/C++ compiler in use