gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:45 28 4
gpt4 key购买 nike

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

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

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

IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow workbenchwindow = workbench.getActiveWorkbenchWindow();
IWorkbenchPage workbenchpage = workbenchwindow.getActivePage();
IEditorPart editorpart = workbenchpage.getActiveEditor();
IEditorInput editorinput = editorpart.getEditorInput();
IResource file = ((IFileEditorInput)editorinput).getFile();
IProject project = file.getProject();
IManagedBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(project);
IConfiguration[] configurations = buildInfo.getManagedProject().getConfigurations();
IConfiguration conf = configurations[0];
IFileInfo fileInfo = conf.createFileInfo(file.getFullPath());
ITool[] tools = fileInfo.getTools();
ITool tool = tools[0];
IOption option = tool.getOptionById("my.gnu.compiler.misc.other");
String oldOptionValue = option.getDefaultValue().toString();
String newOptionValue = oldOptionValue + " -eg";
ManagedBuildManager.setOption(fileInfo, tool, option, newOptionValue);
ManagedBuildManager.saveBuildInfo(project, true);

我查看了手动更改工具设置的 .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>
...

这是 .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.2057644715">
...
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="${ProjName}" buildProperties="" cleanCommand="rm -f" description="" id="com.company.product.toolchain.configuration.changed.2057644715" name="changed" parent="com.company.product.toolchain.configuration.changed">
...
<fileInfo id="com.company.product.toolchain.configuration.changed.2057644715./test3/src/code.cpp" name="code.cpp" rcbsApplicability="disable" resourcePath="test3/src/code.cpp" toolsToInvoke="com.company.product.toolchain.compiler.1482360042.1005761865">
<tool id="com.company.product.toolchain.compiler.1482360042.1005761865" name="Company GNU compilers" superClass="com.company.product.toolchain.compiler.1482360042">
<option id="company.gnu.compiler.misc.other.999025984" superClass="company.gnu.compiler.misc.other" value="-c -fmessage-length=0 -eg" valueType="string"/>
<inputType id="com.company.product.toolchain.cxxinputtype.1253686787" name="C++ Input" superClass="com.company.product.toolchain.cxxinputtype"/>
<inputType id="com.company.product.toolchain.cinputtype.1141524787" name="C input" superClass="com.company.product.toolchain.cinputtype"/>
</tool>
</fileInfo>
...

除了我认为是某种 GUID 的数字之外,还有三个不同之处:
  • 出于某种原因,fileInfo 的 id 属性程序更改中的元素包含文件路径,包括项目名称:id="com.company.product.toolchain.configuration.changed.2057644715./test3/src/code.cpp"
  • resourcePath fileInfo的属性值元素包含项目名称,仅在程序性更改中:resourcePath="test3/src/code.cpp" .
  • option fileInfo 中的元素元素作为名称属性( name="Other flags" )匹配对话框中的字段,仅在手动更改。

  • 我猜测这些差异中的一个或全部阻止了我的程序更改与手动更改“兼容”(因此它们显示在对话框中)。我试图弄清楚如何在不引起这些差异的情况下创建 IFileInfo、IOption(和 ITool?)对象。我试图找到如何为对话框创建这些对象,但还没有。

    任何建议表示赞赏。

    更新:我收到了 an answer from Doug Schaefer我在 cdt-dev mailing list 上的问题.他建议我“在一些地方设置断点,看看 UI 是如何做到的”。我回信:

    我一直在这样做。我在 org.eclipse.cdt.managedbuilder.core.ManagedBuildManager.setOption(IResourceInfo, IHoldsOptions, IOption, String) 中设置了一个断点当我打开文件的“属性”对话框时,它会触发,展开“C/C++ 构建”,选择“设置”,然后选择“工具设置”选项卡中的“杂项”。我可以看到参数,并且大概如果我可以使用相同的参数调用 setOption,我将在 .cproject 文件中获得相同的结果。但我一直无法弄清楚如何做到这一点。你对我如何找出这些对象的创建位置有什么建议,以便我可以在那里设置断点?

    更新 #2: Vladimir的答案解决了我的问题。虽然我更关心上面两个 .cproject 文件片段中的差异 3,但关键是差异 2 和差异 1 中包含的项目名称。

    我更改了代码以创建 IFileInfo反对:
    IFileInfo fileInfo = conf.createFileInfo(file.getProjectRelativePath());

    ...这导致 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 文件中的其他差异并不重要。)

    最佳答案

    我怀疑您创建 IFileInfo 时可能存在问题。这是我们用于获取翻译单元的 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 - 如何以编程方式更改文件的 Eclipse CDT 工具设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20061538/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com