Located as a subdirectory directly under the main enigma-dev directory,
this folder contains a subdirectory for each of the platforms on which
LGM can run (Windows, Mac, and Linux). Each of these subfolders contains
eYAML files specifying available compilers for that
system. In these files should be important information for calling
relative toolchain executables. The
most common eYAML file will probably be gcc.ey, since GCC is probably
the most common compiler for all platforms.
This format does not specify the location of a makefile to be used.
Including the correct makefile is the job of the general-purpose
makefile under SHELL/. Makefiles for it to include
will be in the folder Makefiles/ in its own
directory. This folder will have an identical structure to this
Compilers/ folder; the makefiles will be named corresponding to the
eYAML filenames, without the .ey extension.
Fields
This specification should cover all our needs. Notice that, again, the
filename itself (sans the extension) is the identifier for the compiler.
- Name will specify the human-readable name of the compiler. (The
filename specifies the machine name).
- Native is implemented mostly for the IDE; it states "Yes" or
"No" for whether the compiler compiles for the current OS.
- Maintainer just names the poor sap in charge of making sure the
compiler works. It's for those who read it, or to be displayed in
the IDE as details.
- Description is entirely optional, but can be used to
describe/differentiate one compiler from another, or may be omitted
altogether. For IDE.
- Target-platform gives the specific, singular device or operating
system for which this file describes a compile toolchain.
- path Gives a list of paths to be prefixed to the system PATH
variable. The format of this list is specific to each platform, not
to each compiler. This field will primarily just be passed to the
makefile, not used by the Plugin or
ENIGMA, as that path information will already
be accounted for in the make field.
- make denotes the path to the toolchain executable for this
compiler that parses makefiles. This must either be a
fully-qualified path, or must be the first lookup under the system
PATH.
- defines specifies the toolchain executable and the parameters
required to produce a list of all macros defined by this compiler
implementation. This is for source parsing purposes.
- If this command utilizes the keyword
$blank, a path to an
empty file will be passed in its place.
- If this command utilizes the keyword
$out, a path to the
desired output file will be passed.
- If it does not specify $out, the contents of the standard
output streams will be redirected to the desired file
instead.
- The path to the executable must be the first term in the line
(you must quote it if it contains spaces).
- Like make, the path to the executable must either be
fully qualified, or the executable must be the first lookup
result in the system PATH.
- searchdirs is identical to defines, except the toolchain
executable specified with the commands passed to it is expected to
yield a list of all search directories.
- If the output from this program is not exclusively a list of
directories, separated by newlines, the following attributes can
be used to isolate them
- searchdirs-start names the last line to be ignored. If
this is not specified, the beginning of the file is not
ignored.
- searchdirs-end names the first line to start ignoring
again. If this is not specified, no more lines are skipped
in the file.
- resources specifies the file to which resources are expected to
be written.
- The keyword
$exe can be used to insert the full path to
the output executable, or $exename can be used to get only
the filename part (including any extension).
- This is the filename specified by the IDE for output.
- cppflags gives any flags that are necessary to compile for this
platform in general.
- cflags is the same as cppflags, but is passed exclusively to the
C-compiler for .c files.
- links names any linker parameters needed to compile for this
platform in general.
- Build-Extension gives the extension of the produced game file.
- Build-Type specifies whether the extension represents a File or
Directory object. The default is File.
- Run-Output specifies where the file is written by default. This
is where the game will be run from. The special value
$tempfile lets the IDE pick.
- Run-Program specifies the name of the binary invoked to run the
game. This is typically just the special object $game unless
the game is being emulated for a different platform.
- Run-Params: The parameter passed to the above binary. In the
case of an emulator, $game can be used here as well. Bear in
mind, $game gives the escaped path to the produced module.
Original Proposal
The following information was specified as the desired fields for the
original specification, as proposed by
User:Tgmg. Later, we revised the idea and came
up with what we are currently using (above).
- Bin Path. A set of paths to be added, as-is, to the PATH
variable. They will be added at the very beginning to ensure
precedence over other paths in the system PATH variable.
- Data file name. The location of the file to write the resources
such as sprites and background to. Some platforms append this to the
end of the executable, but other platforms cannot do this, so for
those platforms it will write to a .data file in a specific
location.
- MakeFile Path. The location of the makefile for this platform,
probably located under MakeFiles/Platform/OS/Makefile, but may be
located elsewhere. The file that it points to should contain the
following targets:
- Compile for compiling enigma itself for the platform.
- Game for compiling the game for the platform.
- Run will be called when the compiling has completed (which
will setup emulators etc and run the executable)
- Clean for deleting all the object files and executables so
that the directory is clean for either deletion or, more
usually, so that the next compile will be completely fresh.
How it links
I'm just gonna leave this here to kinda remind myself of how this system
works, although I can probably read about it in
About.ey.
In order to populate the API Compilers dropdown, we first obtain the
current operating system, one of Linux, Windows, or MacOSX. Then we
iterate through Compilers/$(OS)/*.ey as our active list of compilers
for our operating system. They specify which platform they compile FOR
with the Target-platform field, logically. This Target-platform will
then serve as a kind of linker middle-man for when we try get the list
of Platforms, think of it as a Platform Category.
Next, to populate the Platforms dropdwon, we iterate through
ENIGMASystem/SHELL/Platforms/(.*)/About.ey looking for anything that
has a Build-platforms list that includes one of our Platform Categories.
This then connects a link between that Platform and that Compiler (and
since Build-platforms is a list, it can resultantly connect to multiple
Compilers), so that the Platform will be available for selection when
any of its Compilers is selected.
From there, all the other API systems follow a standard Dependencies
system to determine which is available when. Currently, each of the
different API system categories is hard-coded (not dynamic).