Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Eclipse CDT New Project Template - How to add a library

In Eclipse CDT Indigo, there is a new feature that allows you to add new C/C++ template projects to the new project wizard. I've figured out how to do this successfully up to a point. I can create a basic project that just depends on simple source files but now I'd like to create a CPPUnit project to which I'd like to automatically add the CPPUnit library. For the life of me, I can't figure out how to achieve this end. Does anyone know how?

like image 275
Phil Avatar asked Jan 20 '23 05:01

Phil


2 Answers

Sorry I am late, but I just had the very same question for the very same problem. I have figured out a solution. It works for me, but I am well aware that it is probably not as general as hoped for. In your template.xml, you may want to add the following process:

<process type="org.eclipse.cdt.managedbuilder.core.AppendToMBSStringListOptionValues">
    <simple name="projectName" value= "$(projectName)"/>      
    <complex-array name="resourcePaths">
        <element>
            <simple name="id" value="gnu.cpp.link.option.libs" />
            <simple-array name="values">
                <element value="dl" />
                <element value="cppunit" />
            </simple-array>
            <simple name="path" value="" />
        </element>
    </complex-array>
</process>

The crucial part is to know where to put the two libraries dl and cppunit. The key gnu.cpp.link.option.libs is the correct one for the GNU compiler tool chain which is active on most Linux computers.

I have extracted the key name from the Eclipse plugin org.eclipse.cdt.managedbuilder.gnu.ui_XXXXXXX. You can find it at Eclipse's plugins folder. If you need the key for another toolset, I recommend opening the plugin.xml file. Here, you should search for the attribute valueType="libs". The corresponding id is the key you need to manipulate in your process file.

If you also need to manipulate the library search path, search for valueType="libPaths". This will lead you to the key gnu.cpp.link.option.paths. You can add additional entries to the list with a process similar to the one shown above.

like image 101
Michael Koenig Avatar answered Jan 30 '23 22:01

Michael Koenig


It is AMAZING how hard this stuff is to find. In addition to plugin.xml browsing, all the templates provide efficient ramp up on implementing these options:

Source Reference

  • manual download: Eclipse CDT Source Download

Templates to Browse

  • plugins/org.eclipse.cdt.managedbuilder.gnu.ui_X.X.X.xxxxx.jar/templates/projecttemplates/

    • and then in each proj dir (e.g. 'HeloWorldCAnsiProject') locate template.xml

GNU C Options to Browse

  • plugins/org.eclipse.cdt.managedbuilder.gnu.ui_X.X.X.xxxxx.jar/plugin.xml

Example Implementation By Reverse-Engineering

Goal - set 'Cross GCC Compiler' -> Optimization -> 'Other optimization flags'

  1. create a dummy C project with no customization
  2. open properties. set the target field manually. I set 'Other optimization flags' to 'COME_FIND_ME'

    enter image description here

  3. open the .cproject file in an editor. search for COME_FIND_ME. here is what I found:

    <option id="gnu.c.compiler.option.optimization.flags.1380831355" superClass="gnu.c.compiler.option.optimization.flags" value="COME_FIND_ME" valueType="string"/>
    
    • it is then of type 'string' and 'id' gnu.c.compiler.option.optimization.flags.

    enter image description here

  4. Search in the plugin.xml listed above for 'gnu.c.compiler.option.optimization.flags'. Here's what i found (on line 1120):

      <option
          name="%Option.Posix.Optimize.Flags"
          category="gnu.c.compiler.category.optimization"
          id="gnu.c.compiler.option.optimization.flags"
          valueType="string">
      </option>
    

    enter image description here

  5. get outta this example project, and go back to your template.xml you want to add this to. we want to append here to default value, so lets do that. add:

    <process type="org.eclipse.cdt.managedbuilder.core.AppendToMBSStringOptionValue">
        <simple name="projectName" value="$(projectName)" />
    
        <complex-array name="resourcePaths">
            <element>
                <simple name="id" value="gnu.c.compiler.option.optimization.flags" />
                <simple name="value" value="-Omg_eclipse" />
                <simple name="path" value="" />
            </element>
        </complex-array>
    </process>
    

and that's it.

Useful Links

  1. Help - Eclipse Platform - How to register a project template with CDT
  2. Help - Eclipse Platform - Example template

Notes

Here are where the MBS append/set functions live:

  • org.eclipse.cdt.managedbuilder.core.source_X.X.X.xxxxx.jar/org/eclipse/cdt/managedbuilder/templateengine/processes

enter image description here

Full Template File Example

finally, here's a code snippet that may save you hours of scouring the internet. this template.xml creates a new project by copying over main.c, and setting three build options.

<?xml version="1.0" encoding="ISO-8859-1"?>
<template type="ProjTempl" version="1.0" supplier="stack_overflow" revision="1.0" author="Justin Reina"
    id="EXE" label="My C Project" description="set some stuff."help="help.html">

   <process type="org.eclipse.cdt.core.CreateSourceFolder">
        <simple name="projectName" value="$(projectName)"/>
        <simple name="path" value="bsp"/>
    </process>

    <process type="org.eclipse.cdt.core.AddFiles">  
        <simple name="projectName" value="$(projectName)"/>     
        <complex-array name="files">    
            <element>
                <simple name="source"      value = "main.c"/>
                <simple name="target"      value = "main.c"/>
                <simple name="replaceable" value = "true"  />
            </element>
        </complex-array>
    </process>

    <process type="org.eclipse.cdt.managedbuilder.core.AppendToMBSStringListOptionValues">
        <simple name="projectName" value= "$(projectName)"/>      
        <complex-array name="resourcePaths">
            <element>
                <simple name="id" value="gnu.c.link.option.libs" />
                <simple-array name="values">
                    <element value="corestuff" />
                    <element value="utilstuff" />
                </simple-array>
                <simple name="path" value="" />
            </element>
        </complex-array>
    </process>

    <process type="org.eclipse.cdt.managedbuilder.core.AppendToMBSStringOptionValue">
        <simple name="projectName" value="$(projectName)" />

        <complex-array name="resourcePaths">
            <element>
                <simple name="id" value="gnu.c.compiler.option.optimization.flags" />
                <simple name="value" value="-Omg_eclipse" />
                <simple name="path" value="" />
            </element>
        </complex-array>
    </process>

    <process type="org.eclipse.cdt.managedbuilder.core.SetMBSBooleanOptionValue">
        <simple name="projectName" value="$(projectName)" />

        <complex-array name="resourcePaths">
            <element>
                <simple name="id" value="gnu.c.link.option.nostdlibs" />
                <simple name="value" value="true" />
                <simple name="path" value="" />
            </element>
        </complex-array>
    </process>
</template>

To the Eclipse Foundation; next time can I just pay you a half-day's salary for you to give me this information???

like image 43
J-Dizzle Avatar answered Jan 31 '23 00:01

J-Dizzle