[yocto] [RFC 3/6] plugins/sdk.ide: Enable the creation of CMake projects
Atanas Gegov
atanas.gegov.oss at gmail.com
Mon Apr 22 05:06:00 PDT 2013
From: Atanas Gegov <atanas.gegov at bmw-carit.de>
This enables creating projects with the introduced
CMake nature. What is still upcoming are the
template projects and a corresponfig CMake
ManagedBuilder (CMake build toolchain for
Eclipse).
---
.../ide/natures/YoctoSDKCMakeProjectNature.java | 72 ++++++++++++++++++++
.../sdk/ide/wizard/NewYoctoCProjectTemplate.java | 12 ++--
2 files changed, 80 insertions(+), 4 deletions(-)
diff --git a/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/natures/YoctoSDKCMakeProjectNature.java b/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/natures/YoctoSDKCMakeProjectNature.java
index 86a9d45..b3d0f2c 100644
--- a/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/natures/YoctoSDKCMakeProjectNature.java
+++ b/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/natures/YoctoSDKCMakeProjectNature.java
@@ -10,11 +10,83 @@
*******************************************************************************/
package org.yocto.sdk.ide.natures;
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.envvar.IContributedEnvironment;
+import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
+import org.eclipse.cdt.core.envvar.IEnvironmentVariableManager;
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
+import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.yocto.sdk.ide.YoctoSDKPlugin;
+import org.yocto.sdk.ide.utils.YoctoSDKUtils;
public class YoctoSDKCMakeProjectNature extends YoctoSDKProjectNature {
public static final String YoctoSDK_CMAKE_NATURE_ID = YoctoSDKPlugin.getUniqueIdentifier() + ".YoctoSDKCMakeNature";
+ // Considered poky's cmake.bbclass for this method
+ public static void extendProjectEnvironmentForCMake(IProject project) {
+ ICProjectDescription cpdesc = CoreModel.getDefault().getProjectDescription(project, true);
+ ICConfigurationDescription ccdesc = cpdesc.getActiveConfiguration();
+ IEnvironmentVariableManager manager = CCorePlugin.getDefault().getBuildEnvironmentManager();
+ IContributedEnvironment env = manager.getContributedEnvironment();
+ String delimiter = manager.getDefaultDelimiter();
+
+ env.addVariable("CCACHE", "", IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+
+ env.addVariable("OECMAKE_SOURCEPATH", "..",
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+
+ String oecmakeBuildPathString = "";
+ env.addVariable("OECMAKE_BUILDPATH", oecmakeBuildPathString,
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+ env.addVariable("EXTRA_OEMAKE", "-C " + oecmakeBuildPathString,
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+
+ String ccString = YoctoSDKUtils.getEnvValue(project, "CC");
+
+ if (!ccString.equals("") && !ccString.equals(" ")) {
+ ccString.trim();
+ ccString = ccString.split(" ")[0];
+ }
+
+ env.addVariable("OECMAKE_C_COMPILER", ccString,
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+ String cxxString = YoctoSDKUtils.getEnvValue(project, "CXX");
+
+ if (!cxxString.equals("") && !cxxString.equals(" ")) {
+ cxxString.trim();
+ cxxString = cxxString.split(" ")[0];
+ }
+
+ env.addVariable("OECMAKE_CXX_COMPILER", cxxString,
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+
+ String hostCCArchString = YoctoSDKUtils.getEnvValue(project, "HOST_CC_ARCH");
+ String toolchainOptionsString = YoctoSDKUtils.getEnvValue(project, "TOOLCHAIN_OPTIONS");
+ String cppFlagsString = YoctoSDKUtils.getEnvValue(project, "CPPFLAGS");
+ String cxxFlagsString = YoctoSDKUtils.getEnvValue(project, "CXXFLAGS");
+ String selectedOptimizationString = YoctoSDKUtils.getEnvValue(project, "SELECTED_OPTIMIZATION");
+ env.addVariable("OECMAKE_C_FLAGS", hostCCArchString + " " + toolchainOptionsString + " " + cppFlagsString,
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+ env.addVariable("OECMAKE_CXX_FLAGS", hostCCArchString + " " + toolchainOptionsString + " " + cxxFlagsString
+ + " -fpermissive",
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+ env.addVariable("OECMAKE_C_FLAGS_RELEASE", selectedOptimizationString + " " + cppFlagsString + " -DNDEBUG",
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+ env.addVariable("OECMAKE_CXX_FLAGS_RELEASE", selectedOptimizationString + " " + cxxFlagsString + " -DNDEBUG",
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+
+ env.addVariable("OECMAKE_RPATH", "",
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+ env.addVariable("OECMAKE_PERLNATIVE_DIR", "",
+ IEnvironmentVariable.ENVVAR_REPLACE, delimiter, ccdesc);
+
+ try {
+ CoreModel.getDefault().setProjectDescription(project, cpdesc);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/wizard/NewYoctoCProjectTemplate.java b/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/wizard/NewYoctoCProjectTemplate.java
index 705dc99..dc9bca5 100644
--- a/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/wizard/NewYoctoCProjectTemplate.java
+++ b/plugins/org.yocto.sdk.ide/src/org/yocto/sdk/ide/wizard/NewYoctoCProjectTemplate.java
@@ -56,6 +56,7 @@ import org.yocto.sdk.ide.YoctoSDKMessages;
import org.yocto.sdk.ide.YoctoSDKPlugin;
import org.yocto.sdk.ide.YoctoUIElement;
import org.yocto.sdk.ide.natures.YoctoSDKAutotoolsProjectNature;
+import org.yocto.sdk.ide.natures.YoctoSDKCMakeProjectNature;
import org.yocto.sdk.ide.natures.YoctoSDKEmptyProjectNature;
import org.yocto.sdk.ide.natures.YoctoSDKNatureUtils;
import org.yocto.sdk.ide.natures.YoctoSDKProjectNature;
@@ -129,7 +130,7 @@ public class NewYoctoCProjectTemplate extends ProcessRunner {
pca.setArtifactExtension(artifactExtension);
info = pca.createProject(monitor, CCorePlugin.DEFAULT_INDEXER, isCProject);
- addNatures(project, false, isEmptyProject, isAutotoolsProject, monitor);
+ addNatures(project, false, isEmptyProject, isAutotoolsProject, isCMakeProject, monitor);
info.setValid(true);
ManagedBuildManager.saveBuildInfo(project, true);
@@ -142,7 +143,7 @@ public class NewYoctoCProjectTemplate extends ProcessRunner {
YoctoSDKChecker.checkIfGloballySelectedYoctoProfileIsValid();
- addNatures(project, true, isEmptyProject, isAutotoolsProject, monitor);
+ addNatures(project, true, isEmptyProject, isAutotoolsProject, isCMakeProject, monitor);
//restoreAutoBuild(workspace);
IDiscoveredPathManager manager = MakeCorePlugin.getDefault().getDiscoveryManager();
@@ -181,7 +182,7 @@ public class NewYoctoCProjectTemplate extends ProcessRunner {
}
private void addNatures(IProject project, boolean projectExists, boolean isEmptyProject,
- boolean isAutotoolsProject, IProgressMonitor monitor)
+ boolean isAutotoolsProject, boolean isCMakeProject, IProgressMonitor monitor)
throws CoreException, YoctoGeneralException {
YoctoSDKNatureUtils.addNature(project, YoctoSDKProjectNature.YoctoSDK_NATURE_ID, monitor);
@@ -201,7 +202,7 @@ public class NewYoctoCProjectTemplate extends ProcessRunner {
if (isAutotoolsProject) {
AutotoolsNewProjectNature.addAutotoolsNature(project, monitor);
- if(!projectExists) {
+ if (!projectExists) {
// For each IConfiguration, create a corresponding Autotools Configuration
for (IConfiguration cfg : pca.getConfigs()) {
AutotoolsConfigurationManager.getInstance().getConfiguration(project, cfg.getName(), true);
@@ -211,6 +212,9 @@ public class NewYoctoCProjectTemplate extends ProcessRunner {
YoctoSDKNatureUtils.addNature(project, YoctoSDKAutotoolsProjectNature.YoctoSDK_AUTOTOOLS_NATURE_ID, monitor);
YoctoSDKAutotoolsProjectNature.configureAutotoolsOptions(project);
+ } else if (isCMakeProject) {
+ YoctoSDKNatureUtils.addNature(project, YoctoSDKCMakeProjectNature.YoctoSDK_CMAKE_NATURE_ID, monitor);
+ YoctoSDKCMakeProjectNature.extendProjectEnvironmentForCMake(project);
}
}
--
1.7.9.5
More information about the yocto
mailing list