Miguel,

Keep in mind that the conditional load code in Metacello is the moral 
equivalent of #ifdef in C. The debian package universe has the advantage of 
pushing the conditional compilaton of _source code_ down a level.

With Metacello, I purposely use the version attribute for conditional loading 
of code (as close to a conditional compile as you can get). In Metacello we do 
the load and the compile...

Where common code can be written it should be, but as versions and platforms 
diverge in their API, something has to give ... If you can afford to seal off 
the source code for an older version then that's fine, but in a project that is 
under active development and is _expected_ to run on multiple versions of 
multiple platforms one must resort to "conditional loading" - conditional 
loading is what makes Grease work, BTW.

When you look at the universe of #ifdef in C, you see that some of the ifdefs 
are adhoc and some of the ifdefs are based upon platform constants ... and that 
is what the metacello attributes give you ... Right now, you can create 
project-specific attributes and there are a handful of pre-defined attributes 
... As I said, I am purposefully avoiding adding new pre-defined attributes 
willy nilly, but anticipate that some will be needed (GemStone3.0 and 
GemStone2.4 and even GemStone2.3 need to have difference code compiled/loaded 
for projects that are in active developement and expect to be run on all three 
versions of GemStone the low-level apis are different and different code has to 
be written for each different version).

Having the conditional compile/load component in Metacello isn't necessarily an 
elegant feature, but given that no other part of the Smalltalk system currently 
provides a conditional compile/load, I added it to Metacello. Since I am 
maintaining common software on three different versions of gemstone, I consider 
it a requirement.

If and when an elegant conditional compile/load solution becomes available, 
then this particular feature of Metacello can be allowed to die in peace.

I will agree that the MYSQL maintainers don't worry whether their executables 
load on Ubuntu or Fedora, but I can almost guarantee you that they have 
conditional code that makes sure that there their code will compile/build on 
the different OSes.

The ifdef world is as ugly as it comes, but it does exists for a pretty good 
reason.


Dale
----- "Miguel Enrique Cobá Martinez" <[email protected]> wrote:

| El sáb, 20-03-2010 a las 21:54 +0300, George Herolyants escribió:
| > Thanks for the explanation, Dale!
| > 
| > May be it's obvious and I'm asking stupid questions but then I
| don't
| > understand how can I specify in my configuration the differences
| > between the versions of the target platform?
| > 
| > 2010/3/20 Dale Henrichs <[email protected]>:
| > > George,
| > >
| > > The mcz files containing the Metacello configurations _are_
| copied, but the configuration itself is not modified in the scheme.
| > >
| > > The idea of using different repositories is to indicate which of
| the many different projects are _expected_ or _known_ to work in
| Pharo1.1 or Pharo1.0.
| > >
| > > For GemStone, I have createed a GemSource MetacelloRepository and
| I have copied the metacello configurations that I know have been
| ported to GemStone. I've done this so that folks can know what is
| supported. I make sure that all of the tests run green and that all of
| the configs in the GemSource MetacelloRepository can be loaded.
| > >
| > > It does not stop someone from loading a configuration into
| GemStone that isn't in the GemSource MetacelloRepository, but if you
| do and run into trouble, my answer will probably be that it hasn't
| been ported yet.
| > >
| > > The same thing can apply to Squeak, but someone would have to step
| up to testing/approving metacello configurations that run with the
| various versions.
| > >
| > > Without this extra step of approval/testing, it's difficult for
| someone that doesn't have their finger on the pulse of the latest and
| greatest happenings to know what to expect ...
| > >
| > > Dale
| 
| The problem is, you are thinking in upstream development, and the
| idea
| of universes is that each package has maintainer for each platform
| involved. This maintainer can be the same person that the upstream
| developer, but it can also be someone else that make sure that a
| given
| package load correctly in *a give* fork.
| 
| Making an analogy, what you are saying is that the maintainers of
| MySQL
| deb package in Debian should be worried about the package not loading
| in
| Ubuntu or Fedora. That is not the case. The upstream code can run in
| all
| of three distros, but the packages specific to each one (.deb in
| debian
| and ubuntu and .rpm in fedora) *must* be build and tested for their
| own
| maintainers. The upstream developers can rightfully don't give a dime
| about where is package is being used and maybe they only release
| a .tar.gz and know nothing (but also they don't stop efforts) about
| external package for specific distros.
| 
| So, returning to your question, maybe sometime in the future Squeak
| (if
| interested) will have to build its own repositories with its own
| universes and put there the configurations that are proved to work in
| Squeak.
| 
| Right now as Pharo and Squeak are very similar the configurations
| (and
| the #common you mention) works, but this isn't going to scale for
| different Smalltalks in the long term.
| 
| Cheers
| > 
| > _______________________________________________
| > Pharo-project mailing list
| > [email protected]
| > http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
| 
| -- 
| Miguel Cobá
| http://miguel.leugim.com.mx

_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to