Java 如何以编程方式更改文件的Eclipse CDT工具设置?

Java 如何以编程方式更改文件的Eclipse CDT工具设置?,java,eclipse,plugins,eclipse-cdt,Java,Eclipse,Plugins,Eclipse Cdt,我想以编程方式(从插件)更改CDT托管构建项目中单个文件的“工具设置”选项卡中杂项设置中的“其他标志”字段。(有关如何使用UI进行此更改的屏幕截图和简要说明,请参阅。) 注意:当我接近解决方案时,我已经更新了两次。但是,我没有在末尾添加更新(就像我对较短问题所做的那样),而是修改了整个问题。如果有助于看到面包屑指向我现在的位置,你可以阅读历史 下面的代码将导致将设置写入.cproject文件(我将在下面详细介绍),但当我打开文件的属性对话框,单击C/C++Build->settings,然后单击

我想以编程方式(从插件)更改CDT托管构建项目中单个文件的“工具设置”选项卡中杂项设置中的“其他标志”字段。(有关如何使用UI进行此更改的屏幕截图和简要说明,请参阅。)

注意:当我接近解决方案时,我已经更新了两次。但是,我没有在末尾添加更新(就像我对较短问题所做的那样),而是修改了整个问题。如果有助于看到面包屑指向我现在的位置,你可以阅读历史

下面的代码将导致将设置写入.cproject文件(我将在下面详细介绍),但当我打开文件的属性对话框,单击C/C++Build->settings,然后单击Miscellaneous时,更改不会显示在“其他标志”字段中(就像我使用对话框进行更改时一样)

我查看了手动更改工具设置的.cproject文件与运行上述代码后另一个.cproject文件之间的差异。下面是每种方法的相关位

以下是手动更改工具设置的.cproject文件中的XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
    <storageModule moduleId="org.eclipse.cdt.core.settings">
        <cconfiguration id="com.company.product.toolchain.configuration.changed.1964078554">
...
            <storageModule moduleId="cdtBuildSystem" version="4.0.0">
                <configuration artifactName="${ProjName}" buildProperties="" cleanCommand="rm -f" description="" id="com.company.product.toolchain.configuration.changed.1964078554" name="changed" parent="com.company.product.toolchain.configuration.changed">
...
                    <fileInfo id="com.company.product.toolchain.configuration.changed.1964078554.915152327" name="code.cpp" rcbsApplicability="disable" resourcePath="src/code.cpp" toolsToInvoke="com.company.product.toolchain.compiler.1643348654.1411455203">
                        <tool id="com.company.product.toolchain.compiler.1643348654.1411455203" name="Company GNU compilers" superClass="com.company.product.toolchain.compiler.1643348654">
                            <option id="company.gnu.compiler.misc.other.789167779" name="Other flags" superClass="company.gnu.compiler.misc.other" value="-c -fmessage-length=0 -eg" valueType="string"/>
                            <inputType id="com.company.product.toolchain.cxxinputtype.877052163" name="C++ Input" superClass="com.company.product.toolchain.cxxinputtype"/>
                            <inputType id="com.company.product.toolchain.cinputtype.1390394900" name="C input" superClass="com.company.product.toolchain.cinputtype"/>
                        </tool>
                    </fileInfo>
...
…这导致fileInfo元素没有项目名称:

<fileInfo id="com.company.product.toolchain.configuration.changed.838214286.src/code.cpp" name="code.cpp" rcbsApplicability="disable" resourcePath="src/code.cpp" toolsToInvoke="com.company.product.toolchain.compiler.2027651356.1970239371">


…最重要的是,导致编程更改显示在单个文件的“工具设置”选项卡的“杂项设置”中的“其他标志”字段中。(我想.cproject文件中的其他差异并不重要。)

通常,您可以为不同的对象设置一个选项,即配置(如果希望该选项应用于配置中给定类型的所有文件)或资源(如果希望该选项仅应用于文件夹中的文件或单个文件)

setOption()有多个原型;看起来您使用了应用于文件资源的

在我的GNU ARM Eclipse插件中,我成功地使用了另一个版本:

setOption(IConfiguration config, IHoldsOptions holder, IOption option, String value)
您可以在第583行中看到一个示例


我想这也适用于您的情况。

我怀疑您在创建iFleiInfo时可能存在问题。下面是用于获取翻译单元的IResourceInfo以设置每个文件选项的代码:

protected IResourceInfo getResourceInfo(ITranslationUnit translationUnit, ICProjectDescription prjDescription) {

    ICProject cProject = translationUnit.getCProject();
    if (cProject != null) {
        ICConfigurationDescription cfgDescription = prjDescription.getActiveConfiguration();
        IConfiguration configuration = ManagedBuildManager.getConfigurationForDescription(cfgDescription);
        IPath projectPath = translationUnit.getResource().getProjectRelativePath(); 
        IResourceInfo ri = configuration.getResourceInfo(projectPath, true);

        if (ri == null) { 
            ri = configuration.createFileInfo(projectPath);
        }

        return ri;
    }

    return null;
}
请特别注意这一行:

IPath projectPath = translationUnit.getResource().getProjectRelativePath();

也许,您只需要在代码中使用getProjectRelativePath()

为什么我的代码示例中没有语法突出显示?我在您的问题中添加了Java标记。这就是StackOverflow知道如何突出显示的方法。据推测,突出显示也可以通过在编辑中放置一些注释来触发。下面是一篇修改GCC标志的类似文章:我看到了其他setOption()方法,但故意选择了应用于文件资源的方法,因为我试图为单个文件复制手动设置工具设置。我不相信使用带有IConfiguration参数的setOption()方法会得到相同的结果。你做到了!我只需要将
file.getFullPath()
更改为
file.getProjectRelativePath()
。虽然手动更改的.cproject文件和编程更改的.cproject文件(我将在更新我的问题时详细说明)之间仍然存在差异,但我现在在UI中看到了编程更改。这样一个简单的更改(事后看来很明显)。但值得解决500点。
setOption(IConfiguration config, IHoldsOptions holder, IOption option, String value)
protected IResourceInfo getResourceInfo(ITranslationUnit translationUnit, ICProjectDescription prjDescription) {

    ICProject cProject = translationUnit.getCProject();
    if (cProject != null) {
        ICConfigurationDescription cfgDescription = prjDescription.getActiveConfiguration();
        IConfiguration configuration = ManagedBuildManager.getConfigurationForDescription(cfgDescription);
        IPath projectPath = translationUnit.getResource().getProjectRelativePath(); 
        IResourceInfo ri = configuration.getResourceInfo(projectPath, true);

        if (ri == null) { 
            ri = configuration.createFileInfo(projectPath);
        }

        return ri;
    }

    return null;
}
IPath projectPath = translationUnit.getResource().getProjectRelativePath();