The end-goal of an EBuild build is of course a set of one or more Final Deliverables. This could be an executable, a library or an app bundle, and it might include additional files such as a
.fx file for a native library, or a
.h file that lets a Cocoa library be used from Xcode.
During build, EBuild assembles all files in an Intermediate Folder (as described in more detail here). It is only a pair of final tasks that run as the very last phase of a build that (a) determine what files are deemed part of the final deliverable (
ElementsDetermineFinalOutput) and (b) copy those files to their final location (
ElementsDetermineFinalOutput runs for each target and, with code specific to each platform and sub-platform, determines which of the many files a build has generated (or referenced externally) should become part of the final delivery.
ElementsCopyFinalOutput then runs and copies all files over to the
OutputFolder, and generates a
FinalOutput.xml file in the Intermediate Folder.
The actual OutputPath for a project is determined by several steps. If the project or target contains an
OutputPath setting, its value will be used in that order, and it can be an absolute path or (most common) a path relative to the project file.
OutputFolder setting can of course be overridden from the command-line with the
--output-folder Command-Line Switch. If the specified value is not an absolute path, it will be treated as relative to the current working directory (not the project!).
If no path is specified in either the project or on the command-line, EBuild will use a folder called
Bin parallel to the project, with an additional subfolder named after the selected configuration (e.g.
For multi-target projects (or to have more unique output folders when building multiple projects that emit similarly-named output), EBuild can optionally use additional sub-folders for target, mode and/or submode name, if the following command-line switches are passed or the following settings are set to
True in the project:
OutputPathUsesTargets = True)
OutputPathUsesModes = True)
OutputPathUsesSubModes = True)
OutputPathUsesSubModes defaults to
True for Cocoa and Island projects, resulting in the final output folder by default being e.g.
Bin/Release/Linux. The other options default to
Finally, Cocoa deliverables built for the Simulator get the
FinalOutputFolderSuffix meta data value of "
Simulator, resulting in those final deliverables to be copied into a folder separate from the deliverables for real physical devices.
After copying all output to its final location, the
ElementsCopyFinalOutput task also generates a
FinalOutput.xml file that contains details about all the files it delivered.
This file can be used by IDEs or custom build scripts to locate and enumerate all the final deliverables. It also aso used by EBuild when doing "Clean", to determine what deliverables to delete, and as a fallback when resolving Project References to projects that are disabled or not part of the solution.