From 9a76322ef989c62e96d3eb79e1d2aa7716a8890a Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 24 Oct 2018 04:37:31 +0000 Subject: [PATCH] ios: update build script - IPHONEOS_DEPLOYMENT_TARGET=8.0 by default (minimal for XCode 10) --- CMakeLists.txt | 2 ++ platforms/ios/build_framework.py | 20 ++++++++++++++----- .../Toolchains/common-ios-toolchain.cmake | 13 +++++++++--- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index de27a744d8..f6e2b84447 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -324,8 +324,10 @@ OCV_OPTION(ENABLE_OMIT_FRAME_POINTER "Enable -fomit-frame-pointer for GCC" OCV_OPTION(ENABLE_POWERPC "Enable PowerPC for GCC" ON IF (CV_GCC AND CMAKE_SYSTEM_PROCESSOR MATCHES powerpc.*) ) OCV_OPTION(ENABLE_VSX "Enable POWER8 and above VSX (64-bit little-endian)" ON IF ((CV_GCC OR CV_CLANG) AND PPC64LE) ) OCV_OPTION(ENABLE_FAST_MATH "Enable -ffast-math (not recommended for GCC 4.6.x)" OFF IF (CV_GCC AND (X86 OR X86_64)) ) +if(NOT IOS) # Use CPU_BASELINE instead OCV_OPTION(ENABLE_NEON "Enable NEON instructions" (NEON OR ANDROID_ARM_NEON OR AARCH64) IF (CV_GCC OR CV_CLANG) AND (ARM OR AARCH64 OR IOS) ) OCV_OPTION(ENABLE_VFPV3 "Enable VFPv3-D32 instructions" OFF IF (CV_GCC OR CV_CLANG) AND (ARM OR AARCH64 OR IOS) ) +endif() OCV_OPTION(ENABLE_NOISY_WARNINGS "Show all warnings even if they are too noisy" OFF ) OCV_OPTION(OPENCV_WARNINGS_ARE_ERRORS "Treat warnings as errors" OFF ) OCV_OPTION(ANDROID_EXAMPLES_WITH_LIBS "Build binaries of Android examples with native libraries" OFF IF ANDROID ) diff --git a/platforms/ios/build_framework.py b/platforms/ios/build_framework.py index f546c6af5d..8b828fa267 100755 --- a/platforms/ios/build_framework.py +++ b/platforms/ios/build_framework.py @@ -31,8 +31,11 @@ from __future__ import print_function import glob, re, os, os.path, shutil, string, sys, argparse, traceback, multiprocessing from subprocess import check_call, check_output, CalledProcessError +IPHONEOS_DEPLOYMENT_TARGET='8.0' # default, can be changed via command line options or environemnt variable + def execute(cmd, cwd = None): print("Executing: %s in %s" % (cmd, cwd), file=sys.stderr) + print('Executing: ' + ' '.join(cmd)) retcode = check_call(cmd, cwd = cwd) if retcode != 0: raise Exception("Child returned:", retcode) @@ -149,7 +152,7 @@ class Builder: if self.dynamic: buildcmd += [ - "IPHONEOS_DEPLOYMENT_TARGET=8.0", + "IPHONEOS_DEPLOYMENT_TARGET=" + os.environ['IPHONEOS_DEPLOYMENT_TARGET'], "ONLY_ACTIVE_ARCH=NO", ] @@ -162,7 +165,7 @@ class Builder: else: arch = ";".join(archs) buildcmd += [ - "IPHONEOS_DEPLOYMENT_TARGET=6.0", + "IPHONEOS_DEPLOYMENT_TARGET=" + os.environ['IPHONEOS_DEPLOYMENT_TARGET'], "ARCHS=%s" % arch, ] @@ -184,7 +187,7 @@ class Builder: 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=NEON;FP16") + cmakecmd.append("-DCPU_BASELINE=DETECT") cmakecmd.append(self.opencv) cmakecmd.extend(cmakeargs) execute(cmakecmd, cwd = builddir) @@ -278,14 +281,21 @@ if __name__ == "__main__": parser.add_argument('--without', metavar='MODULE', default=[], action='append', help='OpenCV modules to exclude from the framework') parser.add_argument('--dynamic', default=False, action='store_true', help='build dynamic framework (default is "False" - builds static framework)') parser.add_argument('--disable-bitcode', default=False, dest='bitcodedisabled', action='store_true', help='disable bitcode (enabled by default)') + parser.add_argument('--iphoneos_deployment_target', default=os.environ.get('IPHONEOS_DEPLOYMENT_TARGET', IPHONEOS_DEPLOYMENT_TARGET), help='specify IPHONEOS_DEPLOYMENT_TARGET') + parser.add_argument('--iphoneos_archs', default='armv7,armv7s,arm64', help='select iPhoneOS target ARCHS') args = parser.parse_args() + os.environ['IPHONEOS_DEPLOYMENT_TARGET'] = args.iphoneos_deployment_target + print('Using IPHONEOS_DEPLOYMENT_TARGET=' + os.environ['IPHONEOS_DEPLOYMENT_TARGET']) + iphoneos_archs = args.iphoneos_archs.split(',') + print('Using iPhoneOS ARCHS=' + str(iphoneos_archs)) + b = iOSBuilder(args.opencv, args.contrib, args.dynamic, args.bitcodedisabled, args.without, [ - (["armv7s", "arm64"], "iPhoneOS"), + (iphoneos_archs, "iPhoneOS"), ] if os.environ.get('BUILD_PRECOMMIT', None) else [ - (["armv7", "armv7s", "arm64"], "iPhoneOS"), + (iphoneos_archs, "iPhoneOS"), (["i386", "x86_64"], "iPhoneSimulator"), ]) b.build(args.out) diff --git a/platforms/ios/cmake/Toolchains/common-ios-toolchain.cmake b/platforms/ios/cmake/Toolchains/common-ios-toolchain.cmake index 3eeb29199a..cec30f77b6 100644 --- a/platforms/ios/cmake/Toolchains/common-ios-toolchain.cmake +++ b/platforms/ios/cmake/Toolchains/common-ios-toolchain.cmake @@ -90,6 +90,13 @@ if(APPLE_FRAMEWORK AND NOT BUILD_SHARED_LIBS) set(CMAKE_OSX_ARCHITECTURES "${IOS_ARCH}" CACHE INTERNAL "Build architecture for iOS" FORCE) endif() +if(NOT DEFINED IPHONEOS_DEPLOYMENT_TARGET) + if(NOT DEFINED ENV{IPHONEOS_DEPLOYMENT_TARGET}) + message(FATAL_ERROR "IPHONEOS_DEPLOYMENT_TARGET is not specified") + endif() + set(IPHONEOS_DEPLOYMENT_TARGET "$ENV{IPHONEOS_DEPLOYMENT_TARGET}") +endif() + if(NOT __IN_TRY_COMPILE) set(_xcodebuild_wrapper "${CMAKE_BINARY_DIR}/xcodebuild_wrapper") if(NOT DEFINED CMAKE_MAKE_PROGRAM) # empty since CMake 3.10 @@ -103,14 +110,14 @@ if(NOT __IN_TRY_COMPILE) if(APPLE_FRAMEWORK AND BUILD_SHARED_LIBS) set(_xcodebuild_wrapper_tmp "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/xcodebuild_wrapper") file(WRITE "${_xcodebuild_wrapper_tmp}" "#!/bin/sh -${CMAKE_MAKE_PROGRAM} IPHONEOS_DEPLOYMENT_TARGET=8.0 -sdk ${CMAKE_OSX_SYSROOT} \$*") +${CMAKE_MAKE_PROGRAM} IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET} -sdk ${CMAKE_OSX_SYSROOT} \$*") # Make executable file(COPY "${_xcodebuild_wrapper_tmp}" DESTINATION ${CMAKE_BINARY_DIR} FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) set(CMAKE_MAKE_PROGRAM "${_xcodebuild_wrapper}" CACHE INTERNAL "" FORCE) else() set(_xcodebuild_wrapper_tmp "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/xcodebuild_wrapper") file(WRITE "${_xcodebuild_wrapper_tmp}" "#!/bin/sh -${CMAKE_MAKE_PROGRAM} IPHONEOS_DEPLOYMENT_TARGET=6.0 ARCHS=${IOS_ARCH} -sdk ${CMAKE_OSX_SYSROOT} \$*") +${CMAKE_MAKE_PROGRAM} IPHONEOS_DEPLOYMENT_TARGET=${IPHONEOS_DEPLOYMENT_TARGET} ARCHS=${IOS_ARCH} -sdk ${CMAKE_OSX_SYSROOT} \$*") # Make executable file(COPY "${_xcodebuild_wrapper_tmp}" DESTINATION ${CMAKE_BINARY_DIR} FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) set(CMAKE_MAKE_PROGRAM "${_xcodebuild_wrapper}" CACHE INTERNAL "" FORCE) @@ -162,4 +169,4 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -toolchain_save_config(IOS_ARCH) \ No newline at end of file +toolchain_save_config(IOS_ARCH IPHONEOS_DEPLOYMENT_TARGET)