gccdeps.py :  » Build » Waf » waf-1.5.17 » wafadmin » 3rdparty » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Build » Waf 
Waf » waf 1.5.17 » wafadmin » 3rdparty » gccdeps.py
#!/usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2008-2010 (ita)

"""
Execute the tasks with gcc -MD, read the dependencies from the .d file
and prepare the dependency calculation for the next run
"""

import os, re, threading
import Task, Logs, Utils, preproc
from TaskGen import before,after,feature

lock = threading.Lock()

preprocessor_flag = '-MD'

@feature('cc')
@before('apply_core')
def add_mmd_cc(self):
  if self.env.get_flat('CCFLAGS').find(preprocessor_flag) < 0:
    self.env.append_value('CCFLAGS', preprocessor_flag)

@feature('cxx')
@before('apply_core')
def add_mmd_cxx(self):
  if self.env.get_flat('CXXFLAGS').find(preprocessor_flag) < 0:
    self.env.append_value('CXXFLAGS', preprocessor_flag)

def scan(self):
  "the scanner does not do anything initially"
  nodes = self.generator.bld.node_deps.get(self.unique_id(), [])
  names = []
  return (nodes, names)

re_o = re.compile("\.o$")
re_src = re.compile("^(\.\.)[\\/](.*)$")

def post_run(self):
  # The following code is executed by threads, it is not safe, so a lock is needed...

  if getattr(self, 'cached', None):
    return Task.Task.post_run(self)

  name = self.outputs[0].abspath(self.env)
  name = re_o.sub('.d', name)
  txt = Utils.readf(name)
  #os.unlink(name)

  txt = txt.replace('\\\n', '')

  lst = txt.strip().split(':')
  val = ":".join(lst[1:])
  val = val.split()

  nodes = []
  bld = self.generator.bld

  f = re.compile("^("+self.env.variant()+"|\.\.)[\\/](.*)$")
  for x in val:
    if os.path.isabs(x):

      if not preproc.go_absolute:
        continue

      lock.acquire()
      try:
        node = bld.root.find_resource(x)
      finally:
        lock.release()
    else:
      g = re.search(re_src, x)
      if g:
        x = g.group(2)
        lock.acquire()
        try:
          node = bld.bldnode.parent.find_resource(x)
        finally:
          lock.release()
      else:
        g = re.search(f, x)
        if g:
          x = g.group(2)
          lock.acquire()
          try:
            node = bld.srcnode.find_resource(x)
          finally:
            lock.release()

    if id(node) == id(self.inputs[0]):
      # ignore the source file, it is already in the dependencies
      # this way, successful config tests may be retrieved from the cache
      continue

    if not node:
      raise ValueError('could not find %r for %r' % (x, self))
    else:
      nodes.append(node)

  Logs.debug('deps: real scanner for %s returned %s' % (str(self), str(nodes)))

  bld.node_deps[self.unique_id()] = nodes
  bld.raw_deps[self.unique_id()] = []

  try:
    del self.cache_sig
  except:
    pass

  Task.Task.post_run(self)

import Constants, Utils
def sig_implicit_deps(self):
  try:
    return Task.Task.sig_implicit_deps(self)
  except Utils.WafError:
    return Constants.SIG_NIL

for name in 'cc cxx'.split():
  try:
    cls = Task.TaskBase.classes[name]
  except KeyError:
    pass
  else:
    cls.post_run = post_run
    cls.scan = scan
    cls.sig_implicit_deps = sig_implicit_deps

www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.