def package_host_tools(out_dir, dist_dir, host):
    packages = [
        'gdb-multiarch-7.11',
        'ndk-awk',
        'ndk-depends',
        'ndk-make',
        'ndk-python',
        'ndk-stack',
        'ndk-yasm',
    ]

    files = [
        'ndk-gdb',
        'ndk-gdb.py',
        'ndk-which',
    ]

    if host in ('windows', 'windows64'):
        packages.append('toolbox')
        files.append('ndk-gdb.cmd')

    host_tag = build_support.host_to_tag(host)

    package_names = [p + '-' + host_tag + '.tar.bz2' for p in packages]
    for package_name in package_names:
        package_path = os.path.join(out_dir, package_name)
        subprocess.check_call(['tar', 'xf', package_path, '-C', out_dir])

    for f in files:
        shutil.copy2(f, os.path.join(out_dir, 'host-tools/bin'))

    build_support.merge_license_files(
        os.path.join(out_dir, 'host-tools/NOTICE'), [
            build_support.android_path('toolchain/gdb/gdb-7.11/COPYING'),
            build_support.ndk_path('sources/host-tools/nawk-20071023/NOTICE'),
            build_support.ndk_path('sources/host-tools/ndk-depends/NOTICE'),
            build_support.ndk_path('sources/host-tools/make-3.81/COPYING'),
            build_support.android_path(
                'toolchain/python/Python-2.7.5/LICENSE'),
            build_support.ndk_path('sources/host-tools/ndk-stack/NOTICE'),
            build_support.ndk_path('sources/host-tools/toolbox/NOTICE'),
            build_support.android_path('toolchain/yasm/COPYING'),
            build_support.android_path('toolchain/yasm/BSD.txt'),
            build_support.android_path('toolchain/yasm/Artistic.txt'),
            build_support.android_path('toolchain/yasm/GNU_GPL-2.0'),
            build_support.android_path('toolchain/yasm/GNU_LGPL-2.0'),
        ])

    package_name = 'host-tools-' + host_tag
    path = os.path.join(out_dir, 'host-tools')
    build_support.make_package(package_name, path, dist_dir)
def package_host_tools(out_dir, dist_dir, host):
    packages = [
        'gdb-multiarch-7.11',
        'ndk-awk',
        'ndk-depends',
        'ndk-make',
        'ndk-python',
        'ndk-stack',
        'ndk-yasm',
    ]

    files = [
        'ndk-gdb',
        'ndk-gdb.py',
        'ndk-which',
    ]

    if host in ('windows', 'windows64'):
        packages.append('toolbox')
        files.append('ndk-gdb.cmd')

    host_tag = build_support.host_to_tag(host)

    package_names = [p + '-' + host_tag + '.tar.bz2' for p in packages]
    for package_name in package_names:
        package_path = os.path.join(out_dir, package_name)
        subprocess.check_call(['tar', 'xf', package_path, '-C', out_dir])

    for f in files:
        shutil.copy2(f, os.path.join(out_dir, 'host-tools/bin'))

    build_support.merge_license_files(
        os.path.join(out_dir, 'host-tools/NOTICE'), [
            build_support.android_path('toolchain/gdb/gdb-7.11/COPYING'),
            build_support.ndk_path('sources/host-tools/nawk-20071023/NOTICE'),
            build_support.ndk_path('sources/host-tools/ndk-depends/NOTICE'),
            build_support.ndk_path('sources/host-tools/make-3.81/COPYING'),
            build_support.android_path(
                'toolchain/python/Python-2.7.5/LICENSE'),
            build_support.ndk_path('sources/host-tools/ndk-stack/NOTICE'),
            build_support.ndk_path('sources/host-tools/toolbox/NOTICE'),
            build_support.android_path('toolchain/yasm/COPYING'),
            build_support.android_path('toolchain/yasm/BSD.txt'),
            build_support.android_path('toolchain/yasm/Artistic.txt'),
            build_support.android_path('toolchain/yasm/GNU_GPL-2.0'),
            build_support.android_path('toolchain/yasm/GNU_LGPL-2.0'),
        ])

    package_name = 'host-tools-' + host_tag
    path = os.path.join(out_dir, 'host-tools')
    build_support.make_package(package_name, path, dist_dir)
def main(args):
    host_tag = build_support.host_to_tag(args.host)
    build_host_tag = build_support.get_default_host() + "-x86"

    package_dir = args.dist_dir

    # TODO(danalbert): use ndk/sources/third_party/googletest/googletest
    # after it has been updated to a version with CMakeLists
    gtest_cmd = ('-DSHADERC_GOOGLE_TEST_DIR=' +
                 os.path.join(build_support.android_path(),
                              'external', 'googletest'))

    obj_out = os.path.join(args.out_dir, 'shader_tools/obj')
    install_dir = os.path.join(args.out_dir, 'shader_tools/install')

    package_src = '-'.join([os.path.join(args.out_dir,
                                         'shader_tools/shader-tools'),
                            host_tag])
    package_name = '-'.join(['shader-tools', host_tag])

    source_root = os.path.join(build_support.android_path(), 'external',
                               'shaderc')
    shaderc_shaderc_dir = os.path.join(source_root, 'shaderc')
    spirv_headers_dir = os.path.join(source_root, 'spirv-headers')

    cmake = os.path.join(build_support.android_path(),
                         'prebuilts', 'cmake', build_host_tag, 'bin', 'cmake')
    ctest = os.path.join(build_support.android_path(),
                         'prebuilts', 'cmake', build_host_tag, 'bin', 'ctest')
    ninja = os.path.join(build_support.android_path(),
                         'prebuilts', 'ninja', build_host_tag, 'ninja')
    file_extension = ''

    additional_args = []
    if args.host.startswith("windows"):
        # Use MinGW to cross compile.
        # Use the stock MinGW-w64 from Ubuntu.
        # The prebuilts MinGW GCC 4.8.3 appears to be broken.
        mingw_toolchain = os.path.join(source_root, 'shaderc',
                                       'cmake', 'linux-mingw-toolchain.cmake')
        # Turn off pthreads support in gtest. Otherwise I get an error in
        # gtest-port.h for use of type AutoHandle in gtest-port.h without a
        # definition.
        additional_args = ['-DCMAKE_TOOLCHAIN_FILE=' + mingw_toolchain,
                           '-Dgtest_disable_pthreads=ON']
        file_extension = '.exe'
        if args.host == "windows64":
            additional_args.extend(
                ['-DCMAKE_CXX_FLAGS=-fno-rtti -fno-exceptions'])
        else:
            additional_args.extend(
                ['-DCMAKE_CXX_FLAGS=-m32 -fno-rtti -fno-exceptions',
                 '-DCMAKE_C_FLAGS=-m32'])

    for d in [package_src, obj_out, install_dir]:
        try:
            os.makedirs(d)
        except:
            pass

    # Create the NOTICE file.
    license_files = [
        os.path.join(shaderc_shaderc_dir, 'LICENSE'),
        os.path.join(shaderc_shaderc_dir,
                     'third_party',
                     'LICENSE.spirv-tools'),
        os.path.join(shaderc_shaderc_dir,
                     'third_party',
                     'LICENSE.glslang'),
    ]
    # The SPIRV-Headers might not have landed just yet.  Use its
    # license file if it exists.
    spirv_headers_license = os.path.join(spirv_headers_dir, 'LICENSE')
    if os.path.exists(spirv_headers_license):
        license_files.append(spirv_headers_license)

    build_support.merge_license_files(os.path.join(package_src, 'NOTICE'),
                                      license_files)

    cmake_command = [cmake, '-GNinja', '-DCMAKE_MAKE_PROGRAM=' + ninja,
                     '-DCMAKE_BUILD_TYPE=Release',
                     '-DCMAKE_INSTALL_PREFIX=' + install_dir,
                     '-DSHADERC_THIRD_PARTY_ROOT_DIR=' + source_root,
                     '-DSPIRV-Headers_SOURCE_DIR=' + spirv_headers_dir,
                     gtest_cmd,
                     shaderc_shaderc_dir]

    cmake_command.extend(additional_args)

    subprocess.check_call(cmake_command, cwd=obj_out)
    subprocess.check_call([cmake, '--build', obj_out, '--', '-v'])
    subprocess.check_call([cmake, '--build', obj_out,
                           '--target', 'install/strip'])

    files_to_copy = ['glslc' + file_extension,
                     'spirv-as' + file_extension,
                     'spirv-dis' + file_extension,
                     'spirv-val' + file_extension,
                     'spirv-cfg' + file_extension,
                     'spirv-opt' + file_extension]
    scripts_to_copy = ['spirv-lesspipe.sh',]
    files_to_copy.extend(scripts_to_copy)

    # Test, except on windows.
    if (not args.host.startswith('windows')):
        subprocess.check_call([ctest, '--verbose'], cwd=obj_out)

    # Copy to install tree.
    for src in files_to_copy:
        shutil.copy2(os.path.join(install_dir, 'bin', src),
                     os.path.join(package_src, src))
    if args.host.startswith('windows'):
        for src in scripts_to_copy:
            # Convert line endings on scripts.
            # Do it in place to preserve executable permissions.
            subprocess.check_call(['unix2dos', '-o',
                                   os.path.join(package_src, src)])

    build_support.make_package(package_name, package_src, package_dir)
def build_vulkan(out_dir, dist_dir, args):
    print('Constructing Vulkan validation layer source...')
    vulkan_root_dir = build_support.android_path('external/vulkan-validation-layers')

    copies = [
        {
            'source_dir': vulkan_root_dir,
            'dest_dir': 'vulkan/src',
            'files': [
              'vk-generate.py',
              'vk_helper.py',
              'vk-layer-generate.py',
              'generator.py',
              'genvk.py',
              'reg.py',
              'source_line_info.py',
              'vulkan.py',
              'vk.xml'
            ],
            'dirs': [
                'layers', 'include'
            ],
        },
        {
            'source_dir': vulkan_root_dir + '/loader',
            'dest_dir': 'vulkan/src/loader',
            'files': [
              'vk_loader_platform.h'
            ],
            'dirs': [],
        },
        {
            'source_dir': build_support.android_path('external/shaderc/glslang'),
            'dest_dir': 'vulkan/glslang',
            'files': [],
            'dirs': [
                'SPIRV',
            ],
        },
    ]

    default_ignore_patterns = shutil.ignore_patterns(
        "*CMakeLists.txt",
        "*test.h",
        "*test.cc",
        "linux",
        "windows")

    vulkan_path = os.path.join(out_dir, 'vulkan/src')
    for properties in copies:
        source_dir = properties['source_dir']
        dest_dir = os.path.join(out_dir, properties['dest_dir'])
        for d in properties['dirs']:
            src = os.path.join(source_dir, d)
            dst = os.path.join(dest_dir, d)
            shutil.rmtree(dst, 'true')
            shutil.copytree(src, dst,
                            ignore=default_ignore_patterns)
        for f in properties['files']:
            install_file(f, source_dir, dest_dir)

    # Copy Android build components
    src = os.path.join(vulkan_root_dir, 'build-android')
    dst = os.path.join(vulkan_path, 'build-android')
    shutil.rmtree(dst, 'true')
    shutil.copytree(src, dst,
                  ignore=default_ignore_patterns)

    build_support.merge_license_files(
        os.path.join(vulkan_path, 'NOTICE'), [
        os.path.join(vulkan_root_dir, 'LICENSE.txt')])

    build_cmd = [
        'bash', vulkan_path + '/build-android/android-generate.sh'
    ]
    print('Generating generated layers...')
    subprocess.check_call(build_cmd)
    print('Generation finished')

    build_args = common_build_args(out_dir, dist_dir, args)
    if args.arch is not None:
        build_args.append('--arch={}'.format(args.arch))
    build_args.append('--no-symbols')

    # TODO: Verify source packaged properly
    print('Packaging Vulkan source...')
    src = os.path.join(out_dir, 'vulkan')
    build_support.make_package('vulkan', src, dist_dir)
    print('Packaging Vulkan source finished')
def build_libshaderc(_, dist_dir, __):
    print('Building libshaderc...')
    shaderc_root_dir = build_support.android_path('external/shaderc')

    copies = [
        {
            'source_dir': os.path.join(shaderc_root_dir, 'shaderc'),
            'dest_dir': 'shaderc',
            'files': [
                'Android.mk', 'libshaderc/Android.mk',
                'libshaderc_util/Android.mk',
                'third_party/Android.mk',
            ],
            'dirs': [
                'libshaderc/include', 'libshaderc/src',
                'libshaderc_util/include', 'libshaderc_util/src',
            ],
        },
        {
            'source_dir': os.path.join(shaderc_root_dir, 'spirv-tools'),
            'dest_dir': 'shaderc/third_party/spirv-tools',
            'files': [],
            'dirs': ['include', 'source'],
        },
        {
            'source_dir': os.path.join(shaderc_root_dir, 'glslang'),
            'dest_dir': 'shaderc/third_party/glslang',
            'files': ['glslang/OSDependent/osinclude.h'],
            'dirs': [
                'SPIRV',
                'OGLCompilersDLL',
                'glslang/GenericCodeGen',
                'glslang/Include',
                'glslang/MachineIndependent',
                'glslang/OSDependent/Unix',
                'glslang/Public',
            ],
        },
    ]

    default_ignore_patterns = shutil.ignore_patterns(
        "*CMakeLists.txt",
        "*.py",
        "*test.h",
        "*test.cc")

    temp_dir = tempfile.mkdtemp()
    shaderc_path = os.path.join(temp_dir, 'shaderc')
    try:
        for properties in copies:
            source_dir = properties['source_dir']
            dest_dir = os.path.join(temp_dir, properties['dest_dir'])
            for d in properties['dirs']:
                src = os.path.join(source_dir, d)
                dst = os.path.join(dest_dir, d)
                shutil.copytree(src, dst,
                                ignore=default_ignore_patterns)
            for f in properties['files']:
                print(source_dir, ':', dest_dir, ":", f)
                install_file(f, source_dir, dest_dir)

        shaderc_shaderc_dir = os.path.join(shaderc_root_dir, 'shaderc')
        build_support.merge_license_files(
            os.path.join(shaderc_path, 'NOTICE'), [
                os.path.join(shaderc_shaderc_dir, 'LICENSE'),
                os.path.join(shaderc_shaderc_dir,
                             'third_party',
                             'LICENSE.spirv-tools'),
                os.path.join(shaderc_shaderc_dir,
                             'third_party',
                             'LICENSE.glslang')])
        build_support.make_package('shaderc', shaderc_path, dist_dir)
    finally:
        shutil.rmtree(temp_dir)
def build_vulkan(out_dir, dist_dir, args):
    print('Constructing Vulkan validation layer source...')
    vulkan_root_dir = build_support.android_path(
        'external/vulkan-validation-layers')

    copies = [
        {
            'source_dir':
            vulkan_root_dir,
            'dest_dir':
            'vulkan/src',
            'files': [
                'vk-generate.py', 'vk_helper.py', 'vk-layer-generate.py',
                'generator.py', 'genvk.py', 'reg.py', 'source_line_info.py',
                'vulkan.py', 'vk.xml'
            ],
            'dirs': ['layers', 'include'],
        },
        {
            'source_dir': vulkan_root_dir + '/loader',
            'dest_dir': 'vulkan/src/loader',
            'files': ['vk_loader_platform.h'],
            'dirs': [],
        },
        {
            'source_dir':
            build_support.android_path('external/shaderc/glslang'),
            'dest_dir': 'vulkan/glslang',
            'files': [],
            'dirs': [
                'SPIRV',
            ],
        },
    ]

    default_ignore_patterns = shutil.ignore_patterns("*CMakeLists.txt",
                                                     "*test.h", "*test.cc",
                                                     "linux", "windows")

    vulkan_path = os.path.join(out_dir, 'vulkan/src')
    for properties in copies:
        source_dir = properties['source_dir']
        dest_dir = os.path.join(out_dir, properties['dest_dir'])
        for d in properties['dirs']:
            src = os.path.join(source_dir, d)
            dst = os.path.join(dest_dir, d)
            shutil.rmtree(dst, 'true')
            shutil.copytree(src, dst, ignore=default_ignore_patterns)
        for f in properties['files']:
            install_file(f, source_dir, dest_dir)

    # Copy Android build components
    src = os.path.join(vulkan_root_dir, 'build-android')
    dst = os.path.join(vulkan_path, 'build-android')
    shutil.rmtree(dst, 'true')
    shutil.copytree(src, dst, ignore=default_ignore_patterns)

    build_support.merge_license_files(os.path.join(
        vulkan_path, 'NOTICE'), [os.path.join(vulkan_root_dir, 'LICENSE.txt')])

    build_cmd = ['bash', vulkan_path + '/build-android/android-generate.sh']
    print('Generating generated layers...')
    subprocess.check_call(build_cmd)
    print('Generation finished')

    build_args = common_build_args(out_dir, dist_dir, args)
    if args.arch is not None:
        build_args.append('--arch={}'.format(args.arch))
    build_args.append('--no-symbols')

    # TODO: Verify source packaged properly
    print('Packaging Vulkan source...')
    src = os.path.join(out_dir, 'vulkan')
    build_support.make_package('vulkan', src, dist_dir)
    print('Packaging Vulkan source finished')
def build_libshaderc(_, dist_dir, __):
    print('Building libshaderc...')
    shaderc_root_dir = build_support.android_path('external/shaderc')

    copies = [
        {
            'source_dir':
            os.path.join(shaderc_root_dir, 'shaderc'),
            'dest_dir':
            'shaderc',
            'files': [
                'Android.mk',
                'libshaderc/Android.mk',
                'libshaderc_util/Android.mk',
                'third_party/Android.mk',
            ],
            'dirs': [
                'libshaderc/include',
                'libshaderc/src',
                'libshaderc_util/include',
                'libshaderc_util/src',
            ],
        },
        {
            'source_dir': os.path.join(shaderc_root_dir, 'spirv-tools'),
            'dest_dir': 'shaderc/third_party/spirv-tools',
            'files': [],
            'dirs': ['include', 'source'],
        },
        {
            'source_dir':
            os.path.join(shaderc_root_dir, 'glslang'),
            'dest_dir':
            'shaderc/third_party/glslang',
            'files': ['glslang/OSDependent/osinclude.h'],
            'dirs': [
                'SPIRV',
                'OGLCompilersDLL',
                'glslang/GenericCodeGen',
                'glslang/Include',
                'glslang/MachineIndependent',
                'glslang/OSDependent/Unix',
                'glslang/Public',
            ],
        },
    ]

    default_ignore_patterns = shutil.ignore_patterns("*CMakeLists.txt", "*.py",
                                                     "*test.h", "*test.cc")

    temp_dir = tempfile.mkdtemp()
    shaderc_path = os.path.join(temp_dir, 'shaderc')
    try:
        for properties in copies:
            source_dir = properties['source_dir']
            dest_dir = os.path.join(temp_dir, properties['dest_dir'])
            for d in properties['dirs']:
                src = os.path.join(source_dir, d)
                dst = os.path.join(dest_dir, d)
                shutil.copytree(src, dst, ignore=default_ignore_patterns)
            for f in properties['files']:
                print(source_dir, ':', dest_dir, ":", f)
                install_file(f, source_dir, dest_dir)

        shaderc_shaderc_dir = os.path.join(shaderc_root_dir, 'shaderc')
        build_support.merge_license_files(os.path.join(
            shaderc_path, 'NOTICE'), [
                os.path.join(shaderc_shaderc_dir, 'LICENSE'),
                os.path.join(shaderc_shaderc_dir, 'third_party',
                             'LICENSE.spirv-tools'),
                os.path.join(shaderc_shaderc_dir, 'third_party',
                             'LICENSE.glslang')
            ])
        build_support.make_package('shaderc', shaderc_path, dist_dir)
    finally:
        shutil.rmtree(temp_dir)
def main(args):
    host_tag = build_support.host_to_tag(args.host)
    build_host_tag = build_support.get_default_host() + "-x86"

    package_dir = args.dist_dir

    # TODO(danalbert): use ndk/sources/third_party/googletest/googletest
    # after it has been updated to a version with CMakeLists
    gtest_dir = os.path.join(build_support.android_path(), 'external',
                             'googletest')

    obj_out = os.path.join(args.out_dir, 'shader_tools/obj')
    install_dir = os.path.join(args.out_dir, 'shader_tools/install')

    package_src = '-'.join(
        [os.path.join(args.out_dir, 'shader_tools/shader-tools'), host_tag])
    package_name = '-'.join(['shader-tools', host_tag])

    source_root = os.path.join(build_support.android_path(), 'external',
                               'shaderc')
    shaderc_shaderc_dir = os.path.join(source_root, 'shaderc')

    cmake = os.path.join(build_support.android_path(), 'prebuilts', 'cmake',
                         build_host_tag, 'bin', 'cmake')
    ctest = os.path.join(build_support.android_path(), 'prebuilts', 'cmake',
                         build_host_tag, 'bin', 'ctest')
    ninja = os.path.join(build_support.android_path(), 'prebuilts', 'ninja',
                         build_host_tag, 'ninja')
    file_extension = ''

    additional_args = []
    if args.host.startswith("windows"):
        mingw_root = os.path.join(build_support.android_path(), 'prebuilts',
                                  'gcc', build_host_tag, 'host',
                                  'x86_64-w64-mingw32-4.8')
        mingw_compilers = os.path.join(mingw_root, 'bin', 'x86_64-w64-mingw32')
        mingw_toolchain = os.path.join(source_root, 'shaderc', 'cmake',
                                       'linux-mingw-toolchain.cmake')
        additional_args = [
            '-DCMAKE_TOOLCHAIN_FILE=' + mingw_toolchain,
            '-DMINGW_SYSROOT=' + mingw_root,
            '-DMINGW_COMPILER_PREFIX=' + mingw_compilers
        ]
        file_extension = '.exe'
        if args.host == "windows64":
            additional_args.extend(
                ['-DCMAKE_CXX_FLAGS=-fno-rtti -fno-exceptions'])
        else:
            additional_args.extend([
                '-DCMAKE_CXX_FLAGS=-m32 -fno-rtti -fno-exceptions',
                '-DCMAKE_C_FLAGS=-m32'
            ])

    for d in [package_src, obj_out, install_dir]:
        try:
            os.makedirs(d)
        except:
            pass

    build_support.merge_license_files(os.path.join(package_src, 'NOTICE'), [
        os.path.join(shaderc_shaderc_dir, 'LICENSE'),
        os.path.join(shaderc_shaderc_dir, 'third_party',
                     'LICENSE.spirv-tools'),
        os.path.join(shaderc_shaderc_dir, 'third_party', 'LICENSE.glslang')
    ])

    cmake_command = [
        cmake, '-GNinja', '-DCMAKE_MAKE_PROGRAM=' + ninja,
        '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_INSTALL_PREFIX=' + install_dir,
        '-DSHADERC_THIRD_PARTY_ROOT_DIR=' + source_root,
        '-DSHADERC_GOOGLE_TEST_DIR=' + gtest_dir, shaderc_shaderc_dir
    ]

    cmake_command.extend(additional_args)

    subprocess.check_call(cmake_command, cwd=obj_out)
    subprocess.check_call([cmake, '--build', obj_out, '--', '-v'])
    subprocess.check_call(
        [cmake, '--build', obj_out, '--target', 'install/strip'])

    files_to_copy = [
        'glslc' + file_extension, 'spirv-as' + file_extension,
        'spirv-dis' + file_extension, 'spirv-val' + file_extension
    ]
    if (not args.host.startswith('windows')):
        subprocess.check_call([ctest, '--verbose'], cwd=obj_out)

    for src in files_to_copy:
        shutil.copy2(os.path.join(install_dir, 'bin', src),
                     os.path.join(package_src, src))

    build_support.make_package(package_name, package_src, package_dir)
def main(args):
    host_tag = build_support.host_to_tag(args.host)
    build_host_tag = build_support.get_default_host() + "-x86"

    package_dir = args.dist_dir

    # TODO(danalbert): use ndk/sources/third_party/googletest/googletest
    # after it has been updated to a version with CMakeLists
    gtest_dir = os.path.join(build_support.android_path(), 'external',
                             'googletest')

    obj_out = os.path.join(args.out_dir, 'shader_tools/obj')
    install_dir = os.path.join(args.out_dir, 'shader_tools/install')

    package_src = '-'.join([os.path.join(args.out_dir,
                                         'shader_tools/shader-tools'),
                            host_tag])
    package_name = '-'.join(['shader-tools', host_tag])

    source_root = os.path.join(build_support.android_path(), 'external',
                               'shaderc')
    shaderc_shaderc_dir = os.path.join(source_root, 'shaderc')

    cmake = os.path.join(build_support.android_path(),
                         'prebuilts', 'cmake', build_host_tag, 'bin', 'cmake')
    ctest = os.path.join(build_support.android_path(),
                         'prebuilts', 'cmake', build_host_tag, 'bin', 'ctest')
    ninja = os.path.join(build_support.android_path(),
                         'prebuilts', 'ninja', build_host_tag, 'ninja')
    file_extension = ''

    additional_args = []
    if args.host.startswith("windows"):
        mingw_root = os.path.join(build_support.android_path(),
                                  'prebuilts', 'gcc', build_host_tag, 'host',
                                  'x86_64-w64-mingw32-4.8')
        mingw_compilers = os.path.join(mingw_root, 'bin', 'x86_64-w64-mingw32')
        mingw_toolchain = os.path.join(source_root, 'shaderc',
                                       'cmake', 'linux-mingw-toolchain.cmake')
        additional_args = ['-DCMAKE_TOOLCHAIN_FILE=' + mingw_toolchain,
                           '-DMINGW_SYSROOT=' + mingw_root,
                           '-DMINGW_COMPILER_PREFIX=' + mingw_compilers]
        file_extension = '.exe'
        if args.host == "windows64":
            additional_args.extend(
                ['-DCMAKE_CXX_FLAGS=-fno-rtti -fno-exceptions'])
        else:
            additional_args.extend(
                ['-DCMAKE_CXX_FLAGS=-m32 -fno-rtti -fno-exceptions',
                 '-DCMAKE_C_FLAGS=-m32'])

    for d in [package_src, obj_out, install_dir]:
        try:
            os.makedirs(d)
        except:
            pass

    build_support.merge_license_files(os.path.join(package_src, 'NOTICE'), [
        os.path.join(shaderc_shaderc_dir, 'LICENSE'),
        os.path.join(shaderc_shaderc_dir,
                     'third_party',
                     'LICENSE.spirv-tools'),
        os.path.join(shaderc_shaderc_dir,
                     'third_party',
                     'LICENSE.glslang')])

    cmake_command = [cmake, '-GNinja', '-DCMAKE_MAKE_PROGRAM=' + ninja,
                     '-DCMAKE_BUILD_TYPE=Release',
                     '-DCMAKE_INSTALL_PREFIX=' + install_dir,
                     '-DSHADERC_THIRD_PARTY_ROOT_DIR=' + source_root,
                     '-DSHADERC_GOOGLE_TEST_DIR=' + gtest_dir,
                     shaderc_shaderc_dir]

    cmake_command.extend(additional_args)

    subprocess.check_call(cmake_command, cwd=obj_out)
    subprocess.check_call([cmake, '--build', obj_out, '--', '-v'])
    subprocess.check_call([cmake, '--build', obj_out,
                           '--target', 'install/strip'])

    files_to_copy = ['glslc' + file_extension,
                     'spirv-as' + file_extension,
                     'spirv-dis' + file_extension,
                     'spirv-val' + file_extension]
    if (not args.host.startswith('windows')):
        subprocess.check_call([ctest, '--verbose'], cwd=obj_out)

    for src in files_to_copy:
        shutil.copy2(os.path.join(install_dir, 'bin', src),
                     os.path.join(package_src, src))

    build_support.make_package(package_name, package_src, package_dir)