How Cat's Eye Technologies' software distributions are organized.
Release Engineering
Historically, Cat's Eye Technologies has usually identified each release
of a software distribution with only a release number. The release number is
really just the date that the software was released, formatted as
YYYY.MMDD
. Each of Y
, M
, and D
is a single digit, so that it
sorts nicely, even in a purely lexicographical sort order. In
retrospect, YYYY.MM.DD
might have been a more structurally consistent
choice, but it's not as nicely symmetrical.
Using only the release date to identify releases mostly suffices for distributions like ours, which rarely have any maintenance needs warranting branches and such. But most of our distributions do contain implementations of programming languages, and these languages may or may not change between releases. For example, if we're just fixing bugs in a feature of the implementation, or clarifying the documentation or whatever, that's not a change to the language. But if all we use to identify it is a release number, you can't tell if it's a change to the language or not.
In addition, some of our distributions used a different convention, usually
two numbers A.B
which resembled a fraction in decimal notation: often
B
would be two digits (like 94) which did not count the number of
minor releases since the last major release cycle, but rather tried to
measure "how close" it was to the next major release cycle. Version
numbers like this were sometimes also followed by an (essentially
meaningless) letter.
Realizing what a mess this is, we have strived to revise our release identification system, as well as to make it more consistent.
With few exceptions, every distribution now carries both a version and a
revision. The version consists of a major version number and a minor
version number, in the format A.B
, where A
and B
are both
non-negative integers. The revision is the same as the old release
number, that is, it is the date in YYYY.MMDD
format. The version and
revision are separated by hyphens, so a new-style "distfile" name
typically looks like foo-1.3-2009.0116.zip
(although we are by and
large still providing only the legacy distfiles for download).
The rules for when these numbers change are as follows:
- If a new release of a distribution supports the same interface (syntax and semantics, API, protocol, or what have you) as the previous release of that distribution, then the version will be the same as the old distribution, but the revision will be different.
- If a new release of a distribution is more-or-less backwards-compatible with the previous release, then the major version will be the same, but the minor version and revision will be different.
- If a new release of a distribution is distinctly not backwards-compatible with the previous release, then the major version will be different, the minor version is typically reset to zero, and the revision will of course be the date of the release.
Filesystem Organization
This is a rough guide to how Cat's Eye Technologies' distributions are laid out. It is prescriptive, specifying how distributions should be laid out, but it is informed by the general pattern we're trying to find in our distributions. This guide is currently a work in progress and should not be considered complete yet.
Certain files in a distribution's root directory have standard meanings:
-
README.markdown
(preferred) orREADME
orREADME.txt
A short text (or preferably Markdown) document summarizing what the distribution is a distribution of, what sorts of files it contains, where to get the latest version of the distribution, and what other tools might be needed to use (run or build) the files found in it.
READMEs for esolangs may describe the entire language. I'm not sure if this is a good practice or not. It started because Bitbucket would only HTMLify a Markdown file in its source viewer if it was the README, but now it will do that for every Markdown file, so there is less reason to put the whole language description here. Still, for some esolangs, this style seems to fit. (The only problem is that there isn't usually a good place to give the other info, like how to build and run the included implementations.)
-
LICENSE
orUNLICENSE
A short text document explaining what license or licenses the content of the distribution is available under. The filename
UNLICENSE
is used instead if (and only if) the entire contents of the distribution are in the public domain. -
make.sh
orMakefile
A Bourne shell script which builds executables and related things from the sources included in the distribution. This may also be a
Makefile
, butMakefile
s are usually put in thesrc
directory.make.sh
may justcd
to that directory and runmake
. -
clean.sh
A Bourne shell script to clean up after building, in lieu of a
make clean
command. -
test.sh
A Bourne shell script which runs tests for the distribution. The tests can test anything they like, but should produce output which conforms to Portent format, which we haven't exactly defined yet, so don't worry about it. For now, an exit code of 0 means pass, anything else means failure.
Certain files in the root distribution directory have standard meanings as well:
-
bin
Where executables shoud be kept. Distributions should generally not contain native executables; the main exception to this rule is native executables for "legacy platforms" such as MS-DOS and Commodore 64 computers.
Native executables may be written into the
bin
directory when they are built from other files in the distribution by e.g.make.sh
.Distributions may contain non-native binary files intended to be executed, i.e. virtual machine code, and these will reside in
bin
. Java.class
files are contained, underbin
, in a directory tree matching the package names.Distributions may contain executable scripts. However, executable scripts which contain significant amounts of source code (i.e. ones that are not just little drivers or wrappers) should go in
script
rather thanbin
. They may in some cases be copied intobin
upon build.Names of files in
bin
should not have extensions unless convention demands it. (That is,tool
rather thantool.py
, buttool.com
is OK.) -
demo
A directory of examples of how the contents of the distribution might be used. Somewhat interchangeable with
eg
, except thateg
is primarily for example programs for a programming language (or configuration files, etc.) whiledemo
contains demonstrations of how the tools (etc.) in the distribution might be used. -
dialect
For distributions of programming (and other) languages, this is where related languages (usually too minor in variation to warrant their own distributions) are defined and implemented.
-
disk
Where disk images should be kept.
-
doc
Where documentation should be kept. Exceptions include
README.markdown
andLICENSE
, which should be in the root directory.Images may be included in
doc
if they are part of the documentation (for example, diagrams) but if they are just screenshots, they should probably be elsewhere. -
ebin
Distributions should not ship with pre-compile Erlang
.beam
files, but when they are built from the sources, they will go here. Erlang.app
files may be contained here as well, but these are generally not all that useful, and mostly for decoration. -
eg
Where examples should be kept, particularly example programs in distributions which contain implementations of programming languages. Somewhat interchangeable with
demo
, except thatdemo
is primarily for demonstrations of how the tools (etc.) in the distribution might be used, whileeg
contains examples programs for a programming language (or configuration files, etc.) -
impl
For distributions containing more than one implementation, this is where source code for the non-reference implementations should be kept. (The reference implementation's source should be in
src
.) -
priv
Where data files for Erlang applications are kept.
-
script
Where executable scripts which have significant amount of code in them should be kept. (But if the script gets really large, it should probably be broken up into a driver script in
bin
which imports source modules fromsrc
.) -
src
Where source code is kept. For distributions containing more than one implementation, this is where the reference implementation is kept; other implementations should probably be in
impl
instead.