diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/AppCompiler.java b/compiler/compiler/src/main/java/org/robovm/compiler/AppCompiler.java index a9e51ad7a..9bef0847e 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/AppCompiler.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/AppCompiler.java @@ -24,12 +24,8 @@ import org.json.simple.JSONObject; import org.json.simple.JSONValue; import org.robovm.compiler.clazz.*; -import org.robovm.compiler.config.Arch; -import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.*; import org.robovm.compiler.config.Config.TreeShakerMode; -import org.robovm.compiler.config.ForceLinkMethodsConfig; -import org.robovm.compiler.config.OS; -import org.robovm.compiler.config.Resource; import org.robovm.compiler.config.StripArchivesConfig.StripArchivesBuilder; import org.robovm.compiler.log.ConsoleLogger; import org.robovm.compiler.plugin.LaunchPlugin; @@ -753,14 +749,15 @@ public static void main(String[] args) throws IOException { if (!"auto".equals(s)) { archs.add(Arch.valueOf(s)); } + } else if ("-env".equals(args[i])) { + String s = args[++i]; + builder.env(Environment.valueOf(s)); } else if ("-archs".equals(args[i])) { for (String s : args[++i].split(":")) { if (!"auto".equals(s)) { archs.add(Arch.valueOf(s)); } } -// } else if ("-cpu".equals(args[i])) { -// builder.cpu(args[++i]); } else if ("-target".equals(args[i])) { String s = args[++i]; builder.targetType("auto".equals(s) ? null : s); @@ -1107,9 +1104,9 @@ private static void printUsageAndExit(String errorMessage, List plugins) System.err.println(" -archs : separated list of archs. Used to build a fat binary which\n" + " includes all the specified archs. Allowed values\n" + " are 'x86', 'x86_64', 'thumbv7', 'arm64'."); - System.err.println(" -cpu The name of the LLVM cpu to compile for. The LLVM default\n" - + " is used if not specified. Use llc to determine allowed values."); - System.err.println(" -target The target to build for. One of:\n" + System.err.println(" -env The name platform environment. Allowed values\n" + + " are 'Native', 'Simulator'. Default is 'Native'"); + System.err.println(" -target The target to build for. One of:\n" + " 'auto', '" + StringUtils.join(targets, "', '") + "'\n" + " The default is 'auto' which means use -os to decide."); System.err.println(" -forcelinkclasses \n" diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/ClassCompiler.java b/compiler/compiler/src/main/java/org/robovm/compiler/ClassCompiler.java index 7bef2a50f..668b84a24 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/ClassCompiler.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/ClassCompiler.java @@ -25,6 +25,7 @@ import org.robovm.compiler.clazz.MethodInfo; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.llvm.Alias; import org.robovm.compiler.llvm.AliasRef; @@ -294,9 +295,11 @@ public void compile(Clazz clazz, Executor executor, ClassCompilerListener listen Arch arch = config.getArch(); OS os = config.getOs(); + Environment env = config.getEnv(); try { - config.getLogger().info("Compiling %s (%s %s %s)", clazz, os, arch, config.isDebug() ? "debug" : "release"); + config.getLogger().info("Compiling %s (%s %s%s %s)", clazz, os, arch, env.asLlvmSuffix("-"), + config.isDebug() ? "debug" : "release"); output.reset(); compile(clazz, output); } catch (Throwable t) { diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/config/Arch.java b/compiler/compiler/src/main/java/org/robovm/compiler/config/Arch.java index 592dfd3b0..4a03d6b81 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/config/Arch.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/config/Arch.java @@ -87,6 +87,10 @@ public static Arch getDefaultArch() { if (hostTriple.matches("^(x86|i\\d86).*")) { return Arch.x86; } + if (hostTriple.matches("^(arm-apple-darwin).*")) { + // MacOSX m1 CPU + return Arch.arm64; + } throw new CompilerException("Unrecognized arch in host triple: " + hostTriple); } } diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/config/Config.java b/compiler/compiler/src/main/java/org/robovm/compiler/config/Config.java index c9c7e05c3..f55879851 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/config/Config.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/config/Config.java @@ -237,6 +237,7 @@ public enum TreeShakerMode { private transient Config configBeforeBuild; private transient DependencyGraph dependencyGraph; private transient Arch sliceArch; + private transient Environment env = Environment.Native; private transient StripArchivesBuilder stripArchivesBuilder; protected Config(UUID uuid) { @@ -305,6 +306,10 @@ public File getCcBinPath() { public OS getOs() { return os; } + + public Environment getEnv() { + return env; + } public Arch getArch() { return sliceArch; @@ -314,13 +319,23 @@ public List getArchs() { return archs == null ? Collections.emptyList() : Collections.unmodifiableList(archs); } - + public String getTriple() { - return sliceArch.getLlvmName() + "-unknown-" + os.getLlvmName(); + return getTriple(os.getMinVersion()); + } + + public String getTriple(String minVersion) { + return sliceArch.getLlvmName() + "-" + os.getVendor() + "-" + os.getLlvmName() + minVersion + + env.asLlvmSuffix("-"); } public String getClangTriple() { - return sliceArch.getClangName() + "-unknown-" + os.getLlvmName(); + return getClangTriple(os.getMinVersion()); + } + + public String getClangTriple(String minVersion) { + return sliceArch.getClangName() + "-" + os.getVendor() + "-" + os.getLlvmName() + minVersion + + env.asLlvmSuffix("-"); } public DataLayout getDataLayout() { @@ -995,7 +1010,7 @@ private Config build() throws IOException { dataLayout = new DataLayout(getTriple()); osArchDepLibDir = new File(new File(home.libVmDir, os.toString()), - sliceArch.toString()); + sliceArch.toString() + env.asLlvmSuffix("-")); if (treeShakerMode != null && treeShakerMode != TreeShakerMode.none && os.getFamily() == Family.darwin && sliceArch == Arch.x86) { @@ -1014,7 +1029,9 @@ private Config build() throws IOException { this.tmpDir = ramDiskTools.getTmpDir(); File osDir = new File(cacheDir, os.toString()); - File archDir = new File(osDir, sliceArch.toString()); + String archName = (env != null && !env.getLlvmName().isEmpty()) ? sliceArch.toString() + "-" + env.getLlvmName() : + sliceArch.toString(); + File archDir = new File(osDir, archName); osArchCacheDir = new File(archDir, debug ? "debug" : "release"); osArchCacheDir.mkdirs(); @@ -1232,6 +1249,11 @@ public Builder os(OS os) { return this; } + public Builder env(Environment env) { + config.env = env; + return this; + } + public Builder arch(Arch arch) { return archs(arch); } diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/config/Environment.java b/compiler/compiler/src/main/java/org/robovm/compiler/config/Environment.java new file mode 100644 index 000000000..08ca0a0f8 --- /dev/null +++ b/compiler/compiler/src/main/java/org/robovm/compiler/config/Environment.java @@ -0,0 +1,24 @@ +package org.robovm.compiler.config; + +/** + * Specifies environment kind build/deployment is targeted + * @author dkimitsa + */ +public enum Environment { + Native(""), + Simulator("simulator"); + + private final String llvmName; + + Environment(String llvmName) { + this.llvmName = llvmName; + } + + public String getLlvmName() { + return llvmName; + } + + public String asLlvmSuffix(String prefix) { + return (llvmName != null && !llvmName.isEmpty()) ? (prefix + llvmName) : ""; + } +} diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/config/OS.java b/compiler/compiler/src/main/java/org/robovm/compiler/config/OS.java index dcc1eb910..ce88ca9a8 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/config/OS.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/config/OS.java @@ -23,22 +23,30 @@ * */ public enum OS { - linux("linux", "linux"), macosx("macosx10.9.0", "10.9"), ios("ios8.0.0", "8.0"); + linux("linux", "unknown","linux"), + macosx("macosx", "apple", "10.9"), + ios("ios", "apple", "8.0"); public enum Family {linux, darwin} private final String llvmName; + private final String vendor; private final String minVersion; - private OS(String llvmName, String minVersion) { + private OS(String llvmName, String vendor, String minVersion) { this.llvmName = llvmName; + this.vendor = vendor; this.minVersion = minVersion; } public String getLlvmName() { return llvmName; } - + + public String getVendor() { + return vendor; + } + public String getMinVersion() { return minVersion; } diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/plugin/debug/DebuggerLaunchPlugin.java b/compiler/compiler/src/main/java/org/robovm/compiler/plugin/debug/DebuggerLaunchPlugin.java index 20418e9da..4d5834998 100644 --- a/compiler/compiler/src/main/java/org/robovm/compiler/plugin/debug/DebuggerLaunchPlugin.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/plugin/debug/DebuggerLaunchPlugin.java @@ -121,7 +121,7 @@ public void beforeLaunch(Config config, LaunchParameters parameters) { File appDir = new File(config.isSkipInstall() ? config.getTmpDir() : config.getInstallDir(), config.getExecutableName() + ".app"); builder.setAppfile(new File(appDir, config.getExecutableName())); - if (IOSTarget.isSimulatorArch(target.getArch())) { + if (IOSTarget.isSimulatorArch(config.getArch(), config.getEnv())) { // launching on simulator, it can write down port number to file on local system File hooksPortFile; try { diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/target/ConsoleTarget.java b/compiler/compiler/src/main/java/org/robovm/compiler/target/ConsoleTarget.java index f46c212c5..e308aa504 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/target/ConsoleTarget.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/target/ConsoleTarget.java @@ -104,7 +104,7 @@ protected void doBuild(File outFile, List ccArgs, throws IOException { if (config.getOs() == OS.macosx) { - ccArgs.add("-mmacosx-version-min=" + config.getOs().getMinVersion()); + ccArgs.add("--target=" + config.getClangTriple()); if (config.getArch() == Arch.x86 || config.isDebug()) { ccArgs.add("-Wl,-no_pie"); } diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/target/Target.java b/compiler/compiler/src/main/java/org/robovm/compiler/target/Target.java index 2bb9411a5..ddc08592c 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/target/Target.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/target/Target.java @@ -24,6 +24,7 @@ import org.robovm.compiler.clazz.Path; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; /** @@ -56,6 +57,15 @@ public interface Target { */ Arch getArch(); + /** + * @return the {@link Environment} this {@link Target} will build for. Used + * to differ target with same {@link Arch}. + * For ex. Arm64 iOS device and Arm64 m1 iOS simulator + */ + default Environment getEnv() { + return Environment.Native; + } + /** * Returns a list of the default archs to build for if no archs have been * specified in the {@link Config}. Returns an empty list if there are no diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/target/framework/FrameworkTarget.java b/compiler/compiler/src/main/java/org/robovm/compiler/target/framework/FrameworkTarget.java index 44d99b3ff..7154babb2 100644 --- a/compiler/compiler/src/main/java/org/robovm/compiler/target/framework/FrameworkTarget.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/target/framework/FrameworkTarget.java @@ -7,9 +7,8 @@ import org.robovm.compiler.clazz.Path; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; -import org.robovm.compiler.log.Logger; -import org.robovm.compiler.log.LoggerProxy; import org.robovm.compiler.target.AbstractTarget; import org.robovm.compiler.target.ios.SDK; import org.robovm.compiler.util.Executor; @@ -21,12 +20,16 @@ import java.util.Collections; import java.util.List; +import static org.robovm.compiler.target.ios.IOSTarget.isDeviceArch; +import static org.robovm.compiler.target.ios.IOSTarget.isSimulatorArch; + public class FrameworkTarget extends AbstractTarget { public static final String TYPE = "framework"; private OS os; private Arch arch; + private Environment env; private SDK sdk; public FrameworkTarget() { @@ -47,22 +50,18 @@ public Arch getArch() { return arch; } + @Override + public Environment getEnv() { + return env; + } + @Override public boolean canLaunch() { return false; } - public static boolean isSimulatorArch(Arch arch) { - return arch == Arch.x86 || arch == Arch.x86_64; - } - - public static boolean isDeviceArch(Arch arch) { - return arch == Arch.thumbv7 || arch == Arch.arm64; - } - - public List getSDKs() { - if (isSimulatorArch(arch)) { + if (isSimulatorArch(arch, env)) { return SDK.listSimulatorSDKs(); } else { return SDK.listDeviceSDKs(); @@ -80,6 +79,8 @@ public void init(Config paramConfig) { if (arch == null) arch = Arch.getDefaultArch(); + env = config.getEnv(); + if (os.getFamily() != OS.Family.darwin) throw new IllegalArgumentException("Frameworks can only be built for Darwin platforms"); @@ -92,7 +93,7 @@ public void init(Config paramConfig) { List sdks = getSDKs(); if (sdkVersion == null) { if (sdks.isEmpty()) { - throw new IllegalArgumentException("No " + (isDeviceArch(arch) ? "device" : "simulator") + throw new IllegalArgumentException("No " + (isDeviceArch(arch, env) ? "device" : "simulator") + " SDKs installed"); } Collections.sort(sdks); @@ -133,17 +134,14 @@ protected List getTargetCcArgs() { List ccArgs = new ArrayList(); ccArgs.add("-stdlib=libc++"); - - if (isDeviceArch(arch)) { - ccArgs.add("-miphoneos-version-min=" + getMinimumOSVersion()); - if (config.isEnableBitcode()) { - // tells clang to keep bitcode while linking - ccArgs.add("-fembed-bitcode"); - } - } else { - ccArgs.add("-mios-simulator-version-min=" + getMinimumOSVersion()); + + ccArgs.add("--target=" + config.getClangTriple(getMinimumOSVersion())); + + if (isDeviceArch(arch, env) && config.isEnableBitcode()) { + // tells clang to keep bitcode while linking + ccArgs.add("-fembed-bitcode"); } - + ccArgs.add("-isysroot"); ccArgs.add(sdk.getRoot().getAbsolutePath()); diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/target/ios/IOSTarget.java b/compiler/compiler/src/main/java/org/robovm/compiler/target/ios/IOSTarget.java index e29185066..4e4ccc028 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/target/ios/IOSTarget.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/target/ios/IOSTarget.java @@ -26,19 +26,13 @@ import com.dd.plist.PropertyListParser; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; import org.apache.commons.io.filefilter.AndFileFilter; import org.apache.commons.io.filefilter.PrefixFileFilter; import org.apache.commons.io.filefilter.RegexFileFilter; import org.apache.commons.io.filefilter.SuffixFileFilter; import org.apache.commons.lang3.tuple.Pair; import org.robovm.compiler.CompilerException; -import org.robovm.compiler.config.AppExtension; -import org.robovm.compiler.config.Arch; -import org.robovm.compiler.config.Config; -import org.robovm.compiler.config.OS; -import org.robovm.compiler.config.Resource; -import org.robovm.compiler.config.WatchKitApp; +import org.robovm.compiler.config.*; import org.robovm.compiler.log.Logger; import org.robovm.compiler.target.AbstractTarget; import org.robovm.compiler.target.LaunchParameters; @@ -96,6 +90,7 @@ public class IOSTarget extends AbstractTarget { public static final String TYPE = "ios"; private Arch arch; + private Environment env; private SDK sdk; private File entitlementsPList; private SigningIdentity signIdentity; @@ -114,20 +109,25 @@ public Arch getArch() { return arch; } + @Override + public Environment getEnv() { + return env; + } + @Override public LaunchParameters createLaunchParameters() { - if (isSimulatorArch(arch)) { + if (isSimulatorArch(arch, env)) { return new IOSSimulatorLaunchParameters(); } return new IOSDeviceLaunchParameters(); } - public static boolean isSimulatorArch(Arch arch) { - return arch == Arch.x86 || arch == Arch.x86_64; + public static boolean isSimulatorArch(Arch arch, Environment env) { + return env == Environment.Simulator && (arch == Arch.x86 || arch == Arch.x86_64 || arch == Arch.arm64); } - public static boolean isDeviceArch(Arch arch) { - return arch == Arch.thumbv7 || arch == Arch.arm64; + public static boolean isDeviceArch(Arch arch, Environment env) { + return env == Environment.Native && (arch == Arch.thumbv7 || arch == Arch.arm64); } /** @@ -143,7 +143,7 @@ private File getPartialPListDir() { } public List getSDKs() { - if (isSimulatorArch(arch)) { + if (isSimulatorArch(arch, env)) { return SDK.listSimulatorSDKs(); } else { return SDK.listDeviceSDKs(); @@ -161,7 +161,7 @@ public IDevice getDevice() { @Override protected Launcher createLauncher(LaunchParameters launchParameters) throws IOException { - if (isSimulatorArch(arch)) { + if (isSimulatorArch(arch, env)) { return createIOSSimLauncher(launchParameters); } else { return createIOSDevLauncher(launchParameters); @@ -285,8 +285,10 @@ protected void doBuild(File outFile, List ccArgs, throw new CompilerException("Failed to get major version number from " + "MinimumOSVersion string '" + minVersion + "'"); } - if (isDeviceArch(arch)) { - ccArgs.add("-miphoneos-version-min=" + minVersion); + + ccArgs.add("--target=" + config.getClangTriple(getMinimumOSVersion())); + + if (isDeviceArch(arch, env)) { if (config.isDebug()) { ccArgs.add("-Wl,-no_pie"); } @@ -295,7 +297,6 @@ protected void doBuild(File outFile, List ccArgs, ccArgs.add("-fembed-bitcode"); } } else { - ccArgs.add("-mios-simulator-version-min=" + minVersion); if (config.getArch() == Arch.x86 || config.isDebug()) { ccArgs.add("-Wl,-no_pie"); } @@ -324,7 +325,7 @@ protected void doBuild(File outFile, List ccArgs, libArgs.add("-Xlinker"); libArgs.add("@loader_path/Frameworks"); - if (!isDeviceArch(arch)) { + if (!isDeviceArch(arch, env)) { // add simulated entitlement to allow Security framework to work on simulator File simEntitlement = createSimulatedEntitlementsPList(getBundleId()); ccArgs.add("-Xlinker"); @@ -344,7 +345,7 @@ protected void prepareInstall(File installDir) throws IOException { createInfoPList(installDir); generateDsym(installDir, getExecutable(), false); - if (isDeviceArch(arch)) { + if (isDeviceArch(arch, env)) { // strip local symbols strip(installDir, getExecutable()); @@ -400,7 +401,7 @@ protected void prepareLaunch(File appDir) throws IOException { // strip symbols to reduce application size, all debugger symbols converted into globals strip(appDir, getExecutable()); - if (isDeviceArch(arch)) { + if (isDeviceArch(arch, env)) { if (config.isIosSkipSigning()) { config.getLogger().warn("Skiping code signing. The resulting app will " + "be unsigned and will not run on unjailbroken devices"); @@ -516,7 +517,7 @@ private File createEntitlementForAppEx(boolean getTaskAllow, String bundleId) th if (bundleId != null) dict.put("application-identifier", bundleId); // xcode uses prefix for simulators entitlements - String prefix = isDeviceArch(arch) ? "" : "com.apple.security."; + String prefix = isDeviceArch(arch, env) ? "" : "com.apple.security."; dict.put(prefix + "get-task-allow", getTaskAllow); PropertyListParser.saveAsXML(dict, destFile); return destFile; @@ -944,7 +945,7 @@ public boolean processDir(Resource resource, File dir, File destDir) throws IOEx @Override public void processFile(Resource resource, File file, File destDir) throws IOException { - if (isDeviceArch(arch) && !resource.isSkipPngCrush() + if (isDeviceArch(arch, env) && !resource.isSkipPngCrush() && file.getName().toLowerCase().endsWith(".png")) { destDir.mkdirs(); File outFile = new File(destDir, file.getName()); @@ -1038,7 +1039,7 @@ private void putIfAbsent(NSDictionary dict, String key, String value) { } protected void customizeInfoPList(NSDictionary dict) { - if (isSimulatorArch(arch)) { + if (isSimulatorArch(arch, env)) { dict.put("CFBundleSupportedPlatforms", new NSArray(new NSString("iPhoneSimulator"))); } else { dict.put("CFBundleSupportedPlatforms", new NSArray(new NSString("iPhoneOS"))); @@ -1180,18 +1181,19 @@ public void init(Config config) { if (config.getArch() == null) { arch = Arch.thumbv7; } else { - if (!isSimulatorArch(config.getArch()) && !isDeviceArch(config.getArch())) { + if (!isSimulatorArch(config.getArch(), config.getEnv()) && !isDeviceArch(config.getArch(), config.getEnv())) { throw new IllegalArgumentException("Arch '" + config.getArch() + "' is unsupported for iOS target"); } arch = config.getArch(); } + env = config.getEnv(); if (config.getIosInfoPList() != null) { config.getIosInfoPList().parse(config.getProperties()); } - if (isDeviceArch(arch)) { + if (isDeviceArch(arch, env)) { if (!config.isSkipLinking() && !config.isIosSkipSigning()) { signIdentity = config.getIosSignIdentity(); provisioningProfile = config.getIosProvisioningProfile(); @@ -1219,7 +1221,7 @@ public void init(Config config) { List sdks = getSDKs(); if (sdkVersion == null) { if (sdks.isEmpty()) { - throw new IllegalArgumentException("No " + (isDeviceArch(arch) ? "device" : "simulator") + throw new IllegalArgumentException("No " + (isDeviceArch(arch, env) ? "device" : "simulator") + " SDKs installed"); } Collections.sort(sdks); diff --git a/compiler/compiler/src/main/java/org/robovm/compiler/util/ToolchainUtil.java b/compiler/compiler/src/main/java/org/robovm/compiler/util/ToolchainUtil.java index 875e73916..fc8f6a234 100755 --- a/compiler/compiler/src/main/java/org/robovm/compiler/util/ToolchainUtil.java +++ b/compiler/compiler/src/main/java/org/robovm/compiler/util/ToolchainUtil.java @@ -28,6 +28,7 @@ import org.apache.commons.io.FilenameUtils; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.config.tools.TextureAtlas; import org.robovm.compiler.log.ConsoleLogger; @@ -255,9 +256,9 @@ public static void actool(Config config, File partialInfoPlist, File outDir, Lis } opts.add("--platform"); - if (IOSTarget.isDeviceArch(config.getArch())) { + if (IOSTarget.isDeviceArch(config.getArch(), config.getEnv())) { opts.add("iphoneos"); - } else if (IOSTarget.isSimulatorArch(config.getArch())) { + } else if (IOSTarget.isSimulatorArch(config.getArch(), config.getEnv())) { opts.add("iphonesimulator"); } @@ -390,8 +391,6 @@ public static void link(Config config, List args, List objectFiles opts.add("-g"); } if (isDarwin) { - opts.add("-arch"); - opts.add(config.getArch().getClangName()); for (File objectsFile : objectsFiles) { opts.add("-Wl,-filelist," + objectsFile.getAbsolutePath()); } diff --git a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractIOSSimulatorTask.java b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractIOSSimulatorTask.java index f5cfd2419..0daf3754c 100755 --- a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractIOSSimulatorTask.java +++ b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractIOSSimulatorTask.java @@ -17,6 +17,7 @@ import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.OS; +import org.robovm.compiler.target.ios.DeviceType; import org.robovm.compiler.target.ios.IOSTarget; /** @@ -36,9 +37,15 @@ protected OS getOs() { @Override protected Arch getArch() { - Arch arch = Arch.x86_64; - if (extension.getArch() != null && extension.getArch().equals(Arch.x86.toString())) { - arch = Arch.x86; + Arch arch = DeviceType.DEFAULT_HOST_ARCH; + String extArchName = extension.getArch(); + if (extArchName != null) { + if (extArchName.equals(Arch.x86_64.toString())) + arch = Arch.x86_64; + else if (extArchName.equals(Arch.arm64.toString())) + arch = Arch.arm64; + else if (extArchName.equals(Arch.x86.toString())) + arch = Arch.x86; } return arch; } diff --git a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractRoboVMTask.java b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractRoboVMTask.java index 0030f18f9..be219cd37 100755 --- a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractRoboVMTask.java +++ b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractRoboVMTask.java @@ -32,6 +32,7 @@ import org.robovm.compiler.AppCompiler; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.log.Logger; import org.robovm.compiler.target.ios.ProvisioningProfile; @@ -84,13 +85,13 @@ public AbstractRoboVMTask() { setGroup("MobiVM"); } - public AppCompiler build(OS os, Arch arch, String targetType) { - getLogger().info("Building RoboVM app for: " + os + " (" + arch + ")"); + public AppCompiler build(OS os, Arch arch, Environment env, String targetType) { + getLogger().info("Building RoboVM app for: " + os + " (" + arch + env.asLlvmSuffix("-")+ ")"); Config.Builder builder; builder = new Config.Builder(); - configure(builder).os(os).arch(arch).targetType(targetType); + configure(builder).os(os).arch(arch).env(env).targetType(targetType); // execute the RoboVM build Config config; diff --git a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractSimulatorTask.java b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractSimulatorTask.java index 48364df57..83f63e5fc 100755 --- a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractSimulatorTask.java +++ b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/AbstractSimulatorTask.java @@ -21,6 +21,7 @@ import org.robovm.compiler.AppCompiler; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.target.ios.DeviceType; import org.robovm.compiler.target.ios.IOSSimulatorLaunchParameters; @@ -32,7 +33,7 @@ public abstract class AbstractSimulatorTask extends AbstractRoboVMTask { protected void launch(DeviceType type) { try { - AppCompiler compiler = build(getOs(), getArch(), getTargetType()); + AppCompiler compiler = build(getOs(), getArch(), Environment.Simulator, getTargetType()); if (extension.isSkipLaunch()) { return; diff --git a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/ConsoleTask.java b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/ConsoleTask.java index 50c655a5a..24f2e923a 100755 --- a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/ConsoleTask.java +++ b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/ConsoleTask.java @@ -19,6 +19,7 @@ import org.robovm.compiler.AppCompiler; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.target.ConsoleTarget; import org.robovm.compiler.target.LaunchParameters; @@ -36,7 +37,7 @@ public void invoke() { arch = Arch.valueOf(extension.getArch()); } - AppCompiler compiler = build(OS.getDefaultOS(), arch, ConsoleTarget.TYPE); + AppCompiler compiler = build(OS.getDefaultOS(), arch, Environment.Native, ConsoleTarget.TYPE); Config config = compiler.getConfig(); LaunchParameters launchParameters = config.getTarget().createLaunchParameters(); compiler.launch(launchParameters); diff --git a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/IOSDeviceTask.java b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/IOSDeviceTask.java index da61b7725..d728ab655 100755 --- a/plugins/gradle/src/main/java/org/robovm/gradle/tasks/IOSDeviceTask.java +++ b/plugins/gradle/src/main/java/org/robovm/gradle/tasks/IOSDeviceTask.java @@ -19,6 +19,7 @@ import org.robovm.compiler.AppCompiler; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.target.LaunchParameters; import org.robovm.compiler.target.ios.IOSTarget; @@ -38,7 +39,7 @@ public void invoke() { arch = Arch.thumbv7; } - AppCompiler compiler = build(OS.ios, arch, IOSTarget.TYPE); + AppCompiler compiler = build(OS.ios, arch, Environment.Native, IOSTarget.TYPE); if (extension.isSkipLaunch()) { return; } diff --git a/plugins/junit/client/src/main/java/org/robovm/junit/client/TestClient.java b/plugins/junit/client/src/main/java/org/robovm/junit/client/TestClient.java index 0f491c9dd..857403e5e 100755 --- a/plugins/junit/client/src/main/java/org/robovm/junit/client/TestClient.java +++ b/plugins/junit/client/src/main/java/org/robovm/junit/client/TestClient.java @@ -234,7 +234,7 @@ public void call(Subscriber subscriber) { int port = serverPortReader.port; try { - if (config.getTarget() instanceof IOSTarget && IOSTarget.isDeviceArch(config.getArch())) { + if (config.getTarget() instanceof IOSTarget && IOSTarget.isDeviceArch(config.getArch(), config.getEnv())) { // iOS device launch. Use libimobiledevice to set up the // connection. IDevice device = ((IOSTarget) config.getTarget()).getDevice(); diff --git a/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/AbstractIOSSimulatorMojo.java b/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/AbstractIOSSimulatorMojo.java index 307431f9f..ec635c0fc 100644 --- a/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/AbstractIOSSimulatorMojo.java +++ b/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/AbstractIOSSimulatorMojo.java @@ -21,6 +21,7 @@ import org.robovm.compiler.AppCompiler; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.target.ios.DeviceType; import org.robovm.compiler.target.ios.DeviceType.DeviceFamily; @@ -51,12 +52,17 @@ protected AbstractIOSSimulatorMojo(DeviceFamily deviceFamily) { public void execute() throws MojoExecutionException, MojoFailureException { try { - Arch arch = Arch.x86_64; - if (super.arch != null && super.arch.equals(Arch.x86.toString())) { - arch = Arch.x86; + Arch arch = DeviceType.DEFAULT_HOST_ARCH; + if (super.arch != null) { + if (super.arch.equals(Arch.x86.toString())) + arch = Arch.x86; + if (super.arch.equals(Arch.x86_64.toString())) + arch = Arch.x86_64; + else if (super.arch.equals(Arch.arm64.toString())) + arch = Arch.arm64; } - AppCompiler compiler = build(OS.ios, arch, IOSTarget.TYPE); + AppCompiler compiler = build(OS.ios, arch, Environment.Simulator, IOSTarget.TYPE); Config config = compiler.getConfig(); IOSSimulatorLaunchParameters launchParameters = (IOSSimulatorLaunchParameters) config.getTarget().createLaunchParameters(); diff --git a/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/AbstractRoboVMMojo.java b/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/AbstractRoboVMMojo.java index 14195974a..d200ab70d 100644 --- a/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/AbstractRoboVMMojo.java +++ b/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/AbstractRoboVMMojo.java @@ -43,6 +43,7 @@ import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; import org.robovm.compiler.config.Config.Home; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.log.Logger; import org.robovm.compiler.target.ios.ProvisioningProfile; @@ -336,15 +337,15 @@ protected Config.Builder configure(Config.Builder builder) throws MojoExecutionE return builder; } - protected AppCompiler build(OS os, Arch arch, String targetType) + protected AppCompiler build(OS os, Arch arch, Environment env, String targetType) throws MojoExecutionException { - getLog().info("Building RoboVM app for: " + os + " (" + arch + ")"); + getLog().info("Building RoboVM app for: " + os + " (" + arch + env.asLlvmSuffix("-") + ")"); Config.Builder builder; builder = new Config.Builder(); - configure(builder).os(os).arch(arch).targetType(targetType); + configure(builder).os(os).arch(arch).env(env).targetType(targetType); // execute the RoboVM build diff --git a/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/ConsoleMojo.java b/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/ConsoleMojo.java index c05b4dad4..5fe98b52e 100644 --- a/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/ConsoleMojo.java +++ b/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/ConsoleMojo.java @@ -23,6 +23,7 @@ import org.robovm.compiler.AppCompiler; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.target.ConsoleTarget; import org.robovm.compiler.target.LaunchParameters; @@ -45,7 +46,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { arch = Arch.valueOf(super.arch); } - AppCompiler compiler = build(OS.getDefaultOS(), arch, ConsoleTarget.TYPE); + AppCompiler compiler = build(OS.getDefaultOS(), arch, Environment.Native, ConsoleTarget.TYPE); Config config = compiler.getConfig(); LaunchParameters launchParameters = config.getTarget() .createLaunchParameters(); diff --git a/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/IOSDeviceMojo.java b/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/IOSDeviceMojo.java index 718c84592..316d78f7b 100644 --- a/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/IOSDeviceMojo.java +++ b/plugins/maven/plugin/src/main/java/org/robovm/maven/plugin/IOSDeviceMojo.java @@ -23,6 +23,7 @@ import org.robovm.compiler.AppCompiler; import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.target.LaunchParameters; import org.robovm.compiler.target.ios.IOSTarget; @@ -44,7 +45,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { arch = Arch.thumbv7; } - AppCompiler compiler = build(OS.ios, arch, IOSTarget.TYPE); + AppCompiler compiler = build(OS.ios, arch, Environment.Native, IOSTarget.TYPE); Config config = compiler.getConfig(); LaunchParameters launchParameters = config.getTarget() .createLaunchParameters(); diff --git a/plugins/maven/surefire/src/main/java/org/robovm/maven/surefire/RoboVMSurefireProvider.java b/plugins/maven/surefire/src/main/java/org/robovm/maven/surefire/RoboVMSurefireProvider.java index 71459e5bc..9a2932ef1 100644 --- a/plugins/maven/surefire/src/main/java/org/robovm/maven/surefire/RoboVMSurefireProvider.java +++ b/plugins/maven/surefire/src/main/java/org/robovm/maven/surefire/RoboVMSurefireProvider.java @@ -41,6 +41,7 @@ import org.robovm.compiler.config.Arch; import org.robovm.compiler.config.Config; import org.robovm.compiler.config.Config.Home; +import org.robovm.compiler.config.Environment; import org.robovm.compiler.config.OS; import org.robovm.compiler.log.Logger; import org.robovm.compiler.target.LaunchParameters; @@ -64,6 +65,7 @@ public class RoboVMSurefireProvider extends AbstractProvider { private final static String PROP_SERVER_DEBUG = "robovm.test.enableServerLogging"; private final static String PROP_OS = "robovm.test.os"; private final static String PROP_ARCH = "robovm.test.arch"; + private final static String PROP_ENVIRONMENT = "robovm.test.environment"; private final static String PROP_CONFIG_FILE = "robovm.test.configFile"; private final static String PROP_PROPERTIES_FILE = "robovm.test.propertiesFile"; private final static String PROP_IOS_SIGNING_IDENTITY = "robovm.test.iosSignIdentity"; @@ -161,7 +163,7 @@ public void testIgnored(Description description) throws Exception { Process process = null; try { Config config = testClient.configure(createConfig(consoleLogger), isIOS()).build(); - config.getLogger().info("Building RoboVM tests for: %s (%s)", config.getOs(), config.getArch()); + config.getLogger().info("Building RoboVM tests for: %s (%s%s)", config.getOs(), config.getArch(), config.getEnv().asLlvmSuffix("-")); config.getLogger().info("This could take a while, especially the first time round"); AppCompiler appCompiler = new AppCompiler(config); appCompiler.build(); @@ -174,9 +176,7 @@ public void testIgnored(Description description) throws Exception { DeviceType type = DeviceType.getDeviceType(System.getProperty(PROP_IOS_SIMULATOR_NAME)); ((IOSSimulatorLaunchParameters) launchParameters).setDeviceType(type); } else if(launchParameters instanceof IOSSimulatorLaunchParameters) { - if(config.getArch() == Arch.x86_64) { - ((IOSSimulatorLaunchParameters) launchParameters).setDeviceType(DeviceType.getBestDeviceType(config.getArch(), null, null, null)); - } + ((IOSSimulatorLaunchParameters) launchParameters).setDeviceType(DeviceType.getBestDeviceType(config.getArch(), null, null, null)); } process = appCompiler.launchAsync(launchParameters); @@ -316,6 +316,9 @@ public void debug(String logLine) { if (System.getProperty(PROP_ARCH) != null) { configBuilder.arch(Arch.valueOf(System.getProperty(PROP_ARCH))); } + if (System.getProperty(PROP_ENVIRONMENT) != null) { + configBuilder.env(Environment.valueOf(System.getProperty(PROP_ENVIRONMENT))); + } if (Boolean.getBoolean(PROP_IOS_SKIP_SIGNING)) { configBuilder.iosSkipSigning(true); } else {