-
Notifications
You must be signed in to change notification settings - Fork 196
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into 2024-05-26_transitive
- Loading branch information
Showing
25 changed files
with
599 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
207 changes: 207 additions & 0 deletions
207
photon-core/src/main/java/edu/wpi/first/util/RuntimeDetector.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,207 @@ | ||
/* | ||
* Copyright (C) Photon Vision. | ||
* | ||
* This program is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, either version 3 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
package edu.wpi.first.util; | ||
|
||
import java.io.File; | ||
|
||
/** | ||
* A utility class for detecting and providing platform-specific such as OS and CPU architecture. | ||
*/ | ||
public final class RuntimeDetector { | ||
private static String filePrefix; | ||
private static String fileExtension; | ||
private static String filePath; | ||
|
||
private static synchronized void computePlatform() { | ||
if (fileExtension != null && filePath != null && filePrefix != null) { | ||
return; | ||
} | ||
|
||
boolean intel32 = is32BitIntel(); | ||
boolean intel64 = is64BitIntel(); | ||
boolean arm64 = isArm64(); | ||
|
||
if (isWindows()) { | ||
filePrefix = ""; | ||
fileExtension = ".dll"; | ||
if (intel32) { | ||
filePath = "/windows/x86/"; | ||
} else { | ||
filePath = "/windows/x86-64/"; | ||
} | ||
} else if (isMac()) { | ||
filePrefix = "lib"; | ||
fileExtension = ".dylib"; | ||
filePath = "/osx/universal/"; | ||
} else if (isLinux()) { | ||
filePrefix = "lib"; | ||
fileExtension = ".so"; | ||
if (intel32) { | ||
filePath = "/linux/x86/"; | ||
} else if (intel64) { | ||
filePath = "/linux/x86-64/"; | ||
} else if (isAthena()) { | ||
filePath = "/linux/athena/"; | ||
} else if (isArm32()) { | ||
filePath = "/linux/arm32/"; | ||
} else if (arm64) { | ||
filePath = "/linux/arm64/"; | ||
} else { | ||
filePath = "/linux/nativearm/"; | ||
} | ||
} else { | ||
throw new IllegalStateException("Failed to determine OS"); | ||
} | ||
} | ||
|
||
/** | ||
* Get the file prefix for the current system. | ||
* | ||
* @return The file prefix. | ||
*/ | ||
public static synchronized String getFilePrefix() { | ||
computePlatform(); | ||
|
||
return filePrefix; | ||
} | ||
|
||
/** | ||
* Get the file extension for the current system. | ||
* | ||
* @return The file extension. | ||
*/ | ||
public static synchronized String getFileExtension() { | ||
computePlatform(); | ||
|
||
return fileExtension; | ||
} | ||
|
||
/** | ||
* Get the platform path for the current system. | ||
* | ||
* @return The platform path. | ||
*/ | ||
public static synchronized String getPlatformPath() { | ||
computePlatform(); | ||
|
||
return filePath; | ||
} | ||
|
||
/** | ||
* Get the path to the requested resource. | ||
* | ||
* @param libName Library name. | ||
* @return The path to the requested resource. | ||
*/ | ||
public static synchronized String getLibraryResource(String libName) { | ||
computePlatform(); | ||
|
||
return filePath + filePrefix + libName + fileExtension; | ||
} | ||
|
||
/** | ||
* Get the path to the hash to the requested resource. | ||
* | ||
* @param libName Library name. | ||
* @return The path to the hash to the requested resource. | ||
*/ | ||
public static synchronized String getHashLibraryResource(String libName) { | ||
computePlatform(); | ||
|
||
return filePath + libName + ".hash"; | ||
} | ||
|
||
/** | ||
* Check if hardware platform is Athena. | ||
* | ||
* @return True if hardware platform is Athena. | ||
*/ | ||
public static boolean isAthena() { | ||
File runRobotFile = new File("/usr/local/frc/bin/frcRunRobot.sh"); | ||
return runRobotFile.exists(); | ||
} | ||
|
||
/** | ||
* Check if OS is Arm32. | ||
* | ||
* @return True if OS is Arm32. | ||
*/ | ||
public static boolean isArm32() { | ||
String arch = System.getProperty("os.arch"); | ||
return "arm".equals(arch) || "arm32".equals(arch); | ||
} | ||
|
||
/** | ||
* Check if architecture is Arm64. | ||
* | ||
* @return if architecture is Arm64. | ||
*/ | ||
public static boolean isArm64() { | ||
String arch = System.getProperty("os.arch"); | ||
return "aarch64".equals(arch) || "arm64".equals(arch); | ||
} | ||
|
||
/** | ||
* Check if OS is Linux. | ||
* | ||
* @return if OS is Linux. | ||
*/ | ||
public static boolean isLinux() { | ||
return System.getProperty("os.name").startsWith("Linux"); | ||
} | ||
|
||
/** | ||
* Check if OS is Windows. | ||
* | ||
* @return if OS is Windows. | ||
*/ | ||
public static boolean isWindows() { | ||
return System.getProperty("os.name").startsWith("Windows"); | ||
} | ||
|
||
/** | ||
* Check if OS is Mac. | ||
* | ||
* @return if OS is Mac. | ||
*/ | ||
public static boolean isMac() { | ||
return System.getProperty("os.name").startsWith("Mac"); | ||
} | ||
|
||
/** | ||
* Check if OS is 32bit Intel. | ||
* | ||
* @return if OS is 32bit Intel. | ||
*/ | ||
public static boolean is32BitIntel() { | ||
String arch = System.getProperty("os.arch"); | ||
return "x86".equals(arch) || "i386".equals(arch); | ||
} | ||
|
||
/** | ||
* Check if OS is 64bit Intel. | ||
* | ||
* @return if OS is 64bit Intel. | ||
*/ | ||
public static boolean is64BitIntel() { | ||
String arch = System.getProperty("os.arch"); | ||
return "amd64".equals(arch) || "x86_64".equals(arch); | ||
} | ||
|
||
private RuntimeDetector() {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.