Skip to content

Commit 5a11974

Browse files
committed
Add more host system detection
1 parent 897ff1c commit 5a11974

File tree

6 files changed

+101
-68
lines changed

6 files changed

+101
-68
lines changed

src/main/java/org/gradlex/javamodule/packaging/JavaModulePackagingExtension.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.gradle.nativeplatform.MachineArchitecture;
4949
import org.gradle.nativeplatform.OperatingSystemFamily;
5050
import org.gradle.testing.base.TestSuite;
51+
import org.gradlex.javamodule.packaging.internal.HostIdentification;
5152
import org.gradlex.javamodule.packaging.model.Target;
5253
import org.gradlex.javamodule.packaging.tasks.Jpackage;
5354
import org.gradlex.javamodule.packaging.tasks.ValidateHostSystemAction;
@@ -274,15 +275,21 @@ private void registerTargetSpecificTasks(Target target, String applicationJarTas
274275
t.setJvmArgs(application.getApplicationDefaultJvmArgs());
275276
t.classpath(tasks.named("jar"), runtimeClasspath);
276277
});
278+
maybeAddJpackageLifecycleTask(tasks, target, jpackage);
279+
}
277280

278-
String targetAssembleLifecycle = "assemble" + capitalize(target.getName());
279-
if (!tasks.getNames().contains(targetAssembleLifecycle)) {
280-
tasks.register(targetAssembleLifecycle, t -> {
281+
private void maybeAddJpackageLifecycleTask(TaskContainer tasks, Target target, TaskProvider<Jpackage> jpackage) {
282+
// if a task already exists, do nothing to avoid conflciting with other plugins
283+
if (tasks.getNames().contains("jpackage")) {
284+
return;
285+
}
286+
if (HostIdentification.isHostTarget(target)) {
287+
tasks.register("jpackage", t -> {
281288
t.setGroup(BUILD_GROUP);
282-
t.setDescription("Builds this project for " + target.getName());
289+
t.setDescription("Build the package for the current host system");
290+
t.dependsOn(jpackage);
283291
});
284292
}
285-
tasks.named(targetAssembleLifecycle, t -> t.dependsOn(jpackage));
286293
}
287294

288295
private Configuration maybeCreateInternalConfiguration() {

src/main/java/org/gradlex/javamodule/packaging/JavaModulePackagingPlugin.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.gradle.api.tasks.SourceSetContainer;
2525
import org.gradle.jvm.toolchain.JavaToolchainService;
2626
import org.gradle.util.GradleVersion;
27+
import org.gradlex.javamodule.packaging.internal.HostIdentification;
2728

2829
import javax.inject.Inject;
2930

@@ -50,14 +51,6 @@ public void apply(Project project) {
5051
javaModulePackaging.getJpackageResources().convention(project.provider(() ->
5152
project.getLayout().getProjectDirectory().dir(mainResources.getSrcDirs().iterator().next().getParent() + "/resourcesPackage")));
5253
javaModulePackaging.getVerbose().convention(false);
53-
54-
configureConventionsForCurrentHost();
55-
}
56-
57-
private void configureConventionsForCurrentHost() {
58-
// A few conveniences for local development
59-
60-
61-
54+
javaModulePackaging.primaryTarget(HostIdentification.hostTarget(project.getObjects()));
6255
}
6356
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* Copyright the GradleX team.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.gradlex.javamodule.packaging.internal;
18+
19+
import org.gradle.api.model.ObjectFactory;
20+
import org.gradle.nativeplatform.MachineArchitecture;
21+
import org.gradle.nativeplatform.OperatingSystemFamily;
22+
import org.gradlex.javamodule.packaging.model.Target;
23+
24+
import java.util.Locale;
25+
26+
public class HostIdentification {
27+
28+
public static void validateHostSystem(String arch, String os) {
29+
String hostOs = hostOs();
30+
String hostArch = hostArch();
31+
32+
if (!normalizeOs(hostOs).equals(normalizeOs(os))) {
33+
wrongHostSystemError(hostOs, os);
34+
}
35+
if (!normalizeArch(hostArch).equals(normalizeArch(arch))) {
36+
wrongHostSystemError(hostArch, arch);
37+
}
38+
}
39+
40+
public static Target hostTarget(ObjectFactory objects) {
41+
Target host = objects.newInstance(Target.class, "host");
42+
host.getOperatingSystem().convention(hostOs());
43+
host.getArchitecture().convention(normalizeArch(System.getProperty("os.arch")));
44+
return host;
45+
}
46+
47+
public static boolean isHostTarget(Target target) {
48+
return target.getOperatingSystem().get().equals(hostOs())
49+
&& target.getArchitecture().get().equals(normalizeArch(hostArch()));
50+
}
51+
52+
private static String hostOs() {
53+
return normalizeOs(System.getProperty("os.name"));
54+
}
55+
56+
private static String hostArch() {
57+
return System.getProperty("os.arch");
58+
}
59+
60+
private static String normalizeOs(String name) {
61+
String os = name.toLowerCase(Locale.ROOT).replace(" ", "");
62+
if (os.contains("windows")) {
63+
return OperatingSystemFamily.WINDOWS;
64+
}
65+
if (os.contains("macos") || os.contains("darwin") || os.contains("osx")) {
66+
return OperatingSystemFamily.MACOS;
67+
}
68+
return OperatingSystemFamily.LINUX;
69+
}
70+
71+
private static String normalizeArch(String name) {
72+
String arch = name.toLowerCase(Locale.ROOT);
73+
if (arch.contains("aarch")) {
74+
return MachineArchitecture.ARM64;
75+
}
76+
if (arch.contains("64")) {
77+
return MachineArchitecture.X86_64;
78+
}
79+
return MachineArchitecture.X86;
80+
}
81+
82+
private static void wrongHostSystemError(String hostOs, String os) {
83+
throw new RuntimeException("Running on " + hostOs + "; cannot build for " + os);
84+
}
85+
}

src/main/java/org/gradlex/javamodule/packaging/internal/Validator.java

Lines changed: 0 additions & 52 deletions
This file was deleted.

src/main/java/org/gradlex/javamodule/packaging/tasks/Jpackage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
import static java.util.Objects.requireNonNull;
5252
import static org.gradle.nativeplatform.OperatingSystemFamily.WINDOWS;
53-
import static org.gradlex.javamodule.packaging.internal.Validator.validateHostSystem;
53+
import static org.gradlex.javamodule.packaging.internal.HostIdentification.validateHostSystem;
5454

5555
@CacheableTask
5656
abstract public class Jpackage extends DefaultTask {

src/main/java/org/gradlex/javamodule/packaging/tasks/ValidateHostSystemAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import java.util.Map;
2323

24-
import static org.gradlex.javamodule.packaging.internal.Validator.validateHostSystem;
24+
import static org.gradlex.javamodule.packaging.internal.HostIdentification.validateHostSystem;
2525

2626
public class ValidateHostSystemAction implements Action<Task> {
2727
@Override

0 commit comments

Comments
 (0)