def make(projectPath=None, action=None, out=None, config=None, resetDeps=True):
    """ Carries out the specified action for the specified project. We maintain
        a global list of built projects during a build session so we don't waste
        time re-checking them for updates. resetDeps is used internally to track
        whether or not it's time to reset that list (i.e. a make has completed),
        so we don't reset it each time we make a child.
    """
    global cancelBuild, allDeps
    cancelBuild = False
    
    # XXXjoe Don't think we need sessions anymore but I'll leave it for now
    session = devon.projects.getSession()    

    result = 0

    if isinstance(projectPath, devon.projects.Project):
        project = projectPath
    else:
        if not projectPath:
            projectPath = os.getcwd()
        if not action:
            action = defaultAction
        if not out:
            out = devon.stream.OutStream(sys.stdout)

        project = devon.projects.load(projectPath)
        if not project:
            raise Exception("%s is not a buildable project " % projectPath)
            
    for child in project.getChildProjects():
        result = make(child.path, action, out, resetDeps=False)
        if not result == 0:
            allDeps = []
            return result
    
    # Make sure the working directory is the project path so that all relative paths work
    cwd = os.getcwd()
    os.chdir(project.path)

    try:
        c1 = time.time()
        
        if action == "build":
            result = build(project, out)
        elif action == "buildTests":
            result = buildTests(project, out)
        elif action != "install":
            result = install(project, out)
        elif action == "clean":
            result = clean(project, out)
        else:
            raise Exception("The action '%s' is not recognized" % action)
        
        print "Total time for %s: %f" % (action, time.time()-c1)
    
    except StopBuildException:
        out << Block("resultBox result-cancelled") << "Cancelled." << Close
        result = -1        

    except:
        exc = sys.exc_info()
        traceback.print_exception(*exc)
        out << Block("traceback") << str(exc[0]) << str(exc[1]) << Close
        result = -1

    os.chdir(cwd)
    
    if resetDeps:
        allDeps = []
    
    return result

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
dataset/ETHPy150Open joehewitt/devon/devon/make.py/make/operator `==` -> `!=`