Skip to content

Commit b17e188

Browse files
authored
addTargetPlatformVariant optionally accepts a feature name (#230)
1 parent 2b5f26b commit b17e188

File tree

4 files changed

+65
-5
lines changed

4 files changed

+65
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* [Adjusted Rule] [#174](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/174) jakarta.xml.ws-api and jakarta.xml.ws-api merger is now considered (Thanks [KO](https://github.com/ko-at-work) for reporting)
99
* [Adjusted Rule] [#201](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/201) Add woodstox:wstx-lgpl to WOODSTOX
1010
* [Adjusted Rule] [#202](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/202) Remove org.apache.tomcat:tomcat-websocket from JAVAX_WEBSOCKET_API
11+
* [New] [#229](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/229) Patching: addTargetPlatformVariant optionally accepts a feature name
1112
* [Fix] [#196](https://github.com/gradlex-org/jvm-dependency-conflict-resolution/issues/196) No longer call eager methods on configurations container (Thanks [Ian Brandt](https://github.com/ianbrandt) for reporting)
1213

1314
## Version 2.2

src/main/java/org/gradlex/jvm/dependency/conflict/resolution/PatchModule.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,17 @@ public void addFeature(String classifier) {
145145
* See: <a href="https://docs.gradle.org/current/userguide/component_metadata_rules.html#adding_variants_for_native_jars">component_metadata_rules.html#adding_variants_for_native_jars</a>
146146
*/
147147
public void addTargetPlatformVariant(String classifier, String operatingSystem, String architecture) {
148-
getDependencies().getComponents().withModule(module, AddTargetPlatformVariantsMetadataRule.class, r -> r.params(classifier, operatingSystem, architecture));
148+
getDependencies().getComponents().withModule(module, AddTargetPlatformVariantsMetadataRule.class, r -> r.params("", classifier, operatingSystem, architecture));
149+
}
150+
151+
/**
152+
* Make the Jar with the give 'classifier' known as additional variant with the
153+
* OperatingSystemFamily and MachineArchitecture attributes set.
154+
* A 'feature' (aka Capability) can optionally be defined to require the variant to be addressed by it.
155+
* See: <a href="https://docs.gradle.org/current/userguide/component_metadata_rules.html#adding_variants_for_native_jars">component_metadata_rules.html#adding_variants_for_native_jars</a>
156+
*/
157+
public void addTargetPlatformVariant(String feature, String classifier, String operatingSystem, String architecture) {
158+
getDependencies().getComponents().withModule(module, AddTargetPlatformVariantsMetadataRule.class, r -> r.params(feature, classifier, operatingSystem, architecture));
149159
}
150160

151161
/**

src/main/java/org/gradlex/jvm/dependency/conflict/resolution/rules/AddTargetPlatformVariantsMetadataRule.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
@CacheableRule
3939
public abstract class AddTargetPlatformVariantsMetadataRule implements ComponentMetadataRule {
4040

41+
private final String feature;
4142
private final String classifier;
4243
private final String operatingSystem;
4344
private final String architecture;
@@ -46,7 +47,8 @@ public abstract class AddTargetPlatformVariantsMetadataRule implements Component
4647
abstract protected ObjectFactory getObjects();
4748

4849
@Inject
49-
public AddTargetPlatformVariantsMetadataRule(String classifier, String operatingSystem, String architecture) {
50+
public AddTargetPlatformVariantsMetadataRule(String feature, String classifier, String operatingSystem, String architecture) {
51+
this.feature = feature;
5052
this.classifier = classifier;
5153
this.operatingSystem = operatingSystem;
5254
this.architecture = architecture;
@@ -56,6 +58,9 @@ public AddTargetPlatformVariantsMetadataRule(String classifier, String operating
5658
public void execute(ComponentMetadataContext context) {
5759
ComponentMetadataDetails details = context.getDetails();
5860
if (classifier.isEmpty()) {
61+
if (!feature.isEmpty()) {
62+
throw new IllegalStateException("if classifier is empty, feature must be empty too.");
63+
}
5964
details.withVariant("compile", this::configureAttributes);
6065
details.withVariant("runtime", this::configureAttributes);
6166
} else {
@@ -65,10 +70,17 @@ public void execute(ComponentMetadataContext context) {
6570
}
6671

6772
private void addTargetPlatformVariant(ComponentMetadataDetails details, String nameSuffix, String baseVariant) {
73+
String group = details.getId().getGroup();
6874
String name = details.getId().getName();
6975
String version = details.getId().getVersion();
7076

7177
details.addVariant(classifier + nameSuffix, baseVariant, variant -> {
78+
if (!feature.isEmpty()) {
79+
variant.withCapabilities(c -> {
80+
c.removeCapability(group, name);
81+
c.addCapability(group, name + "-" + feature, version);
82+
});
83+
}
7284
configureAttributes(variant);
7385
variant.withFiles(files -> {
7486
files.removeAllFiles();

src/test/groovy/org/gradlex/jvm/dependency/conflict/test/patch/AddTargetPlatformVariantTest.groovy

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.gradlex.jvm.dependency.conflict.test.patch
22

33
class AddTargetPlatformVariantTest extends AbstractPatchTest {
4+
45
def "can add target variant"() {
56
given:
67
buildFile << """
@@ -22,11 +23,47 @@ class AddTargetPlatformVariantTest extends AbstractPatchTest {
2223
dependencies {
2324
implementation("org.openjfx:javafx-base:17.0.10")
2425
}
26+
tasks.register("printJars") {
27+
println(configurations.compileClasspath.get().files.joinToString("\\n") { it.name });
28+
}
29+
"""
30+
31+
expect:
32+
String output = printJars().output
33+
output == 'javafx-base-17.0.10-win.jar\n'
34+
}
35+
36+
def "can add target variant with feature name"() {
37+
given:
38+
buildFile << """
39+
jvmDependencyConflicts {
40+
patch {
41+
module("org.lwjgl:lwjgl") {
42+
addTargetPlatformVariant("natives", "natives-linux", "linux", "x86-64")
43+
addTargetPlatformVariant("natives", "natives-linux-arm64", "linux", "aarch64")
44+
addTargetPlatformVariant("natives", "natives-macos", "macos", "x86-64")
45+
addTargetPlatformVariant("natives", "natives-macos-arm64", "macos", "aarch64")
46+
addTargetPlatformVariant("natives", "natives-windows", "windows", "x86-64")
47+
addTargetPlatformVariant("natives", "natives-windows-arm64", "windows", "aarch64")
48+
}
49+
}
50+
}
51+
configurations.runtimeClasspath {
52+
attributes.attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named("windows"))
53+
attributes.attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named("x86-64"))
54+
}
55+
dependencies {
56+
implementation("org.lwjgl:lwjgl:3.3.6")
57+
runtimeOnly("org.lwjgl:lwjgl:3.3.6") { capabilities { requireCapability("org.lwjgl:lwjgl-natives") } }
58+
}
59+
tasks.register("printJars") {
60+
println(configurations.runtimeClasspath.get().files.joinToString("\\n") { it.name });
61+
}
2562
"""
2663

2764
expect:
28-
String output = dependencyInsight("org.openjfx:javafx-base").output
29-
output.contains 'windows'
30-
output.contains 'x86-64'
65+
dependenciesCompile()
66+
String output = printJars().output
67+
output == 'lwjgl-3.3.6.jar\nlwjgl-3.3.6-natives-windows.jar\n'
3168
}
3269
}

0 commit comments

Comments
 (0)