It appears to be impossible to have a target that both:
1) sets toolsets conditionally
2) modifies dependencies conditional on _toolset.
i.e.
{
'conditions': [
['OS=="android"', {
'toolsets': ['host', 'target'],
}],
],
'target_conditions': [
['_toolset=="target"', {
'dependencies': ['foo'],
}].
],
}
doesn't work (it crashes with a KeyError), because dependency resolution
happens *before* target_conditions is processed, and therefore it's not
possible to add another dependency at this stage. However, it's also not
possible to test _toolset in conditions if toolsets is being modified in
conditions.
I discovered this as a theoretical issue when looking into how to make toolset
handling saner, but it's now come up as a practical problem: libpng in Chromium
needs to do this in order to use the Android cpufeatures library only when
building for target. We're going with a workaround for now of making libpng
(and its transitive dependencies) all build for host and target on all
platforms, but that's not nice..
I experimented with a bunch of things to try and fix this a while ago, but the
way that toolsets, toolset, and target_defaults interact during the various
phases of gyp processing is stupendously complicated and changing the slightest
thing appears to break some currently working case, so I gave up. Anyone else
want to try? :)
Original issue reported on code.google.com by torne@chromium.org on 9 Sep 2013 at 4:52
Original issue reported on code.google.com by
torne@chromium.org
on 9 Sep 2013 at 4:52