On Mar 23, 2007, at 7:51 AM, Mike Mattie wrote:

On Wed, 21 Mar 2007 18:39:51 -0700
Allison Randal <[EMAIL PROTECTED]> wrote:

chromatic wrote:

Agreed. And we don't work from the installation paths because the
installation paths are broken. Can we break out of this cycle with
some automated tests for the installed Parrot?

Allison

I have already suggested in a previous mail "the value of a install target"
the goal of making the working copy and the install target exercise the
loader in the same way.

The reason I chose the language: "exercise the loader" was to dodge this testing
bullet.

Actually, I don't believe that it would be that difficult. All that should need to happen is change which parrot is ran. A "test_installed" target that isn't dependent on building parrot(confusing, but think of how the Makefile works) that runs the installed parrot, and using the local perl modules should suffice. I imagine it'd be one of the easier parts of a complete installed parrot.

Expanding the test-suite to cover the install target is alot of work, and an unpleasant administrative burden to remind and cajole the developers into
passing the install tests; which they may not even care about.

If it was built in a traditional way the test-suite would also have to
be extended as the project grew with coverage testing, it's a vicious cycle :)

The answer is to make a guarantee of a flat search space for modules.
Authors can insert into that search space foo.pir or myproject/foo.pir.

This flat search space needs to be assembled in the *working-copy* and
in the install tree.

In fact parrot does this already !

here is a snip from src/library.c:90

<snip>
    entry = CONST_STRING(interp, "runtime/parrot/library/");
    VTABLE_push_string(interp, paths, entry);
</snip>

and from src/library.c:94

<snip>
    entry = CONST_STRING(interp, "lib/parrot/library/");
    VTABLE_push_string(interp, paths, entry);
</snip>

This hack is built-in for the runtime core. What is really missing is a
comprehensive design that de-couples policy (where things go) from
hand-editing source files.

Once this table in library.c is generated from a policy spec, that policy can either describe what the install should be, _and_ what the working-copy is.

Ideally an author should be able to create

project/main.pir
project/foo/bar/install.spec
project/foo/bar/bar.pbc
project/foo/bar/mystuff/util.pbc

and in main.pir do this:

.load_bytecode "bar"
.load_bytecode "mystuff/util"

and this would work because install.spec ( name doesn't matter at this point ) has specified that the files and directories below are relative to the flat
search space.

Note that ideally the author would simply setup such a install.spec file at the beginning, update parrot with the new policy, and at that point ignore the file except occasionally adding/removing pieces to install. Once the path has been added to the search path list it is a true member of the unified name-space.

With this scheme the testing is focused on a single point: the loader. The loader is significantly enhanced with powerful features integrated into a comprehensive design. Once that basket is well-built things either load or they don't , irrespective
of whether it is installed or not.

In short this will make things work, because things will break for developers as they would for users, a isomorphic mapping that sidesteps non-linear growth in the test-suite.

The key is the design, which unfortunately I don't have the time to put out in this mail.
I have it in my head, and I will sketch it out in a diagram.

If someone could point me at a suitable related wiki, or other hosting location where I could upload a .png diagram, and some text describing the design I have developed I should be able
to assemble this sometime within the next week or two.

Cheers,
Mike Mattie ([EMAIL PROTECTED])

Reply via email to