Hi Gary,
here are my comments:
On 25.05.2014 19:14, Gary Oberbrunner wrote:
I'd like to kick off a round of discussion about toolchains, so can
make some progress toward a design. I have some preliminary thoughts.
Please comment. Apologies for the HTML mail, let me know if this
isn't readable for you.
* Allow installing external tools (pip install or ...)
*
o scons --version (or similar) should list installed tools and
toolchains
o missing external tools should give sensible errors
I'm not sure I understand what you mean by "missing" here. An external
Tool that isn't able to find the executables or packages it depends on
in the current system? Like an overview, where you get an
Available/NotFound for each Tool?
What I wouldn't like is, if we'd define a set of external Tools that the
user would *have* to install. We can provide a package of external tools
in a bundled fashion, something like our "best of". But each user should
be free to install it, or only the single Tools he needs, without
getting confusing messages about a Tool not being found, just because we
think he needs to have it.
* Tool setup must happen before reading SConstruct somehow
I don't know if this is really required, see my comment below about
"lazy initialization" of Tools. It would be good to have a pool of
Platform-related info (which OS/Python/Kernel are we running on?) at
this early stage, that all environments/tools can access directly.
*
o DefaultEnvironment and all new Environments should know about
all tools
o alternative: lazy-construct DefaultEnvironment
o user-specified tools and toolchains need to be specifiable at
beginning of build
* User should be able to set default tools and toolchains
...and the order in which they are probed, if possible this
specification should be per OS.
*
o unused tools shouldn't take any startup time
* Lazy init of tools and chains
*
o This is faster because unused tools don't matter
o It allows missing unused tools to not give errors, but missing
used tools can (and should)
o But it makes configuring environments much harder for users,
because they can't override or append to tool-provided
variables until those exist. This would break a lot of
existing SConstructs.
o We need to find some kind of compromise here:
o
+ Explicitly list tools required by build (where?): this
should work well because only the needed tools will be
initialized
+ if nothing explicitly specified, fall back to current method
We should also take the case into account where a user might set up a
"dummy" environment. Depending on which Toolchain seems to be available,
he then wants to setup his actual environments, or install additional
packages first, or...
I, personally, think that we don't need lazy initialization here. If we
give a user more option to control which Tools/Toolchains are probed in
which order, he can size down the effort for detecting stuff nicely. At
least, the latter (=toolchain control) should have higher priority over
the certainly nice and cool "lazy init" feature.
Doing things "lazy", also makes things like debugging, writing test
cases or creating issue reports a little harder...
* Within a tool:
*
o specify dependencies on other tools
What kind of dependencies are you thinking about? Module-wise,
method-wise or both? Is it more about data dependencies, or order
dependencies for the probing phase?
*
o detect existence on system reliably, and without modifying env
o
+ need better error messaging: ability to probe silently,
but also give sensible errors when needed
o constructor needs to allow args: version, path, ABI, etc.
(this is important)
o allow for common setup (all C compilers, etc.) as now
o tools should be versioned so user can check if up to date, etc.
* Tool chains:
*
o either-or
o and
o collections
* Platform
*
o How much do we need to know about the platform, for tools to
initialize themselves?
o Cross-compilation comes into this, but may be too much to
include as a general part of this project.
It's really hard to draw the line here. For my personal taste, we should
have a PlatformInfo with only the basic data about OS/CPU/RAM/Kernel and
the Python version we're running under.
Everything else, like "latest Java version" or "available
cross-compilers", should be handled by the rest of the toolchain/tools
stuff somehow.
In general, I just don't want to have things getting all muddy and
confused to fast. This will happen anyway down the road of
implementation, faster than we can think. ;)
So let's try to be as clear and concise as possible right now at the
beginning, and establish clear visions and borders about what we want to
do, and what not.
The PlatformInfo is a good example for this, where an apparent crippling
of functionality can save us some work, regarding the implementation
*and* explanation. Let's not forget that we also have to document all
this, in a clear and consistent manner!
*
o It may be useful to define toolchains and enable/disable them
by platform
o Of course the default toolchains need to be different by platform
+1!
*
o It may be possible for a default toolchain to just search for
all tools in a particular order and pick the first, as long as
the tool-dependency system is robust enough.
* Usability
*
o $CC etc. must never be left blank (without a prior
tool-missing error message at least) - this is a common problem
Do you want to introduce two classes of environment variables here, like
"never-empty vs. may-be-empty"?
*
o Must be backward compatible, at least for all common cases.
But improved functionality and greater ease of use has the higher
priority over backwards compatibility, right?
*
o Must not require any new user files (e.g. something in
site_scons) for normal operation
o Need a clear guide on requirements for new tools
o
+ how to make a a tool
+ how to include tests
* Considerations
*
o "batteries included?"
o
+ Each tool should do its best to set itself up, find
executables, etc.
+ What about SCons policy of not relying on $PATH? Maybe we
should relax that or have an option?
My idea here would be a command-line option that automatically adds the
current shell's $PATH to each created Environment, unless the user
explicitly states a different setting for ENV['PATH'] in the
Environment's constructor.
This would make it easier for a user to just "get things running", no
matter what kind of security/stability risks this would involve.
SCons itself should continue to stick to the principle of "clean
environments" as the default.
*
o minimum magic, maximum flexibility
o what about single tools? Should every tool be required to be
part of a toolchain (even if it's just one tool)? Maybe this
doesn't matter much.
I don't think this should be required. A user should be able to pick
freely from a list of Toolchains and single Tools what he wants to use
for his environment.
Finally, I'd like to add the two following points to the discussion,
even if they might be a little off-topic:
- We still have problems with tools/programs like "LaTeX" and the
"Docbook XSL stylesheets" that rely on relative paths, so the program
has to be executed in the same folder as the source/target file. Maybe
we can take up on the former work about getting SCons freed of all
"os.chdir"s, such that we could then implement a proper "chdir" feature
for Tools/Builders.
- The issue #1406 ( scons.tigris.org/issues/show_bug.cgi?id=1406 ) is
still open, raising the question how to handle paths with spaces when
they get passed in from the surrounding OS shell to a Tool's command or
include paths.
So much for today.
Best regards,
Dirk
_______________________________________________
Scons-dev mailing list
Scons-dev@scons.org
http://two.pairlist.net/mailman/listinfo/scons-dev