EBuild Solutions, Projects & Targets

A Solution contains one or more projects. A Project contains one or more targets. A Target defines a singular project build goal for a single platform/sub-platform combo.

Solutions

EBuild will process standard .sln solution files, as generated and used by Visual Studio, Fire and Water.

EBuild will consider only the top section of the .sln file to get a list of projects and their types, as well as explicitly defined inter-project dependencies. EBuild does not use solution configurations, nor honor the "active" state of projects within a solution file.

Projects can be included or excluded from a build with the --projects or --skip-projects command line switches, respectively. By default, all non-shared projects will be built.

EBuild will smartly determine the best build order, based on both explicit inter-project dependencies gathered from the solution file, as well as from Project References within the projects.

Projects

A project is a collection of source and other files, references (to binaries or other projects) and settings targeted at generating one or more "equivalent" output binaries.

Each project has at least one target, and as such would generate a single executable (.NET, Java and Cocoa/macOS), a set of the same executable for several architectures (Island) or two executables for a physical device and a simulator (Cocoa iOS, tvOS and watchOS).

Multiple targets can be defined to have the same project generate multiple sets of output described above (e.g. for different platforms or sub-platforms), but generally the goal would be to build (roughly) the same set of files for each target.

Good examples for multi-target projects would be:

  • A library, compiled for different Island platforms (e.g. Windows and Linux).
  • A library, compiled for different platforms (eg .NET, Java, Cocoa and Island).
  • A console application compiled for .NET, Linux and Cocoa.

(While it is technically feasible to have multiple targets that generate vastly unrelated outputs, that is not their intention; that is what multiple projects (possibly with a shared project with common code) are best for.)

Targets can be included or excluded from a build with the --targets or --skip-targets command line switches; they can also be disabled inside a project by specifying the <Enabled>False</Enabled> as meta data flag. By default, all targets in the active projects will be built.

Targets

Targets live within a project, and by default share any files, settings and references within that project, unless those are explicitly marked as belonging to a specific target.

Each target has an exact Mode (i.e. platform: Echoes, Cooper, Toffee or Island) and an optional SubMode (i.e. sub-platform, for example "iOS" for a Cocoa project, or "WebAssembly" for an Island project).

If a project defines no explicit targets, Mode and SubMode are determined based on the name of the legacy MSBuild ".target" import included in the project, and an implicit target is defined, named after the mode and submode (eg "Echoes", or "Island-Android"). If the Mode cannot be determined, compilation will fail.