Boost logo

Boost-Build :

Subject: Re: [Boost-build] Interface for configuration framework
From: Johan Nilsson (r.johan.nilsson_at_[hidden])
Date: 2010-03-18 05:28:23


Vladimir Prus wrote:
> Folks,
>
> now that we've more or less decided how named parameters should look,
> then
> next question is how the interface for configuration framework should
> work.
> To remind, the goal is to perform various checks of environment, and
> decide what should be built and how based on that -- and, importantly,
> have a simple and consistent interface for that.
>
> Here's how a zeroeth approximation look like:
>
> exe long_double_check : has_long_long.cpp ;
>
> lib boost_math_tr1l : ...sources... :
> [ check-target-builds long_double_check : : <build>no ] ;
>
> The 'check-target-builds' thing takes three parameters -- target id,
> "true-properties" and "false-properties". When boost_math_tr1l
> metarget
> is generated, the long_double_check will be also generated and
> immediately
> built. If the built is successfull, then 'true-properties' will be
> added
> to build properties for boost_math_tr1l -- and 'false-properties' will
> be added otherwise. So, the above code has the effect of skipping
> boost_math_tr1l is the long_double_check target fails to build.

The above worries me a bit.

I almost exclusively build with "-q" to force immediate build cancellation
on failure - that would mean that if long_double_check fails to build I
wouldn't get any further at all, with any "later" target. Unless the
check-target-builds somehow marks the "long_double_check" metatarget as
"nocare" or whatever?

> For avoidance of doubt -- this actually already works now. Contrary
> to what I have though before, it's not even a big change.

Sounds promising.

> This example illustates something that I think is an important point
> --
> separation between actual checks, and logic that alters build of
> other targets. Here, "long_double_check" is the actual check.
> On the other hand, use of "check-target-builds" allows to adjust
> any metatarget depending on the outcome of the test -- and the
> test does not have to be repeated.
>
> However, this interface does not make it easy to emit sensible
> messages.
> It would like to see this when building:
>
> Performing configuration checks
>
> - long double : no
>
> Component summary
>
> - math : building
> long long libraries skipped
>
>
> And for that to work, we need to specify more detail, e.g:
>
> check-exe long_double_check "long double" : has_long_long.cpp ;
>
> lib boost_math_tr1l : ...sources... :
> [ check-target-builds long_double_check :
> : <build>no <message>"long long libraries skipped"
> <component>math ] ;
>
> Does this seem passable? I think that adding 'human name' to
> long_double_check target is not an issue, but the check-target-builds
> interface makes me nervous.

It doesn't look very obvious and is more verbose than desired, IMHO. Just to
make things worse I started playing around a bit with a more "familiar"
interface (probably a couple of syntax errors around here):

---
probe-target long_double_check
    : sources
      has_long_long.cpp
    # We should really have something called "attributes" or "properties" -
    # labelling the below properties "requirements" doesn't feel quite right
...
    : requirements
    <type>exe
    <displayname>"long double"
    ;
lib boost_math_tr1l
     : ...sources...
     : requirements
    <target-builds>long_double_check/<component>math/<message-fail>"long
long libraries skipped"
    ;
--- 
or:
---
[snip definition of long_double_check]
alias long_double_check_for_math
    : long_double_check
    : requirements
    <component>math
    <message-fail>"long long libraries skipped" ;
lib boost_math_tr1l
     : ...sources...
     : requirements
    <target-builds>long_double_check_for_math
    ;
---
which might enable conditional stuff such as:
---
alias long_double_check_for_math :
    long_double_check
    : requirements
    <component>math
    <message-fail>"using emulated long long libraries"
    <message-ok>"using native long long libraries"
    ;
lib boost_math_tr1l
     : ...sources...
     : requirements
    <target-builds>long_double_check_for_math:<library>native_long_double
    <target-builds-not>long_double_check_for_math:<library>emulated_long_double
    ;
---
(yes, there are details to be fleshed out)
> I guess that <component> can be a requirements in Boost.Math Jamfile,
> so that
> it's not repeated for every target that might need configure checks,
> leading to:
>
> lib boost_math_tr1l : ...sources... :
>    [ check-target-builds long_double_check :
>          : <build>no <message>"long long libraries skipped" ] ;
>
> Also, it might be good to provide a less generic mechanism for
> skipping a
> target, for example:
>
> lib boost_math_tr1l : ...sources... :
>    [ demand-target-builds long_double_check : "long long libraries
> are skipped" ] ;
>
> How does that look? Again, it assumes <component>math is in
> Boost.Math requirements.
The latter, simple, case looks ok. I agree with Spencer's comment about
using "require" instead of "demand", though.
>
> Another question is about naming. I assume the most common checks
> will be 'does this target builds' and 'is 3rd party library XXX
> available'. And there are two variants for each check -- one were you
> can specify true-properties and false-properties, and one that just
> skips a target. So far, I propose this naming:
>
> check-target-builds <target> : <true-properties> : <false-properties>
>    ; demand-target-builds <target> : message ;
>
>    check-module <module-name> : <true-properties> :
> <false-properties> ; demand-module <module-name> : message ;
>
> Does this naming sufficiently reflects the differences in semantics?
As above - "require" fits better that "demand". Also, just to add some
alternatives:
check-target-builds => target-builds
check-module => module-exists
(which would then imply "require-target-builds", "require-module-exists")
HTH / Johan

Boost-Build list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk