On 19/2/2024 00:49, Karl-Michael Schindler wrote:
I have a series of cross compilers which conflict with each other. Therefore, 
only one should be installed and installing one should replace the installed 
one with a Y/n question. How can I achieve this?

This is my current snippet with non-essentials removed:

foreach subarch {25 35 4 5 51 6} {
     subport “fpc-cross-avr${subarch}-embedded" {
         conflicts {
             fpc-cross-avr25-embedded
             fpc-cross-avr35-embedded
             fpc-cross-avr4-embedded
             fpc-cross-avr5-embedded
             fpc-cross-avr51-embedded
             fpc-cross-avr6-embedded
         }
         replaced_by {
             fpc-cross-avr25-embedded
             fpc-cross-avr35-embedded
             fpc-cross-avr4-embedded
             fpc-cross-avr5-embedded
             fpc-cross-avr51-embedded
             fpc-cross-avr6-embedded
         }
         build.args        CPU_TARGET=avr OS_TARGET=embedded 
SUBARCH=avr${subarch}
         destroot.args   CPU_TARGET=avr OS_TARGET=embedded SUBARCH=avr${subarch}
     }
}

But it does not work as intended. Any hints?

The braces mean that you're only passing a single value to conflicts and replaced_by. If you want to split the setting of a multi-valued option over multiple lines, use backslash line continuations.

You can't use multiple values for replaced_by currently, and if we did add support for that, the semantics would probably be that all the listed ports should be installed as the replacement for the current port. You don't want to set replaced_by in a port that you intend to be installable in its own right.

The best solution would be to make the subports not conflicting, but if that can't be achieved, you probably want something like this:

set subarchs [list 25 35 4 5 51 6]
set subnames [lmap s ${subarchs} {string cat fpc-cross-avr${s}-embedded}]
foreach subarch ${subarchs} subname ${subnames} {
    subport ${subname} {
        conflicts {*}[ldelete ${subnames} ${subname}]
build.args CPU_TARGET=avr OS_TARGET=embedded SUBARCH=avr${subarch} destroot.args CPU_TARGET=avr OS_TARGET=embedded SUBARCH=avr${subarch}
    }
}

- Josh

Reply via email to