【问题标题】:How do I programatically add macro definitions and library search paths to an Eclipse CDT project?如何以编程方式将宏定义和库搜索路径添加到 Eclipse CDT 项目?
【发布时间】:2020-06-16 19:19:00
【问题描述】:

我想使用 externalSettingsProvider 扩展点以编程方式将包含路径和宏定义添加到 CDT 项目,并且我一直在努力寻找基础指南,所以这个问题旨在提供。

到目前为止,我已经创建了一个插件项目,在插件 xml 编辑器的扩展选项卡中,我添加了一个扩展,以便 plugin.xml 如下所示:

    <plugin>
       <extension
             id="my_id"
             name="Settings I want in the project"
             point="org.eclipse.cdt.core.externalSettingsProvider">
          <provider
                class="com.example.MySettingsProvider">
          </provider>
       </extension>
    </plugin>

然后我实现提到的类。这是我的实现示例:

    public class MySettingsProvider extends CExternalSettingProvider {
        @Override
        public CExternalSetting[] getSettings(IProject project, ICConfigurationDescription cfg) {
            final ArrayList<ICSettingEntry> allSettings = new ArrayList<ICSettingEntry>();

            CMacroEntry myMacro = CDataUtil.createCMacroEntry("WINE_CHOICE", "WHITE", ICSettingEntry.NONE);
            allSettings.add( myMacro );

            CIncludePathEntry myInclude = CDataUtil.createCIncludePathEntry("path/to/include", ICSettingEntry.NONE);
            allSettings.add( myInclude );

            final ICSettingEntry[] settings = allSettings.toArray(new ICSettingEntry[allSettings.size()]);
            return new CExternalSetting[]{new CExternalSetting(null, null, null, settings)};
        }
    }

这可能不是最好的方法 - 我愿意接受改进的反馈 - 但我认为它应该会导致一些设置可以添加到 CDT 项目中。

这是我摔倒的地方 - getSettings 永远不会被调用。我可以创建一个新的 CDT 项目,添加源文件并构建它们,但是如果我在 getSettings 方法中放置一个断点,它永远不会被命中。也许我需要在某个地方注册我的提供商?我发现的现有网站都没有告诉你如何克服这一点。

【问题讨论】:

    标签: eclipse eclipse-cdt


    【解决方案1】:

    对我来说,这可以让 getSettings 被调用:

    final IProject project = getTheProjectYouWantToContributeTo();
    final ICProjectDescription projectDescription = CoreModel.getDefault().getProjectDescription(project);
    final ICConfigurationDescription[] cfgDes = projectDescription.getConfigurations();
    for ( final ICConfigurationDescription cfgDe : cfgDes ) {
        String[] idArray = cfgDe.getExternalSettingsProviderIds();
        ArrayList<String> idList = new ArrayList<String>(Arrays.asList( idArray ));
        boolean idAlreadyPresent = idList.contains( MySettingsProvider.ID );
        if (!idAlreadyPresent ) {
            idList.add( MySettingsProvider.ID );
        }
        idArray = idList.toArray( new String[idList.size()]
        cfgDe.setExternalSettingsProviderIds(idArray);
    }
    

    你应该什么时候调用它,你应该如何将它连接到项目生命周期中?我不知道...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2010-10-01
      相关资源
      最近更新 更多