com.nokia.s60tools.analyzetool.builder.AnalyzeToolBuilder.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.s60tools.analyzetool.builder.AnalyzeToolBuilder.java

Source

/*
 * Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description:  Definitions for the class AnalyzeToolBuilder
 *
 */

package com.nokia.s60tools.analyzetool.builder;

import java.text.MessageFormat;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;

import com.nokia.carbide.cdt.builder.BuildArgumentsInfo;
import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
import com.nokia.carbide.cdt.builder.builder.CarbideCPPBuilder;
import com.nokia.carbide.cdt.builder.builder.CarbideCommandLauncher;
import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
import com.nokia.s60tools.analyzetool.Activator;
import com.nokia.s60tools.analyzetool.global.Constants;
import com.nokia.s60tools.analyzetool.global.Util;

/**
 * Base class for AnalyzeTool builders.
 * 
 * This class modifies Carbide builder settings during the AnalyzeTool build.
 * This class can be used to built whole project or selected components with
 * AnalyzeTool
 * 
 * @author kihe
 * 
 */
public class AnalyzeToolBuilder extends CarbideCPPBuilder {

    /** Pre-builder id. */
    public static final String AT_BUILDER_ID = "com.nokia.s60tools.analyzetool.analyzeToolPreBuilder";

    /** CarbideCommandLauncher reference. */
    protected static CarbideCommandLauncher cmdLauncher = null;

    /** Used mmp files. */
    protected List<String> mmpFiles;

    /** Verbose atool.exe output? */
    private boolean verbose;

    /**
     * Gets shared instance of CarbideCommandLauncher.
     * 
     * @return CarbideCommandLauncher reference
     */
    protected static CarbideCommandLauncher getCarbideCommandLauncher() {
        return cmdLauncher;
    }

    /**
     * Checks is SBS v2 build activated for the project.
     * 
     * @param cpi
     *            ICarbideProjectInfo
     * @return True if SBS v2 build is activated otherwise False
     */
    public static boolean isSBSBuildActivated(final ICarbideProjectInfo cpi) {
        try {
            final Class<?> buildManagerClass = Class.forName("com.nokia.carbide.cdt.builder.ICarbideBuildManager");

            java.lang.reflect.Method[] methods = buildManagerClass.getMethods();
            for (int i = 0; i < methods.length; i++) {
                java.lang.reflect.Method oneMethod = methods[i];
                if (oneMethod.toString().contains("isCarbideSBSv2Project")) {
                    IProject project = cpi.getProject();
                    if (project == null) {
                        return false;
                    }
                    Object[] objs = new Object[1];
                    objs[0] = project;
                    Boolean obj = (Boolean) oneMethod.invoke(CarbideBuilderPlugin.getBuildManager(), objs);
                    return obj.booleanValue();
                }
            }
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
            return false;
        } catch (SecurityException se) {
            se.printStackTrace();
            return false;
        } catch (IllegalAccessException iae) {
            iae.printStackTrace();
            return false;
        } catch (IllegalArgumentException iare) {
            iare.printStackTrace();
            return false;
        } catch (java.lang.reflect.InvocationTargetException ite) {
            ite.printStackTrace();
            return false;
        }
        return false;
    }

    /**
     * Cancels AnalyzeTool build.
     * 
     * @param monitor
     *            Currently running progress monitor
     * @param continueBuild
     *            False stops the whole build chain (including Carbide and other
     *            builders) otherwise other than AnalyzeTool builds are executed
     *            normally.
     */
    public final void buildCancelled(final IProgressMonitor monitor, final boolean continueBuild) {

        IPreferenceStore store = Activator.getPreferences();

        store.setValue(Constants.PREFS_BUILD_CANCELLED, true);

        // if user wants to continue build
        if (!continueBuild) {
            // write info to the Carbide console view
            getCarbideCommandLauncher().writeToConsole(Constants.BUILD_CANCELLED);

            // update monitor state
            monitor.setCanceled(true);
            monitor.done();
        }

        boolean promptMPPChange = store.getBoolean(Constants.PREFS_PROMPT_MMP);
        boolean manageDeps = store.getBoolean(Constants.PREFS_MANAGE_DEPS);
        boolean useConcBuild = store.getBoolean(Constants.PREFS_CONC_BUILD);

        // build canceled set project preference back to normal
        IPreferenceStore cStore = CarbideBuilderPlugin.getDefault().getPreferenceStore();
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT,
                promptMPPChange);
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES,
                manageDeps);
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING,
                useConcBuild);

        // CarbideCPPBuilder to forgot build state
        super.forgetLastBuiltState();
    }

    /**
     * Builds user selected components.
     * 
     * Normally this method is called from the CompileSymbianComponent
     * 
     * @param selectedFiles
     *            User selected files
     */
    public final void buildComponents(final List<IFile> selectedFiles) {
        // create new job
        Job buildJob = new Job(Constants.BUILD_AND_INSTRUMENT) {
            @Override
            protected IStatus run(final IProgressMonitor monitor) {
                try {

                    // get project
                    IProject lastProject = selectedFiles.get(0).getProject();

                    // get CarbideProjectInfo
                    ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo(lastProject);

                    // get command launcher
                    cmdLauncher = new CarbideCommandLauncher(lastProject, monitor, Constants.atoolParserIds,
                            cpi.getINFWorkingDirectory());
                    cmdLauncher.showCommand(true);

                    // run pre steps for the build
                    if (!runPreSteps(cmdLauncher, monitor, cpi)) {
                        return new Status(IStatus.OK, Constants.ANALYZE_TOOL_TITLE, IStatus.OK, Constants.CANCELLED,
                                null);
                    }

                    // build selected components
                    runBuild(Constants.ATOOL_INST, monitor, cpi, selectedFiles);

                    // run post steps
                    runPostSteps(cpi);

                    // after the build is finished => open the console view
                    Util.openConsoleView();
                } finally {
                    monitor.done();
                }
                return new Status(IStatus.OK, Constants.ANALYZE_TOOL_TITLE, IStatus.OK, Constants.COMPLETE, null);
            }
        };

        buildJob.setPriority(Job.BUILD);
        buildJob.schedule();
    }

    /**
     * Checks that platform is ARMV5, GCEE or WINSCW
     * 
     * @param cpi
     *            ICarbideProjectInfo
     * @return True if platform is set to ARMV5, GCCE or WINSCW otherwise False
     */
    public final boolean checkPlatform(final ICarbideProjectInfo cpi) {
        String platform = cpi.getDefaultConfiguration().getPlatformString();
        if (platform.equals(Constants.BUILD_TARGET_ARMV5) || platform.equals(Constants.BUILD_TARGET_WINSCW)
                || platform.equals(Constants.BUILD_TARGET_GCEE)) {
            return true;
        }
        return false;
    }

    /**
     * Executes atool.exe with options.
     * 
     * @param path
     *            log path
     * @param fileName
     *            log file name
     * @param type
     *            Type of execution. Possible types ATOOL_INST or ATOOL_UNINST
     * @param loggingModeCommand
     *            Used logging mode
     * @param userSelectedMmpFiles
     *            List of user selected mmp files
     * @param cpi
     *            ICarbideProjectInfo reference
     * @param monitor
     *            Progress monitor reference
     * 
     * @return COMMAND_LINE_ERROR_CODE.OK if no errors, otherwise error code
     */
    protected final int executeAtool(final String path, final String fileName, final String type,
            final String loggingModeCommand, final List<IFile> userSelectedMmpFiles, final ICarbideProjectInfo cpi,
            final IProgressMonitor monitor) {

        // get used platform
        String platform = cpi.getDefaultConfiguration().getPlatformString().toLowerCase(Locale.US);

        // get build target
        String buildTarget = cpi.getDefaultConfiguration().getTargetString().toLowerCase(Locale.US);

        // used arguments to atool.exe
        AbstractList<String> usedArguments = new ArrayList<String>();

        // which logging mode is used
        if (loggingModeCommand.equalsIgnoreCase(Constants.LOGGING_EXT_FAST)) {
            usedArguments.add(Constants.ATOOL_INST_EF);
        } else {
            usedArguments.add(Constants.ATOOL_INST_I);
            // if path is set
            if (path != null && !("").equals(path)) {
                usedArguments.add("-fp");
                usedArguments.add(path);
            }

            // if file name is set
            if (fileName != null && !("").equals(fileName)) {
                usedArguments.add("-f");
                usedArguments.add(fileName);
            }
        }

        // if "verbose atool.exe output" is enabled
        if (verbose) {
            usedArguments.add(Constants.ATOOL_SHOW_DEBUG);
        }

        // get callstack size
        IPreferenceStore store = Activator.getPreferences();
        if (store.getBoolean(Constants.USE_CALLSTACK_SIZE)) {
            int callstackSize = store.getInt(Constants.CALLSTACK_SIZE);
            usedArguments.add(Constants.CALLSTACK_SIZE_OPTION);
            usedArguments.add(Integer.toString(callstackSize));
        }

        // add build command
        // if project using SBSv2 build system
        boolean sbsBuild = isSBSBuildActivated(cpi);
        if (sbsBuild) {
            usedArguments.add("sbs");
            usedArguments.add("-c");
            StringBuffer buildCommand = new StringBuffer();
            buildCommand.append(platform);
            buildCommand.append('_');
            buildCommand.append(buildTarget);
            usedArguments.add(buildCommand.toString());
        } else // use abld
        {
            usedArguments.add("abld");
            usedArguments.add("build");
            usedArguments.add(platform);
            usedArguments.add(buildTarget);
        }

        int errorCode = Constants.COMMAND_LINE_ERROR_CODE.OK.getCode();
        // if user has selected custom setup of components =>build them
        // this means that call is come from CompileSymbianComponent class
        if (userSelectedMmpFiles != null && !userSelectedMmpFiles.isEmpty()) {

            // get atool.exe command
            Iterator<IFile> files = userSelectedMmpFiles.iterator();
            while (files.hasNext()) {
                IFile file = files.next();
                IPath location = file.getLocation();

                String mmpFileName = getMMPFileName(location, true);
                if (mmpFileName == null || ("").equals(mmpFileName)) {
                    continue;
                }

                // if this is first mmp file add it parameter list
                usedArguments.add("-p");
                usedArguments.add(mmpFileName);
            }

            // now the command is ready
            // execute command
            // execute atool.exe via CommandLauncher class
            cmdLauncher.showCommand(true);
            String[] arguments = new String[usedArguments.size()];
            usedArguments.toArray(arguments);

            errorCode = cmdLauncher.executeCommand(new Path(Util.getAtoolInstallFolder()), arguments,
                    CarbideCPPBuilder.getResolvedEnvVars(cpi.getDefaultConfiguration()),
                    cpi.getINFWorkingDirectory());

            // if user press "Cancel"
            if (monitor.isCanceled()) {
                buildCancelled(monitor, false);
                monitor.done();
            }

            // thru selected files and build with the Carbide builder
            for (int i = 0; i < userSelectedMmpFiles.size(); i++) {

                // get one file
                IFile file = userSelectedMmpFiles.get(i);

                // get file location
                IPath fileLocation = file.getLocation();

                // invoke normal Carbide build
                try {
                    CarbideCPPBuilder.invokeSymbianComponenetAction(cpi.getDefaultConfiguration(),
                            CarbideCPPBuilder.BUILD_COMPONENT_ACTION, fileLocation, cmdLauncher, monitor, true);
                } catch (CoreException e) {
                    e.printStackTrace();
                }

                // if user press "Cancel"
                if (monitor.isCanceled()) {
                    buildCancelled(monitor, false);
                    monitor.done();
                }
            }

            // Carbide build is finished
            // now remove AnalyzeTool made modifications
            // if project contains build erros => only uninstrument mmp
            // file
            if (CarbideCPPBuilder.projectHasBuildErrors(cpi.getProject())) {
                usedArguments.set(0, Constants.ATOOL_UNINST_FAILED);
            }

            // project succesfully build => uninstrumet project
            runUninstrument(Constants.ATOOL_UNINST, cpi, monitor);
        }
        // if build from bld.inf file
        else if (cpi.isBuildingFromInf()) {
            cmdLauncher.showCommand(true);

            String[] arguments = new String[usedArguments.size()];
            usedArguments.toArray(arguments);
            errorCode = cmdLauncher.executeCommand(new Path(Util.getAtoolInstallFolder()), arguments,
                    CarbideCPPBuilder.getResolvedEnvVars(cpi.getDefaultConfiguration()),
                    cpi.getINFWorkingDirectory());

            if (mmpFiles != null) {
                mmpFiles.clear();
            }

            // if user press "Cancel"
            if (monitor.isCanceled()) {
                buildCancelled(monitor, false);
                monitor.done();
            }

        } else { // instrument only defined components
            // get build components
            mmpFiles = cpi.getInfBuildComponents();

            for (int i = 0; i < mmpFiles.size(); i++) {
                usedArguments.add("-p");
                usedArguments.add(mmpFiles.get(i));
            }
            cmdLauncher.showCommand(true);

            String[] arguments = new String[usedArguments.size()];
            usedArguments.toArray(arguments);
            errorCode = cmdLauncher.executeCommand(new Path(Util.getAtoolInstallFolder()), arguments,
                    CarbideCPPBuilder.getResolvedEnvVars(cpi.getDefaultConfiguration()),
                    cpi.getINFWorkingDirectory());

            // if user press "Cancel"
            if (monitor.isCanceled()) {
                buildCancelled(monitor, false);
                monitor.done();
            }
        }
        return errorCode;
    }

    /**
     * Parses mmp file from the entered path
     * 
     * @param fileLocation
     *            MMP file location with path.
     * @param sbsBuild
     *            Is sbsv2 build system activated
     * @return MMP file name without path. If SBSv2 is not activated the MMP
     *         file is returned without file extension.
     */
    public String getMMPFileName(IPath fileLocation, boolean sbsBuild) {
        // because mmp file contains project related path
        // we need to parse mmp file name
        int index = Util.getLastSlashIndex(fileLocation.toString());
        String mmpFileName = null;
        if (index == -1) {
            // mmp file is incorrect => skip this file
            return mmpFileName;
        }

        // parse mmp file name
        mmpFileName = fileLocation.toString().substring(index + 1, fileLocation.toString().length());

        // if not using the SBS2 builds => needs to remove mmp file name
        // extension
        if (!sbsBuild && mmpFileName.endsWith(".mmp")) {
            mmpFileName = mmpFileName.substring(0, mmpFileName.length() - 4);
        }
        return mmpFileName;
    }

    /**
     * Runs AnalyzeTool build.
     * 
     * @param type
     *            Type of execution. Possible types ATOOL_INST or ATOOL_UNINST
     * @param monitor
     *            Progress monitor reference
     * @param cpi
     *            ICarbideProjectInfo reference
     * @param files
     *            List of user selected mmp files
     * @return True is no errors otherwise False
     */
    protected final boolean runBuild(final String type, final IProgressMonitor monitor,
            final ICarbideProjectInfo cpi, final List<IFile> files) {

        // get preference store
        IPreferenceStore store = Activator.getPreferences();

        // get active logging mode
        String loggingMode = store.getString(Constants.LOGGING_MODE);

        verbose = store.getBoolean(Constants.ATOOL_VERBOSE);

        // possible error code from command line engine
        int errorCode = Constants.COMMAND_LINE_ERROR_CODE.OK.getCode();

        // if logging mode is set to "ask always"
        // ask for user used logging mode
        if (Constants.LOGGING_ASK_ALLWAYS.equals(loggingMode)) {

            String[] outputMode = Util.openOutputModeDialog();

            // user press "Cancel"
            if (outputMode == null) {
                buildCancelled(monitor, true);
                return false;
            }
            // if user selects S60 log file and mode
            // and data file must ask for user
            else if (Constants.LOGGING_S60.equals(outputMode[0])) {
                String logPath = outputMode[1];
                String logFileName = outputMode[2];

                errorCode = executeAtool(logPath, logFileName, type, outputMode[0], files, cpi, monitor);
            } else { // no need to ask data file for the user => just build
                // with
                // user selected logging mode
                errorCode = executeAtool(null, null, type, outputMode[0], files, cpi, monitor);
            }
        }
        // if used logging mode is s60
        // and data file name must ask for the user
        else if (Constants.LOGGING_S60.equals(loggingMode)) {
            String path = store.getString(Constants.DEVICE_LOG_FILE_PATH);
            String fileName = store.getString(Constants.DEVICE_LOG_FILE_NAME);

            errorCode = executeAtool(path, fileName, type, loggingMode, files, cpi, monitor);
        }
        // build with selected mode
        else {
            errorCode = executeAtool(null, null, type, loggingMode, files, cpi, monitor);
        }

        // no errors from command line engine
        if (errorCode == Constants.COMMAND_LINE_ERROR_CODE.OK.getCode()) {
            return true;
        }

        // if some error code is returned from command line engine display it to
        // user and cancel build
        Constants.COMMAND_LINE_ERROR_CODE error = Util.getErrorCode(errorCode);
        Util.displayCommandLineError(error);
        buildCancelled(monitor, false);
        return false;
    }

    /**
     * After the built is finished set preferences back to normal.
     * 
     * @param cpi
     *            ICarbideProjectInfo refernece
     */
    public final void runPostSteps(ICarbideProjectInfo cpi) {

        IPreferenceStore store = Activator.getPreferences();
        boolean keepFilesSync = store.getBoolean(Constants.PREFS_KEEP_IN_SYNC);
        boolean promptMPPChange = store.getBoolean(Constants.PREFS_PROMPT_MMP);
        boolean manageDeps = store.getBoolean(Constants.PREFS_MANAGE_DEPS);
        boolean useConcBuild = store.getBoolean(Constants.PREFS_CONC_BUILD);

        // try to load ProjectUIPlugin class
        try {
            Class.forName("com.nokia.carbide.cpp.project.ui.utils.ProjectUIUtils");

            // no need to keep project files in sync
            // this should fix the mmp selection dialog prompt
            com.nokia.carbide.cpp.project.ui.utils.ProjectUIUtils.setKeepProjectsInSync(keepFilesSync);
        } catch (ClassNotFoundException cnte) {
            // Do nothing by design
        }

        // set builder preference to not prompt mmp file change dialog
        IPreferenceStore cStore = CarbideBuilderPlugin.getDefault().getPreferenceStore();

        // add existing/default values of Carbide builder settings
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT,
                promptMPPChange);
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES,
                manageDeps);
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING,
                useConcBuild);

        // try to remove -debug parameter from the build arguments list
        try {
            // get build configuration
            ICarbideBuildConfiguration config = cpi.getDefaultConfiguration();

            // get build arguments info
            BuildArgumentsInfo info = config.getBuildArgumentsInfoCopy();

            // get used platform
            String platform = config.getPlatformString();

            String debug = "-debug";
            String abldArgs = info.abldBuildArgs;

            // if platform is set to ARMV5 or GCCE
            if (platform.contains(Constants.BUILD_TARGET_ARMV5) || platform.contains(Constants.BUILD_TARGET_GCEE)) {

                // get "-debug" string index
                int index = abldArgs.indexOf(debug);

                // if abld build arguments contains only "-debug" parameter
                if (abldArgs.equals(debug)) {
                    info.abldBuildArgs = "";
                    config.setBuildArgumentsInfo(info);
                }
                // remove just "-debug" word
                else if (abldArgs.contains(debug) && index != -1) {
                    info.abldBuildArgs = abldArgs.substring(0, index)
                            + abldArgs.substring(index + debug.length(), abldArgs.length());
                    config.setBuildArgumentsInfo(info);
                }
            }

        } catch (java.lang.NoSuchMethodError nsme) {
            // Do nothing by design
            // user might run AT with too old Carbide version
        } catch (Exception e) {
            e.printStackTrace();
        }

        // after the build is finished => open the console view
        Util.openConsoleView();
    }

    /**
     * Checks is atool.exe available and modifies Carbide preferences.
     * 
     * @param launcher
     *            Command launcher
     * @param monitor
     *            Progress monitor
     * @param cpi
     *            Carbide project info
     * @return True if all checks are OK, otherwise False
     */
    protected final boolean runPreSteps(final CarbideCommandLauncher launcher, final IProgressMonitor monitor,
            final ICarbideProjectInfo cpi) {

        // set command launchers
        cmdLauncher = launcher;

        // check is atool.exe available
        if (!Util.isAtoolAvailable()) {
            launcher.writeToConsole(Constants.INFO_ATOOL_NOT_AVAILABLE);
            buildCancelled(monitor, false);
            Util.showMessageDialog(Constants.CLE_VERSION_MISMATCH, Constants.ERROR_ATOOL_NOT_AVAILABLE,
                    SWT.ICON_ERROR);

            return false;
        }

        // check supported AnalyzeTool version
        String atoolVersion = Util.getAtoolVersionNumber(Util.getAtoolInstallFolder());
        int compared = Util.compareVersionNumber(atoolVersion, Constants.MIN_CLE_SUPPORTED);
        if (compared == Constants.VERSION_NUMBERS_SECOND || compared == Constants.VERSION_NUMBERS_INVALID) {
            launcher.writeToConsole(
                    MessageFormat.format(Constants.CLE_OLDER_THAN_MIN, Constants.MIN_CLE_SUPPORTED));
            buildCancelled(monitor, false);
            Util.showMessageDialog(Constants.CLE_VERSION_MISMATCH,
                    MessageFormat.format(Constants.CLE_OLDER_THAN_MIN, Constants.MIN_CLE_SUPPORTED),
                    SWT.ICON_ERROR);
            return false;
        }

        /**
         * 
         * Below is code a sample which are related to the AT-682, but it is
         * decided to let out from current release. String coreVersion =
         * Util.getAtoolCoreVersion(cpi.getProject()); compared =
         * Util.compareVersionNumber(coreVersion, atoolVersion); if( compared !=
         * Constants.VERSION_NUMBERS_EQUALS ) { boolean retValue =
         * Util.openConfirmationDialog(
         * "AnalyzeTool command line engine and AnalyzeTool core version mismatch.\n"
         * + "This usually leads to problems.\n\nDo you want to continue?"); if(
         * !retValue ) { buildCancelled(monitor, false); return false; } }
         */
        // remove existing error markers
        try {
            CarbideCPPBuilder.removeAllMarkers(cpi.getProject());
        } catch (CoreException ce) {
            ce.printStackTrace();
            return false;
        }

        // check used platform
        if (!checkPlatform(cpi)) {
            buildCancelled(monitor, Util.openConfirmationDialog(Constants.PLATFORM_NOT_SUPPORTED));
            return false;
        }

        // check AnalyzeTool libraries
        final String libsCheck = Util.checkAtoolLibs(cpi);
        if (!libsCheck.equals(Constants.ATOOL_LIBS_OK)) {
            Util.showMessageDialog(Constants.DIALOG_TITLE, libsCheck, SWT.ICON_ERROR);
            buildCancelled(monitor, false);
            return false;
        }

        // use CarbideCPPBuilder to bldmake bldfiles for selected project
        String[] bldmakeArgs = { "bldfiles" };
        CarbideCPPBuilder.invokeBldmakeCommand(cpi.getDefaultConfiguration(), launcher, bldmakeArgs, true);

        IPreferenceStore store = Activator.getPreferences();

        // try to load ProjectUIPlugin class
        try {
            Class.forName("com.nokia.carbide.cpp.project.ui.ProjectUIPlugin");

            // get keep project files in sync flag
            boolean keepFilesSync = com.nokia.carbide.cpp.project.ui.utils.ProjectUIUtils.keepProjectsInSync();

            store.setValue(Constants.PREFS_KEEP_IN_SYNC, keepFilesSync);

            // no need to keep project files in sync
            // this should fix the mmp selection dialog prompt
            com.nokia.carbide.cpp.project.ui.utils.ProjectUIUtils.setKeepProjectsInSync(false);
        } catch (ClassNotFoundException cnfe) {
            // Do nothing by design
        }

        // set builder preference to not prompt mmp file change dialog
        IPreferenceStore cStore = CarbideBuilderPlugin.getDefault().getPreferenceStore();

        // get existing values
        boolean promptMPPChange = cStore.getBoolean(
                com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT);
        boolean manageDeps = cStore
                .getBoolean(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES);
        boolean useConcBuild = cStore
                .getBoolean(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING);

        // store existing values
        store.setValue(Constants.PREFS_PROMPT_MMP, promptMPPChange);
        store.setValue(Constants.PREFS_MANAGE_DEPS, manageDeps);
        store.setValue(Constants.PREFS_CONC_BUILD, useConcBuild);
        // add custom values for AnalyzeTool build
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT,
                false);
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES, false);
        cStore.setValue(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING,
                false);

        // try to add -debug parameter to the build arguments list
        try {
            // get selected build configuration
            ICarbideBuildConfiguration config = cpi.getDefaultConfiguration();

            // get build arguments info
            BuildArgumentsInfo info = config.getBuildArgumentsInfoCopy();

            // get selected platform
            String platform = cpi.getDefaultConfiguration().getPlatformString();

            // if platform is ARMV5 or GCCE and the "-debug" parameter is not
            // set => we need set the parameter
            if ((platform.contains(Constants.BUILD_TARGET_ARMV5) || platform.contains(Constants.BUILD_TARGET_GCEE))
                    && !info.abldBuildArgs.contains("-debug")) {
                if (info.abldBuildArgs.length() > 0 && !info.abldBuildArgs.endsWith(" ")) {
                    info.abldBuildArgs += " ";
                }
                info.abldBuildArgs += "-debug";
                config.setBuildArgumentsInfo(info);
            }
        }
        // catch NoSuchMethodError because is it possible to use older versions
        // where this method is not available
        catch (java.lang.NoSuchMethodError nsme) {
            // Do nothing by design
        }
        return true;
    }

    /**
     * Executes uninstrument for the project.
     * 
     * @param command
     *            Uninstrument command
     * @param cpi
     *            ICarbideProjectInfo reference
     * @param monitor
     *            IProgressMonitor reference
     */
    public void runUninstrument(String command, ICarbideProjectInfo cpi, IProgressMonitor monitor) {
        cmdLauncher.showCommand(true);
        String[] arguments = new String[1];
        arguments[0] = command;
        int error = cmdLauncher.executeCommand(new Path(Util.getAtoolInstallFolder()), arguments,
                CarbideCPPBuilder.getResolvedEnvVars(cpi.getDefaultConfiguration()), cpi.getINFWorkingDirectory());

        // if some occurs => display it to user
        if (error != Constants.COMMAND_LINE_ERROR_CODE.OK.getCode()) {
            Constants.COMMAND_LINE_ERROR_CODE errorCode = Util.getErrorCode(error);
            Util.displayCommandLineError(errorCode);
        }
    }
}