def mergeLibs(self, builddir): res = os.path.join(builddir, "lib", self.getConfiguration(), "libopencv_merged.a") libs = glob.glob(os.path.join(builddir, "install", "lib", "*.a")) module = [os.path.join(builddir, "install", "lib", self.framework_name + ".framework", self.framework_name)] if self.build_objc_wrapper else [] libs3 = glob.glob(os.path.join(builddir, "install", "lib", "3rdparty", "*.a")) print("Merging libraries:\n\t%s" % "\n\t".join(libs + libs3 + module), file=sys.stderr) execute(["libtool", "-static", "-o", res] + libs + libs3 + module)
def makeDynamicLib(self, builddir): target = builddir[(builddir.rfind("build-") + 6):] target_platform = target[(target.rfind("-") + 1):] is_device = target_platform == "iphoneos" or target_platform == "catalyst" framework_dir = os.path.join(builddir, "install", "lib", self.framework_name + ".framework") if not os.path.exists(framework_dir): os.makedirs(framework_dir) res = os.path.join(framework_dir, self.framework_name) libs = glob.glob(os.path.join(builddir, "install", "lib", "*.a")) if self.build_objc_wrapper: module = [os.path.join(builddir, "lib", self.getConfiguration(), self.framework_name + ".framework", self.framework_name)] else: module = [] libs3 = glob.glob(os.path.join(builddir, "install", "lib", "3rdparty", "*.a")) if os.environ.get('IPHONEOS_DEPLOYMENT_TARGET'): link_target = target[:target.find("-")] + "-apple-ios" + os.environ['IPHONEOS_DEPLOYMENT_TARGET'] + ("-simulator" if target.endswith("simulator") else "") else: if target_platform == "catalyst": link_target = "%s-apple-ios13.0-macabi" % target[:target.find("-")] else: link_target = "%s-apple-darwin" % target[:target.find("-")] bitcode_flags = ["-fembed-bitcode", "-Xlinker", "-bitcode_verify"] if is_device and not self.bitcodedisabled else [] toolchain_dir = get_xcode_setting("TOOLCHAIN_DIR", builddir) sdk_dir = get_xcode_setting("SDK_DIR", builddir) framework_options = [] swift_link_dirs = ["-L" + toolchain_dir + "/usr/lib/swift/" + target_platform, "-L/usr/lib/swift"] if target_platform == "catalyst": swift_link_dirs = ["-L" + toolchain_dir + "/usr/lib/swift/" + "maccatalyst", "-L/usr/lib/swift"] framework_options = [ "-iframework", "%s/System/iOSSupport/System/Library/Frameworks" % sdk_dir, "-framework", "AVFoundation", "-framework", "UIKit", "-framework", "CoreGraphics", "-framework", "CoreImage", "-framework", "CoreMedia", "-framework", "QuartzCore", ] elif target_platform == "macosx": framework_options = [ "-framework", "AVFoundation", "-framework", "AppKit", "-framework", "CoreGraphics", "-framework", "CoreImage", "-framework", "CoreMedia", "-framework", "QuartzCore", "-framework", "Accelerate", "-framework", "OpenCL", ] execute([ "clang++", "-Xlinker", "-rpath", "-Xlinker", "/usr/lib/swift", "-target", link_target, "-isysroot", sdk_dir,] + framework_options + [ "-install_name", "@rpath/" + self.framework_name + ".framework/" + self.framework_name, "-dynamiclib", "-dead_strip", "-fobjc-link-runtime", "-all_load", "-o", res ] + swift_link_dirs + bitcode_flags + module + libs + libs3)
build_folder = "{}/{}".format(base_dir, platform).replace( " ", "\\ ") # Escape spaces in output path pathlib.Path(build_folder).mkdir(parents=True, exist_ok=True) return build_folder if iphoneos_archs: build_folder = get_or_create_build_folder(args.out, "iphoneos") build_folders.append(build_folder) command = [ "python3", ios_script_path, build_folder, "--iphoneos_archs", iphoneos_archs, "--framework_name", args.framework_name, "--build_only_specified_archs" ] + unknown_args print_header("Building iPhoneOS frameworks") print(command) execute(command, cwd=os.getcwd()) if iphonesimulator_archs: build_folder = get_or_create_build_folder(args.out, "iphonesimulator") build_folders.append(build_folder) command = [ "python3", ios_script_path, build_folder, "--iphonesimulator_archs", iphonesimulator_archs, "--framework_name", args.framework_name, "--build_only_specified_archs" ] + unknown_args print_header("Building iPhoneSimulator frameworks") execute(command, cwd=os.getcwd()) if macos_archs: build_folder = get_or_create_build_folder(args.out, "macos") build_folders.append(build_folder)
def makeFramework(self, outdir, builddirs): name = self.framework_name # set the current dir to the dst root framework_dir = os.path.join(outdir, "%s.framework" % name) if os.path.isdir(framework_dir): shutil.rmtree(framework_dir) os.makedirs(framework_dir) if self.dynamic: dstdir = framework_dir else: dstdir = os.path.join(framework_dir, "Versions", "A") # copy headers from one of build folders shutil.copytree( os.path.join(builddirs[0], "install", "include", "opencv2"), os.path.join(dstdir, "Headers")) if name != "opencv2": for dirname, dirs, files in os.walk(os.path.join( dstdir, "Headers")): for filename in files: filepath = os.path.join(dirname, filename) with open(filepath) as file: body = file.read() body = body.replace("include \"opencv2/", "include \"" + name + "/") body = body.replace("include <opencv2/", "include <" + name + "/") with open(filepath, "w") as file: file.write(body) if self.build_objc_wrapper: copy_tree( os.path.join(builddirs[0], "install", "lib", name + ".framework", "Headers"), os.path.join(dstdir, "Headers")) platform_name_map = { "arm": "armv7-apple-ios", "arm64": "arm64-apple-ios", "i386": "i386-apple-ios-simulator", "x86_64": "x86_64-apple-ios-simulator", } if builddirs[0].find("iphone") != -1 else { "x86_64": "x86_64-apple-macos", "arm64": "arm64-apple-macos", } for d in builddirs: copy_tree( os.path.join(d, "install", "lib", name + ".framework", "Modules"), os.path.join(dstdir, "Modules")) for dirname, dirs, files in os.walk(os.path.join( dstdir, "Modules")): for filename in files: filestem = os.path.splitext(filename)[0] fileext = os.path.splitext(filename)[1] if filestem in platform_name_map: os.rename( os.path.join(dirname, filename), os.path.join(dirname, platform_name_map[filestem] + fileext)) # make universal static lib if self.dynamic: libs = [ os.path.join(d, "install", "lib", name + ".framework", name) for d in builddirs ] else: libs = [ os.path.join(d, "lib", self.getConfiguration(), "libopencv_merged.a") for d in builddirs ] lipocmd = ["lipo", "-create"] lipocmd.extend(libs) lipocmd.extend(["-o", os.path.join(dstdir, name)]) print("Creating universal library from:\n\t%s" % "\n\t".join(libs), file=sys.stderr) execute(lipocmd) # dynamic framework has different structure, just copy the Plist directly if self.dynamic: resdir = dstdir shutil.copyfile(self.getInfoPlist(builddirs), os.path.join(resdir, "Info.plist")) else: # copy Info.plist resdir = os.path.join(dstdir, "Resources") os.makedirs(resdir) shutil.copyfile(self.getInfoPlist(builddirs), os.path.join(resdir, "Info.plist")) # make symbolic links links = [(["A"], ["Versions", "Current"]), (["Versions", "Current", "Headers"], ["Headers"]), (["Versions", "Current", "Resources"], ["Resources"]), (["Versions", "Current", "Modules"], ["Modules"]), (["Versions", "Current", name], [name])] for l in links: s = os.path.join(*l[0]) d = os.path.join(framework_dir, *l[1]) os.symlink(s, d)
def buildOne(self, arch, target, builddir, cmakeargs=[]): # Run cmake #toolchain = self.getToolchain(arch, target) #cmakecmd = self.getCMakeArgs(arch, target) + \ # (["-DCMAKE_TOOLCHAIN_FILE=%s" % toolchain] if toolchain is not None else []) #if target.lower().startswith("iphoneos"): # cmakecmd.append("-DCPU_BASELINE=DETECT") #cmakecmd.append(self.opencv) #cmakecmd.extend(cmakeargs) cmakecmd = self.makeCMakeCmd(arch, target, self.opencv, cmakeargs) print("") print("=================================") print("CMake") print("=================================") print("") execute(cmakecmd, cwd=builddir) print("") print("=================================") print("Xcodebuild") print("=================================") print("") # Clean and build clean_dir = os.path.join(builddir, "install") if os.path.isdir(clean_dir): shutil.rmtree(clean_dir) buildcmd = self.getBuildCommand(arch, target) execute(buildcmd + ["-target", "ALL_BUILD", "build"], cwd=builddir) execute([ "cmake", "-DBUILD_TYPE=%s" % self.getConfiguration(), "-P", "cmake_install.cmake" ], cwd=builddir) if self.build_objc_wrapper: cmakecmd = self.makeCMakeCmd( arch, target, builddir + "/modules/objc_bindings_generator/{}/gen".format( self.getObjcTarget(target)), cmakeargs) # cmakecmd.append("-DCMAKE_Swift_FLAGS=" + "-target x86_64-apple-ios13.0-macabi") # cmakecmd.append("-DCMAKE_EXE_LINKER_FLAGS=" + "-target x86_64-apple-ios13.0-macabi") cmakecmd.append("-DBUILD_ROOT=%s" % builddir) cmakecmd.append("-DCMAKE_INSTALL_NAME_TOOL=install_name_tool") cmakecmd.append("--no-warn-unused-cli") execute(cmakecmd, cwd=builddir + "/modules/objc/framework_build") execute(buildcmd + ["-target", "ALL_BUILD", "build"], cwd=builddir + "/modules/objc/framework_build") execute([ "cmake", "-DBUILD_TYPE=%s" % self.getConfiguration(), "-DCMAKE_INSTALL_PREFIX=%s" % (builddir + "/install"), "-P", "cmake_install.cmake" ], cwd=builddir + "/modules/objc/framework_build")