Home | History | Annotate | Download | only in build
      1 # Copyright (C) 2009 Kevin Ollivier  All rights reserved.
      2 #
      3 # Redistribution and use in source and binary forms, with or without
      4 # modification, are permitted provided that the following conditions
      5 # are met:
      6 # 1. Redistributions of source code must retain the above copyright
      7 #    notice, this list of conditions and the following disclaimer.
      8 # 2. Redistributions in binary form must reproduce the above copyright
      9 #    notice, this list of conditions and the following disclaimer in the
     10 #    documentation and/or other materials provided with the distribution.
     11 #
     12 # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     13 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     15 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     16 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     17 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     18 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     19 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     20 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     22 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
     23 #
     24 # This module is for code where we override waf's default behavior or extend waf
     25 
     26 import os
     27 import subprocess
     28 import sys
     29 
     30 import Utils
     31 
     32 # version of exec_command that handles Windows command lines longer than 32000 chars
     33 def exec_command(s, **kw):
     34     filename = ''
     35     if sys.platform.startswith('win') and len(' '.join(s)) > 32000:
     36         import tempfile
     37         (fd, filename) = tempfile.mkstemp()
     38         t = []
     39         for i in s:
     40             if i.find(" ") != -1:
     41                 i = '"%s"' % i
     42             t.append(i)
     43             
     44         t1 = t[1:]
     45         # Fix for LNK1170 error
     46         filename_str = '@' + filename
     47         filename2_str = None
     48         if len(' '.join(s)) > 131070:
     49             t2 = t[len(t) / 2:]
     50             t1 = t[1:len(t) / 2]
     51             (fd2, filename2) = tempfile.mkstemp()
     52             os.write(fd2, ' '.join(t2))
     53             os.close(fd2)
     54             filename2_str = '@' + filename2
     55         os.write(fd, ' '.join(t1))
     56         os.close(fd)
     57         
     58         s = [s[0]]
     59         s.append(filename_str)
     60         if filename2_str:
     61             s.append(filename2_str)
     62         
     63     if 'log' in kw:
     64         kw['stdout'] = kw['stderr'] = kw['log']
     65         del(kw['log'])
     66     kw['shell'] = isinstance(s, str)
     67 
     68     def cleanup():
     69         try:
     70             if os.path.exists(filename):
     71                 os.remove(filename)
     72         except:
     73             pass
     74 
     75     try:
     76         proc = subprocess.Popen(s, **kw)
     77         result = proc.wait()
     78         cleanup()
     79         return result
     80         
     81     except OSError:
     82         cleanup()
     83         raise
     84         
     85 Utils.exec_command = exec_command
     86 
     87 # Better performing h_file to keep hashing from consuming lots of time
     88 import stat
     89 def h_file(filename):
     90     st = os.stat(filename)
     91     if stat.S_ISDIR(st[stat.ST_MODE]): raise IOError('not a file')
     92     m = Utils.md5()
     93     m.update(str(st.st_mtime))
     94     m.update(str(st.st_size))
     95     m.update(filename)
     96     return m.digest()
     97 
     98 Utils.h_file = h_file
     99