@shopify/react-native-skia
Version:
High-performance React Native Graphics using Skia
134 lines (114 loc) • 3.79 kB
JavaScript
;
const path = require("path");
const fs = require("fs");
const useGraphite =
process.env.SK_GRAPHITE === "1" ||
(process.env.SK_GRAPHITE || "").toLowerCase() === "true";
const prefix = useGraphite ? "react-native-skia-graphite" : "react-native-skia";
const libsDir = path.join(__dirname, "..", "libs");
function copySync(src, dest, options) {
if (!src.includes("*")) {
return fs.cpSync(src, dest, options);
}
const wildcardSplit = src.split("*");
const basePath = wildcardSplit[0];
const files = fs.readdirSync(basePath);
files
.filter((file) => file.endsWith(wildcardSplit[1]))
.forEach((file) => {
return fs.cpSync(
path.join(basePath, file),
path.join(dest, file),
options
);
});
}
// --- Apple platforms ---
let iosPackage, macosPackage;
try {
iosPackage = path.dirname(
require.resolve(prefix + "-apple-ios/package.json")
);
macosPackage = path.dirname(
require.resolve(prefix + "-apple-macos/package.json")
);
} catch (e) {
console.error(
"ERROR: Could not find " +
prefix +
"-apple-ios or " +
prefix +
"-apple-macos"
);
console.error("Make sure you have run yarn install or npm install");
process.exit(1);
}
// Verify xcframeworks exist in the iOS package
const iosXcf = path.join(iosPackage, "libs");
if (
!fs.existsSync(iosXcf) ||
!fs.readdirSync(iosXcf).some((f) => f.endsWith(".xcframework"))
) {
console.error(
"ERROR: Skia prebuilt binaries not found in " + prefix + "-apple-ios!"
);
process.exit(1);
}
console.log("-- Skia iOS package: " + iosPackage);
console.log("-- Skia macOS package: " + macosPackage);
// Clean and copy Apple frameworks
fs.rmSync(path.join(libsDir, "ios"), { recursive: true, force: true });
fs.rmSync(path.join(libsDir, "macos"), { recursive: true, force: true });
fs.rmSync(path.join(libsDir, "tvos"), { recursive: true, force: true });
fs.mkdirSync(path.join(libsDir, "ios"), { recursive: true });
fs.mkdirSync(path.join(libsDir, "macos"), { recursive: true });
copySync(iosPackage + "/libs/*.xcframework", path.join(libsDir, "ios"), {
recursive: true,
});
copySync(macosPackage + "/libs/*.xcframework", path.join(libsDir, "macos"), {
recursive: true,
});
// Handle tvOS (non-Graphite only)
if (!useGraphite) {
try {
const tvosPackage = path.dirname(
require.resolve(prefix + "-apple-tvos/package.json")
);
console.log("-- Skia tvOS package: " + tvosPackage);
fs.mkdirSync(path.join(libsDir, "tvos"), { recursive: true });
copySync(tvosPackage + "/libs/*.xcframework", path.join(libsDir, "tvos"), {
recursive: true,
});
} catch (e) {
console.log("-- tvOS package not found, skipping");
}
}
console.log("-- Copied Apple xcframeworks to libs/");
// --- Android ---
const androidPackageName = useGraphite
? "react-native-skia-graphite-android"
: "react-native-skia-android";
let androidPackage;
try {
androidPackage = path.dirname(
require.resolve(androidPackageName + "/package.json")
);
} catch (e) {
console.error("ERROR: Could not find " + androidPackageName);
console.error("Make sure you have run yarn install or npm install");
process.exit(1);
}
const androidSrcLibs = path.join(androidPackage, "libs");
if (!fs.existsSync(androidSrcLibs)) {
console.error(
"ERROR: Skia prebuilt binaries not found in " + androidPackageName + "!"
);
process.exit(1);
}
console.log("-- Skia Android package: " + androidPackage);
// Copy Android libs (per-ABI static libraries)
const androidDest = path.join(libsDir, "android");
fs.rmSync(androidDest, { recursive: true, force: true });
copySync(androidSrcLibs, androidDest, { recursive: true });
console.log("-- Copied Android libs to libs/android/");