use of org.robovm.compiler.config.Resource.Walker in project robovm by robovm.
the class AbstractTarget method copyDynamicFrameworks.
protected void copyDynamicFrameworks(File destDir) throws IOException {
final Set<String> swiftLibraries = new HashSet<>();
File frameworksDir = new File(destDir, "Frameworks");
for (String framework : config.getFrameworks()) {
boolean isCustomFramework = false;
File frameworkDir = null;
for (File path : config.getFrameworkPaths()) {
frameworkDir = new File(path, framework + ".framework");
if (frameworkDir.exists() && frameworkDir.isDirectory()) {
isCustomFramework = true;
break;
}
}
if (isCustomFramework) {
// check if this is a dynamic framework by finding
// at least ony dylib in the root folder
boolean isDynamicFramework = false;
for (File file : frameworkDir.listFiles()) {
if (file.isFile() && isDynamicLibrary(file)) {
isDynamicFramework = true;
break;
}
}
if (isDynamicFramework) {
config.getLogger().info("Copying framework %s from %s to %s", framework, frameworkDir, destDir);
new Resource(frameworkDir).walk(new Walker() {
@Override
public boolean processDir(Resource resource, File dir, File destDir) throws IOException {
return !(dir.getName().equals("Headers") || dir.getName().equals("PrivateHeaders") || dir.getName().equals("Modules") || dir.getName().equals("Versions") || dir.getName().equals("Documentation"));
}
@Override
public void processFile(Resource resource, File file, File destDir) throws IOException {
if (!isStaticLibrary(file)) {
copyFile(resource, file, destDir);
if (isDynamicLibrary(file)) {
// remove simulator archs for device builds
if (config.getOs() == OS.ios && config.getArch().isArm()) {
String archs = ToolchainUtil.lipoInfo(config, file);
File inFile = new File(destDir, file.getName());
File tmpFile = new File(destDir, file.getName() + ".tmp");
FileUtils.copyFile(inFile, tmpFile);
if (archs.contains(Arch.x86.getClangName())) {
ToolchainUtil.lipoRemoveArchs(config, inFile, tmpFile, Arch.x86);
}
if (archs.contains(Arch.x86_64.getClangName())) {
ToolchainUtil.lipoRemoveArchs(config, inFile, tmpFile, Arch.x86_64);
}
FileUtils.copyFile(tmpFile, inFile);
tmpFile.delete();
}
// check if this dylib depends on Swift
// and register those libraries to be copied
// to bundle.app/Frameworks
String dependencies = ToolchainUtil.otool(file);
Pattern swiftLibraryPattern = Pattern.compile("libswift.+\\.dylib");
Matcher matcher = swiftLibraryPattern.matcher(dependencies);
while (matcher.find()) {
String library = dependencies.substring(matcher.start(), matcher.end());
swiftLibraries.add(library);
}
}
}
}
}, frameworksDir);
}
}
}
// copy Swift libraries if required
if (!swiftLibraries.isEmpty()) {
copySwiftLibs(swiftLibraries, frameworksDir);
}
}
Aggregations