Search in sources :

Example 1 with Walker

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);
    }
}
Also used : Pattern(java.util.regex.Pattern) Matcher(java.util.regex.Matcher) Resource(org.robovm.compiler.config.Resource) Walker(org.robovm.compiler.config.Resource.Walker) IOException(java.io.IOException) ZipFile(java.util.zip.ZipFile) File(java.io.File) HashSet(java.util.HashSet)

Aggregations

File (java.io.File)1 IOException (java.io.IOException)1 HashSet (java.util.HashSet)1 Matcher (java.util.regex.Matcher)1 Pattern (java.util.regex.Pattern)1 ZipFile (java.util.zip.ZipFile)1 Resource (org.robovm.compiler.config.Resource)1 Walker (org.robovm.compiler.config.Resource.Walker)1