Программная настройка проекта CDT - PullRequest
0 голосов
/ 31 октября 2018

Я создал плагин Eclipse с новым типом проекта, создание этого типа проекта также добавляет природу C / C ++ из CDT. Теперь я хочу предоставить конфигурацию по умолчанию для этого типа проекта, в частности, я хочу, чтобы он был настроен на использование типа сборки CMake4Eclipse.

Мне нужно установить:

  1. текущий набор инструментов
  2. текущий строитель
  3. Переопределение ОС CMake
  4. Исходное местоположение
  5. Окружающая среда

Ни одному из них я не смог понять, как их установить программно. Решение, где у меня есть статическая конфигурация по умолчанию, является приемлемым.

1 Ответ

0 голосов
/ 31 октября 2018

Шаг 1. и 2. (настройка toolchain & builder) Я успешно справился со следующим кодом:

// 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);
  }
...