示例#1
0
def buildTarget(target, options, project, lock=None):
    if options.cleanMode:
        target.currBuildStep = target.findBuildStep("clean")
        target.success = buildStepActor(target, options, project, lock)
    else:
        if target.success:
            logger.reportSkipped(target.name, "", "Target successfully built in previous MixDown build")
        elif target.prefix != "" and os.path.exists(options.defines.expand(target.prefix)):
            logger.reportSkipped(target.name, "", "Target's defined prefix detected.")
            target.success = True
        elif not options.targetSpecifiedToBuild(target.name):
            logger.reportSkipped(target.name, "", "Target was not specified on command-line.")
            target.success = True
        else:
            if options.continueBuilding:
                for dependancyName in target.expandedDependsOn:
                    dependancyTarget = project.getTarget(dependancyName)
                    if dependancyTarget.success == False:
                        reasonString = "Target could not be built because dependant target ({0}) previously failed.".format(
                            dependancyTarget.name
                        )
                        logger.reportSkipped(target.name, reason=reasonString)
                        target.skippedDueToDependanciesFailing = True
                        return

            for buildStep in target.buildSteps:
                if buildStep.name == "clean" or buildStep.command == "":
                    continue
                buildStep.restartPath = target.path
                target.currBuildStep = buildStep
                target.success = buildStepActor(target, options, project, lock)
                if not target.success:
                    break
示例#2
0
def buildTarget(target, options, project, lock=None):
    if options.cleanMode:
        target.currBuildStep = target.findBuildStep("clean")
        target.success = buildStepActor(target, options, project, lock)
    else:
        if target.success:
            logger.reportSkipped(
                target.name, "",
                "Target successfully built in previous MixDown build")
        elif target.prefix != "" and os.path.exists(
                options.defines.expand(target.prefix)):
            logger.reportSkipped(target.name, "",
                                 "Target's defined prefix detected.")
            target.success = True
        elif not options.targetSpecifiedToBuild(target.name):
            logger.reportSkipped(target.name, "",
                                 "Target was not specified on command-line.")
            target.success = True
        else:
            if options.continueBuilding:
                for dependancyName in target.expandedDependsOn:
                    dependancyTarget = project.getTarget(dependancyName)
                    if dependancyTarget.success == False:
                        reasonString = "Target could not be built because dependant target ({0}) previously failed.".format(
                            dependancyTarget.name)
                        logger.reportSkipped(target.name, reason=reasonString)
                        target.skippedDueToDependanciesFailing = True
                        return

            for buildStep in target.buildSteps:
                if buildStep.name == "clean" or buildStep.command == "":
                    continue
                buildStep.restartPath = target.path
                target.currBuildStep = buildStep
                target.success = buildStepActor(target, options, project, lock)
                if not target.success:
                    break
示例#3
0
def buildStepActor(target, options, project, lock=None):
    if target.isStepToBeSkipped(target.currBuildStep.name):
        try:
            if lock:
                lock.acquire()
            logger.reportSkipped(target.name, target.currBuildStep.name, "Target specified to skip step")
        finally:
            if lock:
                lock.release()
        return True

    if target.isStepPreviouslyDone(target.currBuildStep.name):
        try:
            if lock:
                lock.acquire()
            logger.reportSkipped(
                target.name, target.currBuildStep.name, "Build step successfully built in previous MixDown build"
            )
        finally:
            if lock:
                lock.release()
        return True

    try:
        if lock:
            lock.acquire()
        logger.reportStart(target.name, target.currBuildStep.name)
        # Refresh defines before start of every step
        project.setTargetFieldsAsDefines(options.defines)
    finally:
        if lock:
            lock.release()
    returnCode = None

    timeStart = time.time()
    command = options.defines.expand(target.currBuildStep.command)
    isPythonCommand, namespace, function = python.parsePythonCommand(command)
    if isPythonCommand:
        success = python.callPythonCommand(namespace, function, target, options, project)
        if not success:
            returnCode = 1
        else:
            returnCode = 0
    else:
        try:
            if lock:
                lock.acquire()
            logger.writeMessage("Executing command: " + command, target.name, target.currBuildStep.name, True)
        finally:
            if lock:
                lock.release()

        if not os.path.exists(target.path):
            logger.writeError(
                target.name
                + "'s path does not exist when about to execute build command in step "
                + target.currBuildStep.name
                + ".",
                filePath=target.path,
            )
            returnCode = 1
        else:
            outFd = logger.getOutFd(target.name, target.currBuildStep.name)
            returnCode = utilityFunctions.executeSubProcess(command, target.path, outFd)

    timeFinished = time.time()
    timeElapsed = timeFinished - timeStart

    if returnCode != 0:
        target.currBuildStep.success = False
        try:
            if lock:
                lock.acquire()
            logger.reportFailure(target.name, target.currBuildStep.name, timeElapsed, returnCode)
        finally:
            if lock:
                lock.release()
        return False

    target.currBuildStep.success = True
    try:
        if lock:
            lock.acquire()
        logger.reportSuccess(target.name, target.currBuildStep.name, timeElapsed)
    finally:
        if lock:
            lock.release()
    return True