Blacklisting compiler versions or build numbers

Jeremy Huddleston Sequoia jeremyhu at macports.org
Sun Nov 25 18:11:40 PST 2012


On Nov 25, 2012, at 3:10 PM, Craig Treleaven <ctreleaven at cogeco.ca> wrote:

> At 11:48 AM -0500 11/25/12, Jeremy Huddleston Sequoia wrote:
>> On Nov 25, 2012, at 8:54 AM, Bradley Giesbrecht <pixilla at macports.org> wrote:
>> 
>>> On Nov 24, 2012, at 8:10 PM, Ryan Schmidt wrote:
>>> 
>>>> One idea that occurs to me is modifying the compiler.blacklist syntax. For example:
>>>> 
>>>> "compiler.blacklist clang" would blacklist all versions of clang, as it does now.
>>>> 
>>>> "compiler.blacklist clang<318.0.61" would blacklist clang builds less than 318.0.61 (cairo might use this).
>>>> 
>>>> "compiler.blacklist clang>=421.11.66" would blacklist clang builds greater than or equal to 421.11.66 (mpich might use this).
>>>> 
>>>> "compiler.blacklist 421.11.66<=clang<444" would blacklist clang builds greater than or equal to 421.11.66 and less than 444 (mpich might use this, if whatever clang bug it hit is fixed in some hypothetical future clang build 444).
>>> 
>>> 
>>> Would the last example be easier to write, read, debug and document as key/value pairs over two line?
>>> compiler.blacklist clang<444
>>> compiler.blacklist clang>=421.11.66
>> 
>> Unfortunately that won't work as the first would be overwritten by the second ... even with the use of -append, the default logic of the blacklist is "or" for each element.  I'd suggest that if the element is a list, then it is examined for versions.  If it is a literal, then the entire family is blacklisted.  I like something like this:
>> 
>> # All clang versions blacklisted
>> compiler.blacklist-append clang
>> 
>> # clang < 308 blacklisted:
>> compiler.blacklist-append {clang < 308}
>> 
>> # clang >= 421.11.66 and < 444 blacklisted
>> compiler.blacklist-append {clang >= 421.11.16 < 444}
> 
> Not sure how the parsing works for the last example.

Pseudocode for the parsing is essentially:
if is-list(l):
    if matches_all_versions(car(l), cdr(l))
        refuse_compiler(l)
else
    refuse_compiler(l)

matches_all_versions(c, vl):
    if is_empty_list(vl):
        return true
    if version_matches(c, car(vl), cadr(vl)):
        return matches_all_versions(c, cddr(vl))
    return false
    

>  For mythtv-core.25, I tested a bunch of compilers to find a few that worked.  Eg:
> 
> # See https://trac.macports.org/ticket/35934
> compiler.blacklist  llvm-gcc-4.2 macports-llvm-gcc-4.2 macports-clang-3.1 \
>                    dragonegg-3.0 dragonegg-3.1 apple-gcc-4.2
> compiler.fallback-append macports-clang-3.0
> 
> # Run time failures with XCode 4.4.x and 4.5.0
> if {[vercmp $xcodeversion 4.4] >= 0} {
>    compiler.blacklist-append clang
> }
> 
> # TODO: This should be done by base
> # https://trac.macports.org/ticket/32542
> if {${configure.compiler} == "macports-clang-3.0"} {
>    depends_build-append port:clang-3.0
>    depends_skip_archcheck-append clang-3.0
> }
> 
> Assuming that some future version of Apple clang starts working (say the "444", above), how would this be expressed?

Using my example:
compiler.blacklist-append {clang < 444}



More information about the macports-dev mailing list