This seems like it will be helpful.

On Feb 17 2014, at 05:55 , Magnus Ihse Bursie <magnus.ihse.bur...@oracle.com> 
wrote:

> One issue with configure currently is that it is a bit of a "all or nothing" 
> solution. Either you pass, and then you can build anything in the product, or 
> you do not pass (since some requirement is missing) and then you can build 
> nothing -- not even parts of the build that does not really require that 
> component. For instance, hotspot do not require cups, yet you can not build 
> just hotspot without having cups installed, since configure won't let you 
> pass.
> 
> For some of these issues, we have just ignored them, and forced the user to 
> install unneccessary requirements. For others, we have made more or less 
> hacky workarounds. For others still, we might skip a requirement if it is not 
> present, but are not clear about what will be missing.
> 
> Going forward, we will need to handle this in a more structured way.

Or said differently, we will have finer grained dependencies.

> Here is a proposal, on a very high level, on how we could address these 
> concerns.
> 
> We start by introducing two new concepts "environment requirements" (could 
> *really* need a better name!) and "components" (could perhaps need a better 
> name).

perhaps just "dependency" or "requirement"

> A "component" is something we will guarantee that it will run, e.g. 
> "build-jdk", "build-hotspot", "compare-script". If the configure script says 
> that "build-jdk" is enabled, then we have everything in place to be able to 
> build the jdk. If it says "compare-script" is enabled, then we can run the 
> compare script. We might also extend these to include testing, so if 
> "test-hotspot" is enabled then everything is present to be able to run 
> hotspot tests. (This is subject of a different debate; let's keep this 
> possibility in mind but not extend the discussion further on this for now.)
> 
> An "environment requirement" is the vague concept of "something that 
> configure checks". Typically, it is the presence of some kind of tool, e.g. 
> "bootjdk", "native-toolchain", "basic-tools", "objcopy", etc. But it could 
> just as well be some kind of other environmental check, like checking if the 
> build directory is on a network drive.
> 
> A component will have an associated list of environment requirements. For 
> instance, build-jdk would require basic-tools, bootjdk and native-toolchain, 
> etc. If a requirement is not found, configure can handle this in different 
> ways. If the component was essential, we will fail. If it was non-essential, 
> we will flag that component as disabled.

When I have encountered a component being disabled I was always surprised to 
learn of it later. I would personally probably always run in "enabled" "forced" 
mode to avoid surprises.

> More specifically, components  can be set to either "enabled" (or "forced", 
> "essential", "required"), "disabled" or "auto" (or "default", "if possible", 
> or..?). (We need to think about the names a bit...)
> * An enabled component must have all its environment requirements fullfilled. 
> If one or more of these are missing, configure will abort and will not allow 
> a build.
> * A disabled component will not have its requirements checked (unless if that 
> checking is done since it is needed by another, non-disabled component), and 
> will be flagged as disabled in the configure output, so you cannot for 
> instance try to build it using make.
> * An "auto" component will have its requirements checked, and will be enabled 
> if they are present, and disabled otherwise. Either case is fine and will 
> result in no warnings, but just some kind of information wether it succeeded 
> or not. This would typically be the default behaviour.
> 
> We will need some suitable set of options to configure to specify which 
> components should be enabled, disabled or auto. By default, our current 
> behavior should not change (so build-jdk will need to be enabled, and our 
> closed extensions would be "auto"). What constitutes a suitable command-line 
> UI to this functionality is left to be examined.

Presumably it will be transitive so if I specify a component "openjdk-images" 
or "oraclejdk-images" it will check configuration of all components that the 
named components depend upon.

> We would like the configure script to continue to fail-fast as much as 
> possible, so as soon as we find that we cannot fulfil an environment 
> requirement of an enabled (essential) component, we will fail.

+1 for fast-fail.

> Some kind of dependency between components is likely to be needed. For 
> instance "build-jdk" depends on "build-hotspot", and we have closed-only 
> extensions that depend on e.g. build-jdk. These dependencies can be satisfied 
> either by building with make, or with prebuilt packages. We already have 
> --with-import-hotspot, which should probably be remodeled to fit better into 
> this scheme. Continuing this path to far leads us to re-implement Maven :-), 
> so we need to take care to only actually solve the problems we actually need 
> to.

Maven IS too far. ;-)

Mike

Reply via email to