示例#1
0
def build(outdir=None, device_sdk=None, simulator_sdk=None, **kwargs):
    """
    Build card.io SDK.
    """
    print(colors.white("Setup", bold=True))

    to_hide = [] if env.verbose else ["stdout", "stderr", "running"]

    xcode_preprocessor_flags = {}

    if not outdir:
        message = """
                     You must provide outdir=<sdk output parent dir>
                     Example usage:
                       `fab build:outdir=~` - normal build
                       `fab build:outdir=~,SCAN_EXPIRY=0` - to disable the experimental expiry-scan feature
                  """
        abort(textwrap.dedent(message).format(**locals()))

    if _confirm_ready_for_release("assets/strings"):
        sys.exit(1)

    outdir = os.path.abspath(os.path.expanduser(outdir))
    print colors.yellow(
        "Will save release sdk to {outdir}".format(outdir=outdir))
    out_subdir = "card.io_ios_sdk_{0}".format(_version_str(show_dirty=True))

    xcode_preprocessor_flags.update(kwargs)
    formatted_xcode_preprocessor_flags = " ".join(
        "{k}={v}".format(k=k, v=v)
        for k, v in xcode_preprocessor_flags.iteritems())
    extra_xcodebuild_settings = "GCC_PREPROCESSOR_DEFINITIONS='$(value) {formatted_xcode_preprocessor_flags}'".format(
        **locals())

    device_sdk = device_sdk or "iphoneos"
    simulator_sdk = simulator_sdk or "iphonesimulator"

    arch_to_sdk = (("i386", simulator_sdk), ("x86_64", simulator_sdk))

    with settings(hide(*to_hide)):
        icc_root = local("git rev-parse --show-toplevel", capture=True)

    temp_dir = tempfile.mkdtemp() + os.sep
    atexit.register(shutil.rmtree, temp_dir, True)

    print(colors.white("Preparing dmz", bold=True))
    with settings(hide(*to_hide)):
        with lcd(os.path.join(icc_root, "dmz")):
            dmz_all_filename = os.path.join("dmz", "dmz_all.cpp")
            with open(dmz_all_filename) as f:
                old_dmz_all = f.read()
            local("fab concat")
            with open(dmz_all_filename) as f:
                new_dmz_all = f.read()
            if old_dmz_all != new_dmz_all:
                print(
                    colors.red("WARNING: dmz_all.h was not up to date!",
                               bold=True))

    print(colors.white("Building", bold=True))
    print(colors.white("Using temp dir {temp_dir}".format(**locals())))
    print(
        colors.white(
            "Using extra Xcode flags: {formatted_xcode_preprocessor_flags}".
            format(**locals())))
    print(
        colors.white("Using developer directory: {}".format(
            env.developer_dir)))

    with lcd(icc_root):
        with shell_env(DEVELOPER_DIR=env.developer_dir):
            with settings(hide(*to_hide)):
                lipo_build_dirs = {}
                build_config = "Release"
                arch_build_dirs = {}

                # Build the Archive release
                print(
                    colors.blue(
                        "({build_config}) Building Archive (arm* architectures specified in build config)"
                        .format(**locals())))
                base_xcodebuild_command = "xcrun xcodebuild -scheme \"CardIO Static Library\" -target CardIO-static -configuration {build_config} archive".format(
                    **locals())
                build_dir = os.path.join(temp_dir, build_config, "Archive")
                arch_build_dirs["archive"] = build_dir
                os.makedirs(build_dir)
                parallelize = "" if env.verbose else "-parallelizeTargets"  # don't parallelize verbose builds, it's hard to read the output
                build_cmd = "{base_xcodebuild_command} {parallelize} CONFIGURATION_BUILD_DIR={build_dir}  {extra_xcodebuild_settings}".format(
                    **locals())
                local(build_cmd)

                for arch, sdk in arch_to_sdk:
                    print(
                        colors.blue("({build_config}) Building {arch}".format(
                            **locals())))

                    base_xcodebuild_command = "xcrun xcodebuild OTHER_CFLAGS='-fembed-bitcode' -target CardIO-static -arch {arch} -sdk {sdk} -configuration {build_config}".format(
                        **locals())

                    clean_cmd = "{base_xcodebuild_command} clean".format(
                        **locals())
                    local(clean_cmd)

                    build_dir = os.path.join(temp_dir, build_config, arch)
                    arch_build_dirs[arch] = build_dir
                    os.makedirs(build_dir)
                    parallelize = "" if env.verbose else "-parallelizeTargets"  # don't parallelize verbose builds, it's hard to read the output
                    build_cmd = "{base_xcodebuild_command} {parallelize} CONFIGURATION_BUILD_DIR={build_dir}  {extra_xcodebuild_settings}".format(
                        **locals())
                    local(build_cmd)

                print(
                    colors.blue("({build_config}) Lipoing".format(**locals())))
                lipo_dir = os.path.join(temp_dir, build_config, "universal")
                lipo_build_dirs[build_config] = lipo_dir
                os.makedirs(lipo_dir)
                arch_build_dirs["universal"] = lipo_dir
                # in Xcode 4.5 GM, xcrun selects the wrong lipo to use, so circumventing xcrun for now :(
                lipo_cmd = "`xcode-select -print-path`/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo " \
                           "           {archive}/{libname}" \
                           "           -arch i386 {i386}/{libname}" \
                           "           -arch x86_64 {x86_64}/{libname}" \
                           "           -create" \
                           "           -output {universal}/{libname}".format(libname=env.libname, **arch_build_dirs)
                local(lipo_cmd)

                print(
                    colors.blue(
                        "({build_config}) Stripping debug symbols".format(
                            **locals())))
                strip_cmd = "xcrun strip -S {universal}/{libname}".format(
                    libname=env.libname, **arch_build_dirs)
                local(strip_cmd)

                out_subdir_suffix = "_".join("{k}-{v}".format(k=k, v=v)
                                             for k, v in kwargs.iteritems())
                if out_subdir_suffix:
                    out_subdir_suffix = "_" + out_subdir_suffix
                out_subdir += out_subdir_suffix
                sdk_dir = os.path.join(outdir, out_subdir)

                print(
                    colors.white("Assembling release SDK in {sdk_dir}".format(
                        sdk_dir=sdk_dir),
                                 bold=True))
                if os.path.isdir(sdk_dir):
                    shutil.rmtree(sdk_dir)
                cardio_dir = os.path.join(sdk_dir, "CardIO")
                os.makedirs(cardio_dir)

                header_files = glob.glob(
                    os.path.join("CardIO_Public_API", "*.h"))
                _copy(header_files, cardio_dir)

                opencv_libraries = glob.glob(
                    os.path.join("opencv_device/lib/", "*.a"))
                _copy(opencv_libraries, cardio_dir)

                libfile = os.path.join(lipo_build_dirs["Release"], env.libname)
                shutil.copy2(libfile, cardio_dir)

                release_dir = os.path.join(icc_root, "Release")
                shutil.copy2(os.path.join(release_dir, "release_notes.txt"),
                             sdk_dir)
                shutil.copy2(os.path.join(release_dir, "CardIO.podspec"),
                             sdk_dir)
                shutil.copy2(os.path.join(release_dir, "acknowledgments.md"),
                             sdk_dir)
                shutil.copy2(os.path.join(release_dir, "LICENSE.md"), sdk_dir)
                shutil.copy2(os.path.join(release_dir, "README.md"), sdk_dir)
                shutil.copy2(os.path.join(release_dir, "CardIO/CardIO.m"),
                             os.path.join(sdk_dir, "CardIO"))
                shutil.copytree(os.path.join(release_dir, "SampleApp"),
                                os.path.join(sdk_dir, "SampleApp"),
                                ignore=shutil.ignore_patterns(".DS_Store"))
                shutil.copytree(os.path.join(release_dir, "SampleApp-Swift"),
                                os.path.join(sdk_dir, "SampleApp-Swift"),
                                ignore=shutil.ignore_patterns(".DS_Store"))
示例#2
0
def build(outdir=None, device_sdk=None, simulator_sdk=None, **kwargs):
    """
    Build card.io SDK.
    """
    print(colors.white("Setup", bold=True))

    to_hide = [] if env.verbose else ["stdout", "stderr", "running"]

    xcode_preprocessor_flags = {}

    if not outdir:
        message = """
                     You must provide outdir=<sdk output parent dir>
                     Example usage:
                       `fab build:outdir=~` - normal build
                       `fab build:outdir=~,SCAN_EXPIRY=0` - to disable the experimental expiry-scan feature
                  """
        abort(textwrap.dedent(message).format(**locals()))

    if _confirm_ready_for_release("assets/strings"):
		sys.exit(1)

    outdir = os.path.abspath(os.path.expanduser(outdir))
    print colors.yellow("Will save release sdk to {outdir}".format(outdir=outdir))
    out_subdir = "card.io_ios_sdk_{0}".format(_version_str(show_dirty=True))

    xcode_preprocessor_flags.update(kwargs)
    formatted_xcode_preprocessor_flags = " ".join("{k}={v}".format(k=k, v=v) for k, v in xcode_preprocessor_flags.iteritems())
    extra_xcodebuild_settings = "GCC_PREPROCESSOR_DEFINITIONS='$(value) {formatted_xcode_preprocessor_flags}'".format(**locals())

    device_sdk = device_sdk or "iphoneos"
    simulator_sdk = simulator_sdk or "iphonesimulator"

    arch_to_sdk = (("armv7", device_sdk),
                   ("armv7s", device_sdk),
                   ("arm64", device_sdk),
                   ("i386", simulator_sdk),
                   ("x86_64", simulator_sdk)
                  )

    with settings(hide(*to_hide)):
        icc_root = local("git rev-parse --show-toplevel", capture=True)

    temp_dir = tempfile.mkdtemp() + os.sep
    atexit.register(shutil.rmtree, temp_dir, True)

    print(colors.white("Preparing dmz", bold=True))
    with settings(hide(*to_hide)):
        with lcd(os.path.join(icc_root, "dmz")):
            dmz_all_filename = os.path.join("dmz", "dmz_all.cpp")
            with open(dmz_all_filename) as f:
                old_dmz_all = f.read()
            local("fab concat")
            with open(dmz_all_filename) as f:
                new_dmz_all = f.read()
            if old_dmz_all != new_dmz_all:
                print(colors.red("WARNING: dmz_all.h was not up to date!", bold=True))
    
    print(colors.white("Building", bold=True))
    print(colors.white("Using temp dir {temp_dir}".format(**locals())))
    print(colors.white("Using extra Xcode flags: {formatted_xcode_preprocessor_flags}".format(**locals())))
    print(colors.white("Using developer directory: {}".format(env.developer_dir)))

    with lcd(icc_root):
        with shell_env(DEVELOPER_DIR=env.developer_dir):
            with settings(hide(*to_hide)):
                lipo_build_dirs = {}
                build_config = "Release"
                arch_build_dirs = {}
                for arch, sdk in arch_to_sdk:
                    print(colors.blue("({build_config}) Building {arch}".format(**locals())))

                    base_xcodebuild_command = "xcrun xcodebuild -target CardIO -arch {arch} -sdk {sdk} -configuration {build_config}".format(**locals())

                    clean_cmd =  "{base_xcodebuild_command} clean".format(**locals())
                    local(clean_cmd)

                    build_dir = os.path.join(temp_dir, build_config, arch)
                    arch_build_dirs[arch] = build_dir
                    os.makedirs(build_dir)
                    parallelize = "" if env.verbose else "-parallelizeTargets"  # don't parallelize verbose builds, it's hard to read the output
                    build_cmd = "{base_xcodebuild_command} {parallelize} CONFIGURATION_BUILD_DIR={build_dir}  {extra_xcodebuild_settings}".format(**locals())
                    local(build_cmd)

                print(colors.blue("({build_config}) Lipoing".format(**locals())))
                lipo_dir = os.path.join(temp_dir, build_config, "universal")
                lipo_build_dirs[build_config] = lipo_dir
                os.makedirs(lipo_dir)
                arch_build_dirs["universal"] = lipo_dir
                # in Xcode 4.5 GM, xcrun selects the wrong lipo to use, so circumventing xcrun for now :(
                lipo_cmd = "`xcode-select -print-path`/Platforms/iPhoneOS.platform/Developer/usr/bin/lipo " \
                           "           {armv7}/{libname}" \
                           "           -arch armv7s {armv7s}/{libname}" \
                           "           -arch arm64 {arm64}/{libname}" \
                           "           -arch i386 {i386}/{libname}" \
                           "           -arch x86_64 {x86_64}/{libname}" \
                           "           -create" \
                           "           -output {universal}/{libname}".format(libname=env.libname, **arch_build_dirs)
                local(lipo_cmd)

                print(colors.blue("({build_config}) Stripping debug symbols".format(**locals())))
                strip_cmd = "xcrun strip -S {universal}/{libname}".format(libname=env.libname, **arch_build_dirs)
                local(strip_cmd)

                out_subdir_suffix = "_".join("{k}-{v}".format(k=k, v=v) for k, v in kwargs.iteritems())
                if out_subdir_suffix:
                    out_subdir_suffix = "_" + out_subdir_suffix
                out_subdir += out_subdir_suffix
                sdk_dir = os.path.join(outdir, out_subdir)

                print(colors.white("Assembling release SDK in {sdk_dir}".format(sdk_dir=sdk_dir), bold=True))
                if os.path.isdir(sdk_dir):
                    shutil.rmtree(sdk_dir)
                cardio_dir = os.path.join(sdk_dir, "CardIO")
                os.makedirs(cardio_dir)

                header_files = glob.glob(os.path.join("CardIO_Public_API", "*.h"))
                _copy(header_files, cardio_dir)

                libfile = os.path.join(lipo_build_dirs["Release"], env.libname)
                shutil.copy2(libfile, cardio_dir)

                release_dir = os.path.join(icc_root, "Release")
                shutil.copy2(os.path.join(release_dir, "release_notes.txt"), sdk_dir)
                shutil.copy2(os.path.join(release_dir, "CardIO.podspec"), sdk_dir)
                shutil.copy2(os.path.join(release_dir, "acknowledgments.md"), sdk_dir)
                shutil.copy2(os.path.join(release_dir, "LICENSE.md"), sdk_dir)
                shutil.copy2(os.path.join(release_dir, "README.md"), sdk_dir)
                shutil.copytree(os.path.join(release_dir, "SampleApp"), os.path.join(sdk_dir, "SampleApp"), ignore=shutil.ignore_patterns(".DS_Store"))
                shutil.copytree(os.path.join(release_dir, "SampleApp-Swift"), os.path.join(sdk_dir, "SampleApp-Swift"), ignore=shutil.ignore_patterns(".DS_Store"))