RTSDK: change build process to async
authorgyeongmin.ju <gyeongmin.ju@samsung.com>
Wed, 31 May 2017 06:31:51 +0000 (15:31 +0900)
committergyeongmin.ju <gyeongmin.ju@samsung.com>
Wed, 31 May 2017 08:07:32 +0000 (17:07 +0900)
change build process to async

Change-Id: I1646534b4d7e461e63f59fa3fd8ad8aed20c0b6a
Signed-off-by: gyeongmin.ju <gyeongmin.ju@samsung.com>
rt-ide/tizen.rt.product.plugin/plugin.xml
rt-ide/tizen.rt.product.plugin/plugin_customization.ini
rt-ide/tizen.rt.product.plugin/src/org/tizen/rt/ide/build/BuildWizard.java
rt-ide/tizen.rt.product.plugin/src/org/tizen/rt/ide/builder/RtBuilder.java [new file with mode: 0644]
rt-ide/tizen.rt.product.plugin/src/org/tizen/rt/ide/commands/BuildCommand.java
rt-ide/tizen.rt.product.plugin/src/org/tizen/rt/product/RtProjectNature.java

index c01511c..970fe1e 100644 (file)
@@ -11,7 +11,7 @@
       </category>
       
       <command
-            name="Build"
+            name="Configure and Build Project"
             categoryId="rtosBuild.commands.category"
             id="rtosBuild.commands.buildCommand">
       </command>
                class="org.tizen.rt.product.RtProjectNature">
          </run>
       </runtime>
+      <builder
+            id="org.tizen.rt.ide.builder.RtBuilder">
+      </builder>
       <requires-nature
             id="org.eclipse.cdt.core.cnature">
       </requires-nature>
     <!-- Make Target -->
     <activityPatternBinding activityId="org.tizen.rt.activity.native.project" isEqualityPattern="true" pattern="org.eclipse.cdt.make.ui/org.eclipse.cdt.make.ui.CViewCreateTargetAction"/>
     <activityPatternBinding activityId="org.tizen.rt.activity.native.project" isEqualityPattern="true" pattern="org.eclipse.cdt.make.ui/org.eclipse.cdt.make.ui.NavigatorBuildLastTargetAction"/>
-    <activityPatternBinding activityId="org.tizen.rt.activity.native.project" isEqualityPattern="true" pattern="org.eclipse.cdt.make.ui/org.eclipse.cdt.make.ui.NavigatorBuildTargetAction"/>
-    <!-- Convert To -->
-    <activityPatternBinding activityId="org.tizen.rt.activity.native.project" isEqualityPattern="true" pattern="org.eclipse.cdt.managedbuilder.ui/org.eclipse.cdt.managedbuilder.ui.ConvertTargetAction"/>
+    <activityPatternBinding
+          activityId="org.tizen.rt.activity.native.project"
+          isEqualityPattern="true"
+          pattern="org.eclipse.cdt.make.ui/org.eclipse.cdt.make.ui.NavigatorBuildTargetAction">
+    </activityPatternBinding>agedbuilder.ui.ConvertTargetAction"/>
     <!-- Configure popup -->
     <activityPatternBinding activityId="org.tizen.rt.activity.common.project" isEqualityPattern="true" pattern="org.eclipse.wst.jsdt.ui/org.eclipse.wst.jsdt.internal.web.ui.convertProjects"/>
     <activityPatternBinding activityId="org.tizen.rt.activity.common.project" isEqualityPattern="true" pattern="org.eclipse.pde.ui/org.eclipse.pde.ui.ConvertedProjectWizard"/>
     <activityPatternBinding activityId="org.tizen.rt.activity.common" isEqualityPattern="true" pattern="org.eclipse.ui.externaltools/org.eclipse.ui.externaltools.ExternalToolMenuDelegateToolbar"/>
     <!-- Project menu -->
     <activityPatternBinding activityId="org.tizen.rt.activity.common" isEqualityPattern="true" pattern="org.eclipse.ui.project.buildAll"/>
-    <activityPatternBinding activityId="org.tizen.rt.activity.common" isEqualityPattern="true" pattern="org.eclipse.ui.project.buildProject"/>
     <activityPatternBinding activityId="org.tizen.rt.activity.common" isEqualityPattern="false" pattern="Build &amp;Working Set"/><!-- not working because menu id is null -->
     <activityPatternBinding activityId="org.tizen.rt.activity.common" isEqualityPattern="true" pattern="org.eclipse.ui.project.cleanAction"/>
     <activityPatternBinding activityId="org.tizen.rt.activity.common" isEqualityPattern="true" pattern="org.eclipse.ui.project.buildAutomatically"/>
   </extension>
+  <extension
+        id="org.tizen.rt.ide.builder.RtBuilder"
+        name="RtBuilder"
+        point="org.eclipse.core.resources.builders">
+     <builder
+           hasNature="true">
+        <run
+              class="org.tizen.rt.ide.builder.RtBuilder">
+        </run>
+     </builder>
+  </extension>
   <!-- temporary disabled debug in 1.2 release
   <extension
         point="org.eclipse.debug.ui.launchShortcuts">
index 899a8be..e194e40 100644 (file)
@@ -1,7 +1,7 @@
 # eclipse Workbench related preferences
 #org.eclipse.ui.ide/SAVE_ALL_BEFORE_BUILD=true
 #org.eclipse.core.resources/refresh.enabled=true
-#org.eclipse.core.resources/description.autobuilding=true
+org.eclipse.core.resources/description.autobuilding=false
 org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = true
 org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
 org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
index 74380b6..6e58b33 100644 (file)
 
 package org.tizen.rt.ide.build;
 
-import java.lang.reflect.InvocationTargetException;
-
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.dialogs.IPageChangedListener;
 import org.eclipse.jface.dialogs.PageChangedEvent;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.IWizardContainer;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.widgets.Shell;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.tizen.rt.ide.Messages;
-import org.tizen.rt.ide.commands.CommandManager;
-import org.tizen.rt.ide.console.ConsoleManager;
+import org.tizen.rt.ide.builder.RtBuilder;
 
 /**
  * RtosWizard
@@ -53,12 +43,10 @@ import org.tizen.rt.ide.console.ConsoleManager;
  */
 public class BuildWizard extends Wizard implements IPageChangedListener {
 
-    private ConsoleManager consoleManager;
     private Shell shell;
     private IProject project;
     private final String GUIDE_DIALOG_NAME = "Build Option Selection"; //$NON-NLS-1$
     private BuildWizardPage wizardPage = null;
-    private final Logger logger = LoggerFactory.getLogger(BuildWizard.class);
 
     public BuildWizard(Shell shell, IProject project) {
         super();
@@ -66,40 +54,12 @@ public class BuildWizard extends Wizard implements IPageChangedListener {
         this.setNeedsProgressMonitor(true);
         this.shell = shell;
         this.project = project;
-        this.consoleManager = new ConsoleManager(true);
     }
 
     @Override
     public boolean performFinish() {
-        IWizardContainer container = getContainer();
-        try {
-            container.run(true, false, new IRunnableWithProgress() {
-                @Override
-                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-                    // String selectedDeviceName =
-                    monitor.beginTask("Build", 4); //$NON-NLS-1$
-                    BuildOption buildOption = BuildWizardDialog.getSelectionOption();
-                    consoleManager.println("Build Option : " + buildOption.getBuildOption()); //$NON-NLS-1$
-                    monitor.worked(1);
-
-                    String toolchainPath = BuildWizardDialog.getSelectionToolchain();
-                    monitor.worked(1);
-
-                    CommandManager.runBuild(project, buildOption, toolchainPath, consoleManager, monitor);
-                    try {
-                        project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-                    } catch (CoreException e) {
-                        logger.error(e.getMessage(), e);
-                    }
+        RtBuilder.scheduleRebuild(project);
 
-                    monitor.done();
-                }
-            });
-        } catch (InvocationTargetException e) {
-            logger.error(e.getMessage(), e);
-        } catch (InterruptedException e) {
-            logger.error(e.getMessage(), e);
-        }
         return true;
     }
 
diff --git a/rt-ide/tizen.rt.product.plugin/src/org/tizen/rt/ide/builder/RtBuilder.java b/rt-ide/tizen.rt.product.plugin/src/org/tizen/rt/ide/builder/RtBuilder.java
new file mode 100644 (file)
index 0000000..ad5c75c
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+*  Common
+*
+* Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
+*
+* Contact:
+* jm.jemin.kim <jm.jemin.kim@samsung.com>
+* Gyeongmin Ju <gyeongmin.ju@samsung.com>
+* Daeryong Park <bdragon.park@samsung.com>
+* Hyeongseok Heo <harry.heo@samsung.com>
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+* Contributors:
+* - S-Core Co., Ltd
+*
+*/
+package org.tizen.rt.ide.builder;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tizen.rt.ide.build.BuildOption;
+import org.tizen.rt.ide.build.BuildWizardDialog;
+import org.tizen.rt.ide.commands.CommandManager;
+import org.tizen.rt.ide.console.ConsoleManager;
+
+/**
+ * RtBuilder
+ * @author gyeongmin.ju{@literal <gyeongmin.ju>} (S-Core)
+ */
+public class RtBuilder extends IncrementalProjectBuilder {
+
+    public static String BUILDER_ID = "org.tizen.rt.ide.builder.RtBuilder";
+
+    private final Logger logger = LoggerFactory.getLogger(RtBuilder.class);
+
+    public RtBuilder() {
+    }
+
+    @Override
+    protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException {
+        IProject project = getProject();
+
+        String toolchainPath = BuildWizardDialog.getSelectionToolchain();
+        BuildOption buildOption = BuildWizardDialog.getSelectionOption();
+
+        ConsoleManager consoleManager = new ConsoleManager(true);
+
+        boolean result = CommandManager.runBuild(project, buildOption, toolchainPath, consoleManager, monitor);
+        try {
+            project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+        } catch (CoreException e) {
+            logger.error(e.getMessage(), e);
+        }
+
+        forgetLastBuiltState();
+
+        if (result) {
+            return new IProject[] { project };
+        } else {
+            return null;
+        }
+    }
+
+    public static void addBuilderToProject(IProject fProject) throws CoreException {
+        IProjectDescription desc = fProject.getDescription();
+        ICommand[] commands = desc.getBuildSpec();
+        for (int i = 0; i < commands.length; i++) {
+            if (commands[i].getBuilderName().equals(BUILDER_ID)) {
+                return;
+            }
+        }
+
+        ICommand command = desc.newCommand();
+        command.setBuilderName(BUILDER_ID);
+
+        ICommand[] newCommands = new ICommand[commands.length + 1];
+        System.arraycopy(commands, 0, newCommands, 1, commands.length);
+        newCommands[0] = command;
+        desc.setBuildSpec(newCommands);
+
+        fProject.setDescription(desc, null);
+    }
+
+    public static void removeBuilderFromProject(IProject fProject) throws CoreException {
+        IProjectDescription description = fProject.getDescription();
+        List<ICommand> builders = new ArrayList<ICommand>(
+                Arrays.asList(description.getBuildSpec()));
+
+        Iterator<ICommand> iter = builders.iterator();
+        while (iter.hasNext()) {
+            ICommand curBuilder = iter.next();
+            if (curBuilder.getBuilderName().equals(BUILDER_ID)) {
+                iter.remove();
+            }
+        }
+
+        description.setBuildSpec(builders.toArray(new ICommand[builders
+                .size()]));
+        fProject.setDescription(description, null);
+    }
+
+    public static void scheduleRebuild(final IProject project) {
+        WorkspaceJob buildJob = new WorkspaceJob("Building " + project.getName()) {
+            @Override
+            public boolean belongsTo(Object family) {
+                return ResourcesPlugin.FAMILY_MANUAL_BUILD.equals(family);
+            }
+
+            @Override
+            public IStatus runInWorkspace(IProgressMonitor monitor)
+                    throws CoreException {
+                project.build(IncrementalProjectBuilder.FULL_BUILD, monitor);
+                return Status.OK_STATUS;
+            }
+        };
+
+        buildJob.setRule(ResourcesPlugin.getWorkspace().getRuleFactory().buildRule());
+        buildJob.setUser(true);
+        buildJob.schedule();
+    }
+}
index 777d12a..facbccb 100644 (file)
@@ -187,6 +187,14 @@ public class BuildCommand extends AbstractCommand {
 
     protected int execute(IProject project, BuildOption buildOption, String toolchainPath, ConsoleManager consoleManager,
             IProgressMonitor monitor) {
+        if (buildOption == null) {
+            consoleManager.println("Build option not selected."); //$NON-NLS-1$
+            consoleManager.println("Execute configure before the build operation."); //$NON-NLS-1$
+            return 1;
+        }
+
+        consoleManager.println("Build Option : " + buildOption.getBuildOption()); //$NON-NLS-1$
+
         String activeProjectPath = project.getLocation().toString();
 
         String sdkPath = SDKUtil.getSdkPath();
@@ -196,7 +204,8 @@ public class BuildCommand extends AbstractCommand {
 
         File buildScriptFile = new File(boardPath, getScriptFileName());
         if (!buildScriptFile.exists()) {
-            buildScriptFile = new File(sdkPath, "rt-ide" + File.separator + "resources" + File.separator + "scripts" + File.separator + getScriptFileName());
+            buildScriptFile = new File(sdkPath, "rt-ide" + File.separator + "resources" + File.separator +
+                    "scripts" + File.separator + getScriptFileName());
             if (!buildScriptFile.exists()) {
                 consoleManager.println("Can not found xml file of build spec."); //$NON-NLS-1$
                 return 1;
@@ -260,7 +269,6 @@ public class BuildCommand extends AbstractCommand {
         }
 
         return result;
-
     }
 
     /*
index b0de4f0..6b25474 100644 (file)
@@ -42,6 +42,7 @@ import org.eclipse.core.runtime.NullProgressMonitor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.tizen.rt.ide.Activator;
+import org.tizen.rt.ide.builder.RtBuilder;
 
 public class RtProjectNature implements IProjectNature {
 
@@ -129,6 +130,7 @@ public class RtProjectNature implements IProjectNature {
      */
     @Override
     public void configure() throws CoreException {
+        RtBuilder.addBuilderToProject(fProject);
     }
 
     /*
@@ -137,6 +139,7 @@ public class RtProjectNature implements IProjectNature {
      */
     @Override
     public void deconfigure() throws CoreException {
+        RtBuilder.removeBuilderFromProject(fProject);
     }
 
     /*