Compare Revisions

Adding XPCOM components to Mozilla build system

Change Revisions

Revision 85780:

Revision 85780 by Db48x on

Revision 85781:

Revision 85781 by Editmonkey on

Title:
Adding XPCOM components to Mozilla build system
Adding XPCOM components to Mozilla build system
Slug:
Adding_XPCOM_components_to_Mozilla_build_system
Adding_XPCOM_components_to_Mozilla_build_system
Tags:
NeedsTechnicalReview, XPCOM, "Developing Mozilla", "Build documentation"
NeedsTechnicalReview, XPCOM, "Developing Mozilla", "Build documentation"
Content:

Revision 85780
Revision 85781
n155      The init functionn155      <a name="The_init_function" id="The_init_function">The init
 > function</a>
156    </h4><a name="The_init_function" id="The_init_function"></a>
156    </h4>157    <p>
157    <p>
158      You can provide an initialization function for your class. 158      You can provide an initialization function for your class. 
>This will be called immediately after your class is allocated and>This will be called immediately after your class is allocated and
> the constructor is called. The init function takes 0 arguments, > the constructor is called. The init function takes 0 arguments, 
>returns an nsresult, and must be public. You can call it anything>returns an nsresult, and must be public. You can call it anything
> you like, just reference it from <tt>NS_GENERIC_FACTORY_CONSTRUC> you like, just reference it from <code>NS_GENERIC_FACTORY_CONSTR
>TOR_INIT</tt> (discussed below).>UCTOR_INIT</code> (discussed below).
n167      The components are registered as part of a module, the sourn167      The components are registered as part of a module, the sour
>ce for which usually lives in a directory called <tt>build</tt>. >ce for which usually lives in a directory called <code>build</cod
>For example, {{ Source("toolkit/components/build") }} is the modu>e>. For example, {{ Source("toolkit/components/build") }} is the 
>le source for the components underneath {{ Source("toolkit/compon>module source for the components underneath {{ Source("toolkit/co
>ents/") }}. Likewise, there is a {{ Source("browser/components/bu>mponents/") }}. Likewise, there is a {{ Source("browser/component
>ild") }}, a {{ Source("widget/src/build") }}, etc.>s/build") }}, a {{ Source("widget/src/build") }}, etc.
168    </p>
169    <p>168    </p>
169    <p>
170      First, find the Makefile.in and give it the name of your co170      First, find the Makefile.in and give it the name of your co
>mponent. This should be the same name as the <tt>MODULE = foo</tt>mponent. This should be the same name as the <code>MODULE = foo</
>> line in your component's makefile. This makes sure the include >code> line in your component's makefile. This makes sure the incl
>path contains <tt>dist/include/foo</tt> where your component's ge>ude path contains <code>dist/include/foo</code> where your compon
>nerated header files are placed.>ent's generated header files are placed.
n176      Typically, your implementation header file (required here) n176      Typically, your implementation header file (required here) 
>lives in your component's directory and is not public. This means>lives in your component's directory and is not public. This means
> it is not copied/linked to from <tt>dist/include/foo</tt> and ju> it is not copied/linked to from <code>dist/include/foo</code> an
>st including your directory in the build <code>REQUIRES</code> se>d just including your directory in the build <code>REQUIRES</code
>ction is not sufficient. In this case, you'll need to add your im>> section is not sufficient. In this case, you'll need to add you
>plementation source directory to <code>LOCAL_INCLUDES</code>. See>r implementation source directory to <code>LOCAL_INCLUDES</code>.
> the file {{ Source("toolkit/components/build/Makefile.in") }} fo> See the file {{ Source("toolkit/components/build/Makefile.in") }
>r an example of how to do this.>} for an example of how to do this.
n209      <b>YOUR_CLASS_CID:</b> (component ID) is a GUID that identin209      <strong>YOUR_CLASS_CID:</strong> (component ID) is a GUID t
>fied the <i>implementation</i> of your class. This is different t>hat identified the <em>implementation</em> of your class. This is
>han the GUIDs used to identify each of the interfaces. (It is pos> different than the GUIDs used to identify each of the interfaces
>sible, but not common, to create a class instance using this valu>. (It is possible, but not common, to create a class instance usi
>e instead of the contract ID.) The value is often defined in a <t>ng this value instead of the contract ID.) The value is often def
>t>somethingCID.h</tt> file alongside the module .cpp file in the >ined in a <code>somethingCID.h</code> file alongside the module .
>build directory. Sometimes, people declare them in their componen>cpp file in the build directory. Sometimes, people declare them i
>t's .h file instead. A typical definition is:>n their component's .h file instead. A typical definition is:
t218      <b>The contract ID:</b> (the <tt>@example.com/...</tt> partt218      <strong>The contract ID:</strong> (the <code>@example.com/.
>, not to be confused with the "CID" = component ID) is the string>..</code> part, not to be confused with the "CID" = component ID)
> that people can pass to <code>GetService</code> or <code>CreateI> is the string that people can pass to <code>GetService</code> or
>nstance</code> to get an instance of your class. Sometimes these > <code>CreateInstance</code> to get an instance of your class. So
>are defined alongside the CID in the header file in the build dir>metimes these are defined alongside the CID in the header file in
>ectory, or there is a special public header file that defines it.> the build directory, or there is a special public header file th
> Both of these methods are fine. Other times they are just hard-c>at defines it. Both of these methods are fine. Other times they a
>oded into the structure or are defined in the IDL file, but these>re just hard-coded into the structure or are defined in the IDL f
> are not recommended.>ile, but these are not recommended.
219    </p>
220    <p>219    </p>
221      <b>The constructor</b> is the name of the constructor autom
>atically generated by the <tt>NS_GENERIC_FACTORY_CONSTRUCTOR</tt> 
> line you added above. It will be the name of your concrete class 
> followed by "Constructor". 
222    </p>220    <p>
221      <strong>The constructor</strong> is the name of the constru
 >ctor automatically generated by the <code>NS_GENERIC_FACTORY_CONS
 >TRUCTOR</code> line you added above. It will be the name of your 
 >concrete class followed by "Constructor".
223    <p>222    </p>
223    <p>
224      <b>If your class implements more than one contract:</b> Def224      <strong>If your class implements more than one contract:</s
>ine one <code>nsModuleComponentInfo</code> structure for each int>trong> Define one <code>nsModuleComponentInfo</code> structure fo
>erface your class implements. The CID and the constructor name wi>r each interface your class implements. The CID and the construct
>ll be the same for all of these (since your concrete implementati>or name will be the same for all of these (since your concrete im
>on is the same), but you will have different contract IDs corresp>plementation is the same), but you will have different contract I
>onding to each interface.>Ds corresponding to each interface.

Back to History