I have been improving the separate compilation mechanism, but for now
I want to look at the tooling. 

At present, the _interface.flx file goes in the text cache, alongside the *.hpp 
file 
it requires. For some reason the object files also go in the text cache, however
libraries go in the binary cache. 

The names of these files are quite consistent and universal:

        $HOME/.felix/text/`pwd`/*base*

and replace text with binary. But what do we want?

I will look first at the highest level because it's easier. The lower levels
of management are actually harder.

Suppose we have a file

        mylib.flx

which of course might include other files. What we want to produce with this is 
the
same as how we would manage either 

        (a) a Felix core package
        (b) an external package

Installed Felix core packages follow rigid rules. The interface Felix code goes 
in

        $INSTALL_DIR/share/lib/*

where * may include some subdirectory structure, such as std/datatype/ ....

The required C++ headers and binaries go in

        $INSTALL_DIR/host/lib/rtl

The config file goes in

        $INSTALL_DIR/config

Note that with a package file, we no longer need to put a #include in the 
interface,
and we no longer need to link the library on the command line, the interface 
can just
say

        requires package "mylib";

This will find an installed package. So, one way to organise the compilation is 
to
output everything into a given base "in the image" of the install for example:

        flx --package=mylib mylib.flx

would produce (on OSX):

        mylib/share/src/mylib.flx  # copy 
        mylib/share/lib/rtl/mylib.hpp
        mylib/share/lib/mylib_interface.flx
        mylib/host/lib/rtl/mylib.dylib # .so on Linux
        mylib/host/config/mylib.fpc

to be complete, we should make the static versions of this too. Note that 
non-product temporary
files might go in the cache still. Clearly we can install by just

        sudo cp -r mylib/* $INSTALL_DIR

and then everything will just work "as an extension" to Felix. Of course, 
everything is lost
if we upgrade Felix. So we need a consistent way to rebuild. And to build for 
multiple
targets.

For non-core packages, we need a persistent place to put them for development.
The assumption is these things are not Felix version dependent, so normally
we just have to rebuild with new versions of Felix: sometimes we have to upgrade
the source for the latest Felix. Contrarily these packages would have their own 
versioning.

We also need a place to install these things that doesn't get clobbered by a 
Felix install.
For example

        /usr/local/lib/felix/user-packages


Although it's tricky to get right, we might "autobuild" things with upgrades.
By far the biggest problem here is that the install point is normally owned
by a sysadmin such as root, so we have to separate building from installing.
So for many packages we need two paths: to the build directory first then
to the install directory as a fallback (otherwise we can't test our programs).

There's another way to do this: just put everything in

        mylib

without any structure, and make the install program do the hard work.
I note that the *.fpc file may need modification!

This packaging concept is "overkill" for simple things. For example
you have 

        program.flx

and you want to split out part of the code into

        mylib.flx

With caveats about order of initialisation of global variables this is easy 
enough,
and you can just include mylib in program. But soon this gets slow, so you want 
to
separately compile mylib.

There's actually an argument that you should use

        mylib.fdoc

and the interface should just be

        mylib.flx

This means your original program which says:

        include "mylib";

and worked by including mylib.fdoc will transparently switch
to including mylib.flx once mylib.fdoc has been compiled.
[this won't quite work because of "export" but it's an interesting idea!]

So actually .. getting the export semantics to work is much less of a problem
than tooling, i.e. just deciding where to put all the files!

--
john skaller
skal...@users.sourceforge.net
http://felix-lang.org




------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to