Final Output
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 (ElementsCopyFinalOutput
).
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 OutputFolder
The actual OutputPath for a project is determined by several steps. If the project or target contains an OutputFolder
or 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.
The 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. ./Bin/Debug
).
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:
--output-folder-uses-target-name
(orOutputPathUsesTargets = True
)--output-folder-uses-mode-name
(orOutputPathUsesModes = True
)--output-folder-uses-submode-name
(orOutputPathUsesSubModes = True
)
OutputPathUsesSubModes
defaults to True
for Cocoa and Island projects, resulting in the final output folder by default being e.g. Bin/Debug/macOS
or Bin/Release/Linux
. The other options default to False
.
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.
The FinalOutput.xml
File
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.
See Also
ElementsDetermineFinalOutput
EBuild TaskElementsCopyFinalOutput
EBuild Task