Merge pull request #5821 from alalek:build_framework
commit
97dc5be841
12 changed files with 132 additions and 207 deletions
@ -1,124 +1,45 @@ |
|||||||
#!/usr/bin/env python |
#!/usr/bin/env python |
||||||
""" |
""" |
||||||
The script builds OpenCV.framework for iOS. |
The script builds OpenCV.framework for OSX. |
||||||
The built framework is universal, it can be used to build app and run it on either iOS simulator or real device. |
|
||||||
|
|
||||||
Usage: |
|
||||||
./build_framework.py <outputdir> |
|
||||||
|
|
||||||
By cmake conventions (and especially if you work with OpenCV repository), |
|
||||||
the output dir should not be a subdirectory of OpenCV source tree. |
|
||||||
|
|
||||||
Script will create <outputdir>, if it's missing, and a few its subdirectories: |
|
||||||
|
|
||||||
<outputdir> |
|
||||||
build/ |
|
||||||
iPhoneOS-*/ |
|
||||||
[cmake-generated build tree for an iOS device target] |
|
||||||
iPhoneSimulator/ |
|
||||||
[cmake-generated build tree for iOS simulator] |
|
||||||
opencv2.framework/ |
|
||||||
[the framework content] |
|
||||||
|
|
||||||
The script should handle minor OpenCV updates efficiently |
|
||||||
- it does not recompile the library from scratch each time. |
|
||||||
However, opencv2.framework directory is erased and recreated on each run. |
|
||||||
""" |
""" |
||||||
|
|
||||||
import glob, re, os, os.path, shutil, string, sys |
from __future__ import print_function |
||||||
|
import os, os.path, sys, argparse, traceback |
||||||
def build_opencv(srcroot, buildroot, target, arch): |
|
||||||
"builds OpenCV for device or simulator" |
|
||||||
|
|
||||||
builddir = os.path.join(buildroot, target + '-' + arch) |
|
||||||
if not os.path.isdir(builddir): |
|
||||||
os.makedirs(builddir) |
|
||||||
currdir = os.getcwd() |
|
||||||
os.chdir(builddir) |
|
||||||
# for some reason, if you do not specify CMAKE_BUILD_TYPE, it puts libs to "RELEASE" rather than "Release" |
|
||||||
cmakeargs = ("-GXcode " + |
|
||||||
"-DCMAKE_BUILD_TYPE=Release " + |
|
||||||
"-DBUILD_SHARED_LIBS=OFF " + |
|
||||||
"-DBUILD_DOCS=OFF " + |
|
||||||
"-DBUILD_EXAMPLES=OFF " + |
|
||||||
"-DBUILD_TESTS=OFF " + |
|
||||||
"-DBUILD_PERF_TESTS=OFF " + |
|
||||||
"-DBUILD_opencv_apps=OFF " + |
|
||||||
"-DBUILD_opencv_world=ON " + |
|
||||||
"-DBUILD_opencv_matlab=OFF " + |
|
||||||
"-DWITH_TIFF=OFF -DBUILD_TIFF=OFF " + |
|
||||||
"-DWITH_JASPER=OFF -DBUILD_JASPER=OFF " + |
|
||||||
"-DWITH_WEBP=OFF -DBUILD_WEBP=OFF " + |
|
||||||
"-DWITH_OPENEXR=OFF -DBUILD_OPENEXR=OFF " + |
|
||||||
"-DWITH_IPP=OFF -DWITH_IPP_A=OFF " + |
|
||||||
"-DCMAKE_C_FLAGS=\"-Wno-implicit-function-declaration\" " + |
|
||||||
"-DCMAKE_INSTALL_PREFIX=install") |
|
||||||
# if cmake cache exists, just rerun cmake to update OpenCV.xproj if necessary |
|
||||||
if os.path.isfile(os.path.join(builddir, "CMakeCache.txt")): |
|
||||||
os.system("cmake %s ." % (cmakeargs,)) |
|
||||||
else: |
|
||||||
os.system("cmake %s %s" % (cmakeargs, srcroot)) |
|
||||||
|
|
||||||
for wlib in [builddir + "/modules/world/UninstalledProducts/libopencv_world.a", |
|
||||||
builddir + "/lib/Release/libopencv_world.a"]: |
|
||||||
if os.path.isfile(wlib): |
|
||||||
os.remove(wlib) |
|
||||||
|
|
||||||
os.system("xcodebuild -parallelizeTargets ARCHS=%s -jobs 2 -sdk %s -configuration Release -target ALL_BUILD" % (arch, target.lower())) |
|
||||||
os.system("xcodebuild ARCHS=%s -sdk %s -configuration Release -target install install" % (arch, target.lower())) |
|
||||||
os.chdir(currdir) |
|
||||||
|
|
||||||
def put_framework_together(srcroot, dstroot): |
# import common code |
||||||
"constructs the framework directory after all the targets are built" |
sys.path.insert(0, os.path.abspath(os.path.abspath(os.path.dirname(__file__))+'/../ios')) |
||||||
|
from build_framework import Builder |
||||||
|
|
||||||
# find the list of targets (basically, ["iPhoneOS", "iPhoneSimulator"]) |
class OSXBuilder(Builder): |
||||||
targetlist = glob.glob(os.path.join(dstroot, "build", "*")) |
|
||||||
targetlist = [os.path.basename(t) for t in targetlist] |
|
||||||
|
|
||||||
# set the current dir to the dst root |
def getToolchain(self, arch, target): |
||||||
currdir = os.getcwd() |
return None |
||||||
framework_dir = dstroot + "/opencv2.framework" |
|
||||||
if os.path.isdir(framework_dir): |
|
||||||
shutil.rmtree(framework_dir) |
|
||||||
os.makedirs(framework_dir) |
|
||||||
os.chdir(framework_dir) |
|
||||||
|
|
||||||
# form the directory tree |
def getBuildCommand(self, arch, target): |
||||||
dstdir = "Versions/A" |
buildcmd = [ |
||||||
os.makedirs(dstdir + "/Resources") |
"xcodebuild", |
||||||
|
"ARCHS=%s" % arch, |
||||||
|
"-sdk", target.lower(), |
||||||
|
"-configuration", "Release", |
||||||
|
"-parallelizeTargets", |
||||||
|
"-jobs", "4" |
||||||
|
] |
||||||
|
return buildcmd |
||||||
|
|
||||||
tdir0 = "../build/" + targetlist[0] |
def getInfoPlist(self, builddirs): |
||||||
# copy headers |
return os.path.join(builddirs[0], "osx", "Info.plist") |
||||||
shutil.copytree(tdir0 + "/install/include/opencv2", dstdir + "/Headers") |
|
||||||
|
|
||||||
# make universal static lib |
|
||||||
wlist = " ".join(["../build/" + t + "/lib/Release/libopencv_world.a" for t in targetlist]) |
|
||||||
os.system("lipo -create " + wlist + " -o " + dstdir + "/opencv2") |
|
||||||
|
|
||||||
# copy Info.plist |
|
||||||
shutil.copyfile(tdir0 + "/osx/Info.plist", dstdir + "/Resources/Info.plist") |
|
||||||
|
|
||||||
# make symbolic links |
|
||||||
os.symlink("A", "Versions/Current") |
|
||||||
os.symlink("Versions/Current/Headers", "Headers") |
|
||||||
os.symlink("Versions/Current/Resources", "Resources") |
|
||||||
os.symlink("Versions/Current/opencv2", "opencv2") |
|
||||||
|
|
||||||
|
|
||||||
def build_framework(srcroot, dstroot): |
|
||||||
"main function to do all the work" |
|
||||||
|
|
||||||
targets = ["MacOSX", "MacOSX" ] |
|
||||||
archs = ["x86_64", "i386" ] |
|
||||||
for i in range(len(targets)): |
|
||||||
build_opencv(srcroot, os.path.join(dstroot, "build"), targets[i], archs[i]) |
|
||||||
|
|
||||||
put_framework_together(srcroot, dstroot) |
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__": |
if __name__ == "__main__": |
||||||
if len(sys.argv) != 2: |
folder = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "../..")) |
||||||
print "Usage:\n\t./build_framework.py <outputdir>\n\n" |
parser = argparse.ArgumentParser(description='The script builds OpenCV.framework for OSX.') |
||||||
sys.exit(0) |
parser.add_argument('out', metavar='OUTDIR', help='folder to put built framework') |
||||||
|
parser.add_argument('--opencv', metavar='DIR', default=folder, help='folder with opencv repository (default is "../.." relative to script location)') |
||||||
build_framework(os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "../..")), os.path.abspath(sys.argv[1])) |
parser.add_argument('--contrib', metavar='DIR', default=None, help='folder with opencv_contrib repository (default is "None" - build only main framework)') |
||||||
|
args = parser.parse_args() |
||||||
|
|
||||||
|
b = OSXBuilder(args.opencv, args.contrib, |
||||||
|
[ |
||||||
|
("x86_64", "MacOSX") |
||||||
|
]) |
||||||
|
b.build(args.out) |
||||||
|
Loading…
Reference in new issue