以编程方式配置 CDT 项目
Programmatically configuring CDT project
我创建了一个具有新项目类型的 Eclipse 插件,创建该项目类型还添加了 CDT 中的 C/C++ 特性。现在我想为该项目类型提供默认配置,特别是我希望将其配置为使用 CMake4Eclipse 构建类型。
我需要设置:
- 当前工具链
- 当前建造者
- CMake 主机OS 覆盖
- 源位置
- 环境
对于这些,我都无法弄清楚如何以编程方式设置它们。我有一个静态默认配置的解决方案是可以接受的。
第 1 步和第 2 步(设置工具链和构建器)我使用以下代码成功管理:
// convert to C/C++ project
CCorePlugin ccore = CCorePlugin.getDefault();
ccore.convertProjectToNewC(project, ManagedBuildManager.CFG_DATA_PROVIDER_ID, monitor);
CCorePlugin.getDefault().convertProjectFromCtoCC(project, monitor);
// get toolchain and cmake builder
IBuilder cmakeBuilder = ManagedBuildManager.getExtensionBuilder("de.marw.cdt.cmake.core.genscriptbuilder");
IToolChain toolChain = ManagedBuildManager.getExtensionToolChain("cdt.managedbuild.toolchain.gnu.base");
// arcane incantations based on org.eclipse.cdt.managedbuilder.ui.wizards.NewMakeProjFromExisting.performFinish()
ICProjectDescriptionManager pdMgr = CoreModel.getDefault().getProjectDescriptionManager();
ICProjectDescription projDesc = pdMgr.createProjectDescription(project, false);
ManagedBuildInfo info = ManagedBuildManager.createBuildInfo(project);
ManagedProject mProj = new ManagedProject(projDesc);
info.setManagedProject(mProj);
CfgHolder cfgHolder = new CfgHolder(toolChain, null);
IConfiguration config = new Configuration(mProj, (ToolChain) toolChain,
ManagedBuildManager.calculateChildId(toolChain.getId(), null), cfgHolder.getName());
// set cmake builder
config.changeBuilder(cmakeBuilder, ManagedBuildManager.calculateChildId(config.getId(), null),
cmakeBuilder.getName());
// make sure makefile generation is enabled
config.setManagedBuildOn(true);
CConfigurationData data = config.getConfigurationData();
projDesc.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, data);
pdMgr.setProjectDescription(project, projDesc);
第 3 步(cmake 配置)无法开箱即用,cmake4eclipse 插件不会导出更改其设置所需的 API。所以我创建了一个导入和导出必要包的片段。然后就可以直接使用上面的代码进行配置:
ICConfigurationDescription desc = projDesc.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, data);
CMakePreferences cmakePref = ConfigurationManager.getInstance().getOrCreate(desc);
cmakePref.getWindowsPreferences().setGenerator(CmakeGenerator.NMakeMakefiles);
cmakePref.getDefines().add(new CmakeDefine("CMAKE_BUILD_TYPE",CmakeVariableType.STRING,"Release"));
第 4 步(设置源文件夹)如下所示:
private void setAsSourceFolder(IResource folder, IProject project) throws CoreException {
ICSourceEntry newEntry = new CSourceEntry(folder.getProjectRelativePath(), null, 0);
ICProjectDescription des = CCorePlugin.getDefault().getProjectDescription(project, true);
ICConfigurationDescription[] cfgs = des.getConfigurations();
for (ICConfigurationDescription cfg : cfgs) {
cfg.setSourceEntries(new ICSourceEntry[] { newEntry });
}
CCorePlugin.getDefault().setProjectDescription(project, des);
}
我创建了一个具有新项目类型的 Eclipse 插件,创建该项目类型还添加了 CDT 中的 C/C++ 特性。现在我想为该项目类型提供默认配置,特别是我希望将其配置为使用 CMake4Eclipse 构建类型。
我需要设置:
- 当前工具链
- 当前建造者
- CMake 主机OS 覆盖
- 源位置
- 环境
对于这些,我都无法弄清楚如何以编程方式设置它们。我有一个静态默认配置的解决方案是可以接受的。
第 1 步和第 2 步(设置工具链和构建器)我使用以下代码成功管理:
// convert to C/C++ project
CCorePlugin ccore = CCorePlugin.getDefault();
ccore.convertProjectToNewC(project, ManagedBuildManager.CFG_DATA_PROVIDER_ID, monitor);
CCorePlugin.getDefault().convertProjectFromCtoCC(project, monitor);
// get toolchain and cmake builder
IBuilder cmakeBuilder = ManagedBuildManager.getExtensionBuilder("de.marw.cdt.cmake.core.genscriptbuilder");
IToolChain toolChain = ManagedBuildManager.getExtensionToolChain("cdt.managedbuild.toolchain.gnu.base");
// arcane incantations based on org.eclipse.cdt.managedbuilder.ui.wizards.NewMakeProjFromExisting.performFinish()
ICProjectDescriptionManager pdMgr = CoreModel.getDefault().getProjectDescriptionManager();
ICProjectDescription projDesc = pdMgr.createProjectDescription(project, false);
ManagedBuildInfo info = ManagedBuildManager.createBuildInfo(project);
ManagedProject mProj = new ManagedProject(projDesc);
info.setManagedProject(mProj);
CfgHolder cfgHolder = new CfgHolder(toolChain, null);
IConfiguration config = new Configuration(mProj, (ToolChain) toolChain,
ManagedBuildManager.calculateChildId(toolChain.getId(), null), cfgHolder.getName());
// set cmake builder
config.changeBuilder(cmakeBuilder, ManagedBuildManager.calculateChildId(config.getId(), null),
cmakeBuilder.getName());
// make sure makefile generation is enabled
config.setManagedBuildOn(true);
CConfigurationData data = config.getConfigurationData();
projDesc.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, data);
pdMgr.setProjectDescription(project, projDesc);
第 3 步(cmake 配置)无法开箱即用,cmake4eclipse 插件不会导出更改其设置所需的 API。所以我创建了一个导入和导出必要包的片段。然后就可以直接使用上面的代码进行配置:
ICConfigurationDescription desc = projDesc.createConfiguration(ManagedBuildManager.CFG_DATA_PROVIDER_ID, data);
CMakePreferences cmakePref = ConfigurationManager.getInstance().getOrCreate(desc);
cmakePref.getWindowsPreferences().setGenerator(CmakeGenerator.NMakeMakefiles);
cmakePref.getDefines().add(new CmakeDefine("CMAKE_BUILD_TYPE",CmakeVariableType.STRING,"Release"));
第 4 步(设置源文件夹)如下所示:
private void setAsSourceFolder(IResource folder, IProject project) throws CoreException {
ICSourceEntry newEntry = new CSourceEntry(folder.getProjectRelativePath(), null, 0);
ICProjectDescription des = CCorePlugin.getDefault().getProjectDescription(project, true);
ICConfigurationDescription[] cfgs = des.getConfigurations();
for (ICConfigurationDescription cfg : cfgs) {
cfg.setSourceEntries(new ICSourceEntry[] { newEntry });
}
CCorePlugin.getDefault().setProjectDescription(project, des);
}