From 14d55fd8fc726bc8ac813164ab9a94ce3d9aab1c Mon Sep 17 00:00:00 2001 From: Leo Treggiari Date: Wed, 10 May 2006 11:46:55 +0000 Subject: [PATCH] Update for MBS 3.1 --- .../Managed_Build_Extensibility.html | 754 ++++++++++++++---- .../guide/mbs/extensibilityGuide/image036.gif | Bin 14859 -> 14052 bytes .../guide/mbs/extensibilityGuide/image038.gif | Bin 9020 -> 10829 bytes 3 files changed, 592 insertions(+), 162 deletions(-) diff --git a/doc/org.eclipse.cdt.doc.isv/guide/mbs/extensibilityGuide/Managed_Build_Extensibility.html b/doc/org.eclipse.cdt.doc.isv/guide/mbs/extensibilityGuide/Managed_Build_Extensibility.html index ec1a8f1ae27..a1837b9d82f 100644 --- a/doc/org.eclipse.cdt.doc.isv/guide/mbs/extensibilityGuide/Managed_Build_Extensibility.html +++ b/doc/org.eclipse.cdt.doc.isv/guide/mbs/extensibilityGuide/Managed_Build_Extensibility.html @@ -79,14 +79,18 @@ managed build system and how to extend it. - + - + + + + @@ -102,7 +106,10 @@ managed build system and how to extend it. - + + + + @@ -117,6 +124,9 @@ managed build system and how to extend it. + + +
AuthorsAuthors Sean Evoy
Leo Treggiari
Revision DateMikhail + Sennikovsky
Revision Date 10/21/2003 - Version: 0.1.0
9/28/2005 - Version 3.0.1
Change History05/09/06 - Version 3.1
Change History 0.1.0 - Document Creation
3.0.1 - Updated for CDT 3.0.1
3.1 - Updated for CDT 3.1

@@ -572,8 +582,8 @@ file.

The user can build the currently active configuration, or select a different set of configurations to build.

-

The user -can rebuild an individual resource separate from building the entire project.

+

The user +can rebuild an individual resource separate from building the entire project.

2.1.7 Upgrading a Project to a New MBS or Tool-chain Version.

MBS defines a version number that is stored in every MBS @@ -667,13 +677,11 @@ ancestor that specifies a value for the attribute.

Schema Notes

+

A tool can define more than one +input type.  The primary input type is used in a different manner than any +secondary input types.  For a multipleOfType == false primary input type, +the tool is called for each project resource that is of the primary input type.  +All files of every secondary input type are added to each invocation of the +tool.  For a multipleOfType == true primary input type, the primary inputs +are listed before the secondary inputs.

Calculated dependencies of an input type are not described by a separate input type, but are instead determined by a dependency calculator extension callback when necessary.  The dependencyCalculator attribute allows the -implementer to specify a class that implements the IManagedDependencyGenerator +implementer to specify a class that implements the IManagedDependencyGenerator2 interface. It is the responsibility of this class to answer all of the source-level dependencies for a given input. A discussion of why this is important for make-based build utilities can be found in § @@ -2627,7 +2657,7 @@ attributes of the InputType element are described in the table below.

- id + id @@ -2642,7 +2672,7 @@ attributes of the InputType element are described in the table below.

- name + name @@ -2657,7 +2687,7 @@ attributes of the InputType element are described in the table below.

- superclass + superclass @@ -2672,7 +2702,7 @@ attributes of the InputType element are described in the table below.

- sourceContentType + sourceContentType @@ -2689,7 +2719,7 @@ attributes of the InputType element are described in the table below.

- sources + sources @@ -2706,7 +2736,7 @@ attributes of the InputType element are described in the table below.

- dependencyContent Type + dependencyContent Type @@ -2724,7 +2754,7 @@ attributes of the InputType element are described in the table below.

- dependencyExtensions + dependencyExtensions @@ -2741,7 +2771,7 @@ attributes of the InputType element are described in the table below.

- option + option @@ -2757,7 +2787,7 @@ attributes of the InputType element are described in the table below.

- assignToOption + assignToOption @@ -2770,13 +2800,13 @@ attributes of the InputType element are described in the table below.

-   + No - multipleOfType + multipleOfType @@ -2793,7 +2823,7 @@ attributes of the InputType element are described in the table below.

- primaryInput + primaryInput @@ -2808,13 +2838,13 @@ attributes of the InputType element are described in the table below.

- dependencyCalculator + dependencyCalculator The name of a class that provides the source file dependency calculation for the input type.  The - class implements the IManagedDependencyGenerator interface.  The default + class implements the IManagedDependencyGenerator2 interface.  The default is none. - buildVariable + buildVariable @@ -2844,7 +2874,7 @@ attributes of the InputType element are described in the table below.

3.10 -Additional Input

+Additional Input

This element is a child of the InputType element.  It describes additional input of a particular input type. An InputType may have multiple AdditionalInput element children.  @@ -2870,7 +2900,7 @@ specified by the user (or tool integrator).

- paths + paths @@ -2889,7 +2919,7 @@ specified by the user (or tool integrator).

- kind + kind @@ -2920,7 +2950,7 @@ specified by the user (or tool integrator).

3.11 -Output Type

+Output Type

This element is a child of the Tool element.  It describes one category of output created by the tool.  A Tool may have multiple OutputType element children.  The element may reference an Eclipse content type @@ -2973,7 +3003,7 @@ attribute.

- id + id @@ -2987,7 +3017,7 @@ attribute.

- name + name @@ -3001,7 +3031,7 @@ attribute.

- superclass + superclass @@ -3016,7 +3046,7 @@ attribute.

- outputContentType + outputContentType @@ -3032,7 +3062,7 @@ attribute.

- outputs + outputs @@ -3048,7 +3078,7 @@ attribute.

- option + option @@ -3067,7 +3097,7 @@ attribute.

- multipleOfType + multipleOfType @@ -3083,7 +3113,7 @@ attribute.

- primaryInputType + primaryInputType @@ -3099,7 +3129,7 @@ attribute.

- primaryOutput + primaryOutput @@ -3113,11 +3143,11 @@ attribute.

- outputPrefix + valign="top" height="83"> + outputPrefix + valign="top" height="83"> Some tools produce files with a special prefix that must be specified.  For example, a librarian on POSIX systems expects the output to be lib.a so ‘lib’ would be the prefix.  The default is to use the Tool @@ -3125,14 +3155,14 @@ attribute.

is an empty string. + valign="top" height="83"> No - outputNames + outputNames @@ -3148,7 +3178,7 @@ attribute.

- namePattern + namePattern @@ -3165,7 +3195,7 @@ attribute.

- nameProvider + nameProvider @@ -3183,7 +3213,7 @@ attribute.

- buildVariable + buildVariable @@ -3288,7 +3318,7 @@ Options'. This will be the name the user sees displayed in the UI.

- icon + icon @@ -3543,7 +3573,10 @@ list.

-

3.13.4 Schema

+

3.13.4 Option +Enablement/Applicability

+

This section will be provided in a future version of the document.

+

3.13.5 Schema

@@ -3755,7 +3788,7 @@ needed. + valign="top">valueHandler + valign="top">valueHandlerExtra Argument @@ -3780,7 +3812,7 @@ needed. + valign="top">applicability Calculator visible, enabled, and used in command line generation.  See § 7.12. + + + + + @@ -4035,7 +4079,7 @@ attributes are specified in the schema table below.

+ rcbsApplicability + toolsToInvoke
valueHandler The name of a class that implements the IManagedOptionValueHandler @@ -3768,8 +3801,7 @@ needed.
valueHandlerExtra - Argument An optional extra text string that is passed into the valueHandler.
applicability Calculator The name of class which is used to determine dynamically at @@ -3790,6 +3822,18 @@ needed. no
tipSpecifies a "tip" that can be displayed in hover help or on the + property page.no
- rcbsApplicability Identifies how the user desires to apply a resource custom build step:
@@ -4050,7 +4094,7 @@ attributes are specified in the schema table below.

- toolsToInvoke Identifies which tools to invoke by a semicolon separated list of child @@ -4066,7 +4110,7 @@ attributes are specified in the schema table below.

3.17 -Environment Variable Build Path

+Environment Variable Build Path

The tool-integrator can specify the names of the environment variables used by the tool for specifying the include and the library paths.  To specify the build paths variables (either the include @@ -4097,7 +4141,7 @@ attributes are specified in the schema table below.

- pathType + pathType The build path type. Can be one of the following: “buildpathInclude”, @@ -4111,7 +4155,7 @@ attributes are specified in the schema table below.

- variableList + variableList comma-separated list of the environment variable names used to store the @@ -4124,7 +4168,7 @@ attributes are specified in the schema table below.

- pathDelimiter + pathDelimiter

Represent the delimiter used to separate the paths. @@ -4140,7 +4184,7 @@ attributes are specified in the schema table below.

- buildPathResolver + buildPathResolver

The name of a class that implements the IBuildPathResolver interface @@ -4370,6 +4414,9 @@ build file generator that is supplied with the CDT (for Gnu makefiles), or replace it with a customized generator depending on the variant of build utility that you wish to use. The relationship between the builder, the build file generator, and a compiler dependency calculator are shown in the model below.

+

Note:  This figure uses the deprecated interface +IManagedDependencyGenerator instead of IManagedDependencyGenerator2.  +However the relationships between the parts remains the same.

-Generated main makefile

+

This makefile is passed as an argument to make, so it contains clean @@ -4525,7 +4570,9 @@ header file in the dependency list. This is important because if the header file is moved or deleted, make will try to find a rule to build the dependency and if a dummy target is not present, it will stop.

-The build file invokes the dependency generator command to generate a separate makefile fragment for each file participating in the build. +The dependency information added to the makefile depends upon the dependency +calculator used by the tools in the tool-chain.  One mode supported by the +MBS is the use of GNU .d files.  In this mode, the build file invokes the dependency generator command to generate a separate makefile fragment for each file participating in the build. The figure below shows the fragment for  Class1.

@@ -4533,6 +4580,9 @@ shows the fragment for  Class1 src="./image040.gif" title="" alt="Generated dependency makefile fragment" name="Generated Dependencies">

+

+Additional dependency calculator modes are supported by the MBS.  See § +7.3.

5.1.4 Support Makefiles

There are two other makefiles that are generated and included in the main makefile. The first, sources.mk, @@ -5238,56 +5288,436 @@ same set of utilities for discovering them. Some tool integrations might rely on an external utility like makedepend to calculate source-level dependencies. Other tool integrations might provide dependency calculation -along with the other build tools, like the GCC preprocessor. Still -others leave -it to the developer to manage them manually. The replaceable dependency -generator in the MBS tries to accommodate all three types of dependency +along with the other build tools, like the GCC preprocessor. The replaceable dependency +calculator in the MBS tries to accommodate many types of dependency discovery mechanisms.

-

If you replace the build file generator in your configuration, the odds are -good that you will also have to replace the dependency calculator or -perform the calculation internally. The +

The mechanism for replacing the dependency calculator is similar to the build file generator, except that the dependency calculator is associated -with a tool inputType, not a builder. You must create a class that implements the IManagedDependencyGenerator -shown in the figure below and specify that class in the inputType element, -dependencyCalculator attribute.

-

-Dependency generator interface

-
Figure 11 Dependency generator interface
-

Typically, these types of dependencies are only relevant for the -compiler but what tool you use to specify the generator (or generators) -is arbitrary. -Your replacement -build file generator can instantiate and use the calculator whenever -it is needed. Recall that the build file generator will be asked to -generate the dependencies by the MBS builder, so perhaps that is the -only time you will need it. Of course, you may prefer to generate the -dependencies during the build, so the dependency calculator may be -needed when the command for the compiler is generated in the build file.

+with a tool inputType, not a builder. You must create a class that implements the IManagedDependencyGenerator2 +interface +shown below and specify that class in the inputType element, +dependencyCalculator attribute.  Typically, dependency calculators are only +relevant for a "compiler" tool, but what tool you use to specify the generator (or generators) +is arbitrary.

By design, a dependency calculator must answer what type of -dependency generation it will do. If it is a command-, or external-type -generator, -the client can ask it for the command given a resource and the build -information for a project configuration. If you are using an external process, the -answer might be a properly formatted command to execute in an external -shell. The default dependency calculator provides -the GCC compiler with a command that gets executed when the source file -is built. The code snippet below shows the transformation that is -needed in that case.

-

-Dependency generator code snippet

-

If you do not have an external process or tool to calculate this, -you can take advantage of the indexer in the CDT. In this case, you are +dependency generation it will do.  There are two major, +and multiple minor, modes of dependency calculation supported by the MBS.  +The major modes are:

+
    +
  1. The build file generator invokes tool integrator + provided methods that calculate all dependencies using whatever method the + tool integrator wants.  The build file generator then adds the + dependencies to the build file using the appropriate build file syntax.  + This is a TYPE_CUSTOM dependency calculator as defined below.  See the + IManagedDependencyCalculator + interface discussion below for more information. 
  2. +
  3. The build file generator and the tool-chain cooperate + in creating and using separate "dependency" files.  In this case, + dependency calculation is done at "build time", rather than at "build file + generation time" as in mode #1.  This currently supports the GNU + concept of using .d files in GNU make.  This is either a + TYPE_BUILD_COMMANDS dependency calculator or a TYPE_PREBUILD_COMMANDS + dependency calculator as defined below.  See the + IManagedDependencyCommands + and IManagedDependencyPreBuild + interfaces discussion below for more information.
  4. +
+

public interface IManagedDependencyGeneratorType {
+    /**
+     *  Constants returned by getCalculatorType
+     */
+    +
public int TYPE_NODEPS = 0; //  Deprecated - use +TYPE_NODEPENDENCIES
+     + public int TYPE_COMMAND = 1; //  Deprecated - use +TYPE_BUILD_COMMANDS
+     + public int TYPE_INDEXER = 2; //  Deprecated - use TYPE_CUSTOM
+     + public int TYPE_EXTERNAL = 3; //  Deprecated - use TYPE_CUSTOM
+     + public int TYPE_OLD_TYPE_LIMIT = 3;
+
+     //  Use these types
+
    + public int TYPE_NODEPENDENCIES = 4;
+     + public int TYPE_BUILD_COMMANDS = 5;
+     + public int TYPE_PREBUILD_COMMANDS = 6;
+     + public int TYPE_CUSTOM = 7;
+
+    /**
+     * Returns the type of dependency generator that is +implemented. 
+     *
+     *   TYPE_NODEPENDENCIES indicates that no +dependency generator is
+     *     supplied or needed.
+     *   TYPE_CUSTOM indicates that a custom, +"build file generation time"
+     *     dependency calculator is +implemented.  Note that the dependency
+     *     calculator will be called +when the makefile is generated, and
+     *     for every source file that is +built by this tool in the build
+     *     file, not just for those that +have changed since the last build
+     *     file generation.
+     *   TYPE_BUILD_COMMANDS indicates that +command lines or options will
+     *     be returned to be used to +calculate dependencies.  These
+     *     commands/options are added to +the build file to perform dependency
+     *     calculation at "build time".  +This currently supports
+     *     compilers/tools that generate +.d files either as a
+     *     side-effect of tool +invocation, or as a separate step that is
+     *     invoked immediately before or +after the tool invocation.
+     *   TYPE_PREBUILD_COMMANDS indicates that a +separate build step is
+     *     invoked, prior to the the +normal build steps, to update the
+     *     dependency information.  +These commands are added to the build
+     *     file to perform dependency +calculation at "build time".  Note
+     *     that this step will be +invoked every time a build is done in
+     *     order to determine if +dependency files need to be re-generated.
+     *
+     * @return int
+     */
+        +
public int getCalculatorType();
+}

+

After deciding upon the type of dependency calculator, you +must implement the methods in IManagedDependencyGenerator2.  +The method getDependencySourceInfo +returns an instance of the +IManagedDependencyInfo interface.  This can be +any one of the 3 interfaces that derive from +IManagedDependencyInfo  - +IManagedDependencyCalculator, +IManagedDependencyCommands or +IManagedDependencyPreBuild +which are discussed below.  The returned interface is called to get the +dependency information for a particular source file in the configuration.  +See the descriptions of the other methods in IManagedDependencyGenerator2 +in the code comments below.

+
public interface IManagedDependencyGenerator2 extends IManagedDependencyGeneratorType {
+	
+    /**
+     * Returns an instance of IManagedDependencyInfo for this source file.
+     * IManagedDependencyCalculator, IManagedDependencyCommands
+     * and IManagedDependencyPreBuild are all derived from
+     * IManagedDependencyInfo, and any one of the three can be returned.
+     * This is called when getCalculatorType returns TYPE_BUILD_COMMANDS, 
+     * TYPE_CUSTOM or TYPE_PREBUILD_COMMANDS.
+     *
+     * @param source  The source file for which dependencies should be calculated
+     *    The IPath can be either relative to the project directory, or absolute in the file system.
+     * @param buildContext  The IConfiguration or IResourceConfiguration that
+     *   contains the context in which the source file will be built
+     * @param tool  The tool associated with the source file
+     * @param topBuildDirectory  The top build directory of the configuration.  This is
+     *   the working directory for the tool.  This IPath is relative to the project directory.
+     * @return IManagedDependencyInfo    
+     */
+	public IManagedDependencyInfo getDependencySourceInfo(
+		IPath source,
+		IBuildObject buildContext,
+		ITool tool,
+		IPath topBuildDirectory);
+
+    /**
+     * Returns the file extension used by dependency files created
+     * by this dependency generator.
+     * This is called when getCalculatorType returns TYPE_BUILD_COMMANDS or 
+     * TYPE_PREBUILD_COMMANDS.
+     *    
+     * @param buildContext  The IConfiguration that contains the context of the build
+     * @param tool  The tool associated with the dependency generator. 
+     *
+     * @return String
+     */
+	public String getDependencyFileExtension(
+		IConfiguration buildContext,
+		ITool tool);
+
+    /**
+     * Called to allow the dependency calculator to post-process dependency files.
+     * This method is called after the build has completed for at least every 
+     * dependency file that has changed, and possibly for those that have not
+     * changed as well.  It may also be called with dependency files created by
+     * another tool.  This method should be able to recognize dependency files
+     * that don't belong to it, or that it has already post-processed.
+     * This is called when getCalculatorType returns TYPE_BUILD_COMMANDS or 
+     * TYPE_PREBUILD_COMMANDS.
+     *    
+     * @param dependencyFile  The dependency file  
+     *    The IPath can be either relative to the top build directory, or absolute in the file system.
+     * @param buildContext  The IConfiguration that contains the context of the build
+     * @param tool  The tool associated with the dependency generator.  Note that this is
+     *    not necessarily the tool that created the dependency file
+     * @param topBuildDirectory  The top build directory of the project.  This is
+     *   the working directory for the tool.
+     *
+     * @return boolean  True if the method modified the dependency (e.g., .d) file
+     */
+	public boolean postProcessDependencyFile(
+		IPath dependencyFile,
+		IConfiguration buildContext,
+		ITool tool,
+		IPath topBuildDirectory);
+}
+

7.3.1 TYPE_CUSTOM dependency calculator +

+

A TYPE_CUSTOM dependency calculator must implement the +IManagedDependencyCalculator +interface.

+
public interface IManagedDependencyCalculator extends IManagedDependencyInfo {
+	
+    /**
+     * Returns the list of source file specific dependencies.
+     *   
+     * The paths can be either relative to the project directory, or absolute 
+     * in the file system.
+     *
+     * @return IPath[]    
+     */
+	public IPath[] getDependencies();
+	
+    /**
+     * Returns the list of source file specific additional targets that the 
+     * source file creates.  Most source files will return null.  An example 
+     * of where additional targets should be returned is for a Fortran 90 
+     * source file that creates one or more Fortran Modules.
+     * 
+     * Note that these output files that are dependencies to other invocations
+     * of the same tool can be specified here, or as another output type 
+     * of the tool.  If the output file can be used as the input of a different
+     * tool, then use the output type mechanism.
+     *   
+     * The paths can be either relative to the top build directory, or absolute 
+     * in the file system.
+     *
+     * @return IPath[]    
+     */
+	public IPath[] getAdditionalTargets();
+}
+

An example TYPE_CUSTOM dependency calculator can be found in the MBS test +suite - org.eclipse.cdt.managedbuilder.core.tests\DefaultFortranDependencyCalculator.

+

If you do not have an external process or tool to calculate dependencies, you +could take advantage of the indexer in the CDT. In this case, you are restricted to generating the dependencies independently of the build steps. The dependency calculator asks the indexer for a list of dependencies and returns them as an array of IResource instances. Obviously, if you rely on the indexer, you must wait for it to complete its work before it will answer, so your build may take -longer to complete.
-

+longer to complete.  See the +org.eclipse.cdt.managedbuilder.makegen.internal\DefaultIndexerDependencyCalculator +class for an example of how this was implemented using the old, deprecated +IManagedDependencyGenerator +interface.  However, it doesn't seem as if it worked with CDT 3.0.  +Readers are encouraged to update this method to the new interfaces and +contribute the implementation to CDT.

+

7.3.2 TYPE_BUILD_COMMANDS dependency +calculator

+When using a TYPE_BUILD_COMMANDS dependency calculator, the build file generator and the tool-chain cooperate in creating and using separate "dependency" files. The build file generator calls the dependency calculator to get the dependency file names and to get commands that need to be added to the build file. In this case, dependency calculation is done at "build time", rather than at "build file generation time" as +with TYPE_CUSTOM. This currently supports the GNU concept of using .d files in GNU make.

+There are multiple ways that these separate dependency files can + be created by the tool-chain and used by the builder.  In some cases (e.g., Fortran 90 using modules) the dependency files + must be created/updated prior to invoking the build of the project + artifact (e.g., an application). In this case, the dependency + generation step must occur separately before the main build. + See +TYPE_PREBUILD_COMMANDS for more information.  In other cases (e.g., C/C++) the dependency files can be created as + a side effect of the main build. This implies that the up to date + dependency files are not required for the current build, but for + the next build. C/C++ builds can be treated in this manner as is + described in the following link: + http://sourceware.org/automake/automake.html#Dependency-Tracking-Evolution.  Use the IManagedDependencyCommands interface for this mode.

+

Two sub-scenarios of this mode are to: +

+
    +
  1. Create dependency files in the same invocation of the tool that + creates the tool's build artifact - by adding additional options + to the tool invocation command line.
  2. +
  3. Create dependency files in a separate invocation of the tool, or + by the invocation of another tool
  4. +
+

MBS can also help in the generation of the dependency files. Prior to + CDT 3.1, MBS and gcc cooperated in generating dependency files using the + following steps:

+
    +
  1. Gcc is invoked to perform the compilation that generates the object + file.
  2. +
  3. An "echo" command creates the .d file, adding the name of the .d + file to the beginning of the newly created .d file. Note that this + causes problems with some implementations of "echo" that don't + work exactly the way that we want (e.g., it doesn't support the -n + switch).
  4. +
  5. Gcc is invoked again with the appropriate additional command line + options to append its dependency file information to the .d file + that was created by "echo".
  6. +
  7. Steps 1 - 3 are invoked in the make file. Step 4 occurs after the + make invocation has finished. In step 4, MBS code post-processes + the .d files to add a dummy dependency for each header file, for + the reason explained in the link above.
  8. +
+

This mode is no longer used by the default gcc implementation, but can + still be used by selecting the DefaultGCCDependencyCalculator3Commands class.

+

Note for GNU make: these separate dependency files are "include"d by + a main makefile. Therefore, if the dependency files are required to + be up to date before the main build begins, they must be updated by + a separate invocation of make. Also, the configuration "clean" step + must be invoked by a separate invocation of make. This is so that + we can exclude the dependency files for a "make clean" invocation + using syntax like:

+

ifneq ($(MAKECMDGOALS), clean)

+

-include $(DEPS)

+

endif +

+

Otherwise, because GNU make attempts to re-make make files, we + can end up with out of date or missing dependency files being + re-generated and then immediately "clean"ed.

+

Examples of the use of TYPE_BUILD_COMMANDS +can be found in org.eclipse.cdt.managedbuilder.makegen.gnu\DefaultGCCDependencyCalculator2Commands +and DefaultGCCDependencyCalculator3Commands.

+
public interface IManagedDependencyCommands extends IManagedDependencyInfo {
+	
+    /**
+     * Returns the list of generated dependency files.
+     *   
+     * The paths can be either relative to the top build directory, or absolute 
+     * in the file system.
+     *
+     * @return IPath[]    
+     */
+	public IPath[] getDependencyFiles();
+
+    /**
+     * Returns the command lines to be invoked before the normal tool invocation 
+     * to calculate dependencies.
+     *
+     * @return String[]  This can be null or an empty array if no dependency 
+     *                   generation command needs to be invoked before the normal 
+     *                   tool invocation.
+     */
+	public String[] getPreToolDependencyCommands();
+	
+    /**
+     * Returns the command line options to be used to calculate dependencies.
+     * The options are added to the normal tool invocation. 
+     *
+     * @return String[]  This can be null or an empty array if no additional 
+     *                   arguments need to be added to the tool invocation.
+     *         SHOULD THIS RETURN AN IOption[]?
+     */
+	public String[] getDependencyCommandOptions();
+ 	
+    /**
+     * Returns the command lines to be invoked after the normal tool invocation  
+     * to calculate dependencies.  
+     *
+     * @return String[]  This can be null or an empty array if no dependency 
+     *                   generation commands needs to be invoked after the normal 
+     *                   tool invocation
+     */
+	public String[] getPostToolDependencyCommands();
+	
+    /**
+     * Returns true if the command lines and/or options returned by this interface
+     * are not specific to the particular source file, but are only specific to,
+     * at most, the configuration and tool.  If the build context is a resource 
+     * configuration, this method should return false if any of the command lines 
+     * and/or options are different than if the build context were the parent 
+     * configuration.  This can be used by the build file generator in helping
+     * to determine if a "pattern" (generic) rule can be used.
+     *
+     * @return boolean
+     */
+	public boolean areCommandsGeneric();
+}
+

7.3.3 TYPE_PREBUILD_COMMANDS dependency +calculator

+When using a TYPE_BUILD_PRECOMMANDS dependency calculator, the build file generator and the tool-chain cooperate in creating and using separate "dependency" files. +For GNU make, these separate dependency files are "include"d by a main makefile. +Make performs special processing on make files:
+

"To this end, after reading in all makefiles, make will consider each as a goal +target and attempt to update it. If a makefile has a rule which says how to +update it (found either in that very makefile or in another one)..., it will be +updated if necessary.  After all makefiles have been checked, if any have +actually been changed, make starts with a clean slate and reads all the +makefiles over again."
+

We can use this to ensure that the dependency files are up to date by adding +rules to the make file for generating the dependency files.  These rules +are returned by the call to the getDependencyCommands method.  However, +this has a significant problem when we don't want to build the build target, but +only want to "clean" the configuration, for example. If we invoke make just to +clean the configuration, make will still update the dependency files if +necessary, thereby re-generating the dependency files only to immediately delete +them.  The workaround suggested by the make documentation is to check for +an invocation using the "clean" target, and to not include the dependency files +it that case. For example,
+

ifneq ($(MAKECMDGOALS),clean)
+include $(DEPS)
+endif
+

The restriction with this is that it only works if "clean" is the only target +specified on the make command line. Therefore, the build "clean" step must be +invoked separately.

Examples of the use of TYPE_PREBUILD_COMMANDS +can be found in org.eclipse.cdt.managedbuilder.makegen.gnu\DefaultGCCDependencyCalculatorPreBuildCommands.

public interface IManagedDependencyPreBuild extends IManagedDependencyInfo {
+	
+    /**
+     * Returns the list of generated dependency files.
+     *   
+     * The paths can be either relative to the top build directory, or absolute 
+     * in the file system.
+     *
+     * @return IPath[]    
+     */
+	public IPath[] getDependencyFiles();
+
+    /**
+     * Returns the name to be used in the build file to identify the separate
+     * build step.  Note that this name should be unique to the tool since
+     * multiple tools in a tool-chain may be using this method of
+     * dependency calculation.
+     *    
+     * @return String  
+     */
+	public String getBuildStepName();
+
+    /**
+     * Returns the command line(s) to be invoked in the separate 
+     * dependencies pre-build step.
+     *
+     * @return String[]
+     */
+	public String[] getDependencyCommands();
+	
+    /**
+     * Returns true if the command lines returned by this interface
+     * are not specific to the particular source file, but are only specific to,
+     * at most, the configuration and tool.  If the build context is a resource 
+     * configuration, this method should return false if any of the command lines 
+     * are different than if the build context were the parent configuration.  
+     * This can be used by the build file generator in helping to determine if 
+     * a "pattern" (generic) rule can be used.
+     *
+     * @return boolean
+     */
+	public boolean areCommandsGeneric();
+}

7.4 Replacing the Command Line Generator

You can specify a replacement command line generator for a tool. You must specify and supply a class that diff --git a/doc/org.eclipse.cdt.doc.isv/guide/mbs/extensibilityGuide/image036.gif b/doc/org.eclipse.cdt.doc.isv/guide/mbs/extensibilityGuide/image036.gif index f3107f521e1085c305be8ac3332e51d1ddcc09cf..f2208cde942419fc67aa54089f65af35c8383f81 100644 GIT binary patch literal 14052 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 diff --git a/doc/org.eclipse.cdt.doc.isv/guide/mbs/extensibilityGuide/image038.gif b/doc/org.eclipse.cdt.doc.isv/guide/mbs/extensibilityGuide/image038.gif index d5eb428928991e4efd6608fe5d483afd1d20ece1..e465cf2f3f59fa3db14c149441b3ceab21546ca4 100644 GIT binary patch delta 10146 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