예제 #1
0
def main():
    global force
    parser = argparse.ArgumentParser(description=__doc__, usage=get_usage())
    parser.add_argument('--lto',
                        action='store_true',
                        help='build bitcode object for LTO')
    parser.add_argument(
        '--pic',
        action='store_true',
        help='build relocatable objects for suitable for dynamic linking')
    parser.add_argument('--force',
                        action='store_true',
                        help='force rebuild of target (by removing it first)')
    parser.add_argument('operation',
                        help='currently only "build" is supported')
    parser.add_argument('targets', nargs='+', help='see above')
    args = parser.parse_args()

    if args.operation != 'build':
        shared.exit_with_error('unfamiliar operation: ' + args.operation)

    # process flags

    # Check sanity so that if settings file has changed, the cache is cleared here.
    # Otherwise, the cache will clear in an emcc process, which is invoked while building
    # a system library into the cache, causing trouble.
    shared.check_sanity()

    if args.lto:
        shared.Settings.WASM_OBJECT_FILES = 0
        # Reconfigure the cache dir to reflect the change
        shared.reconfigure_cache()

    if args.pic:
        shared.Settings.RELOCATABLE = 1
        # Reconfigure the cache dir to reflect the change
        shared.reconfigure_cache()

    if args.force:
        force = True

    # process tasks
    libname = shared.static_library_name

    auto_tasks = False
    tasks = args.targets
    if 'SYSTEM' in tasks:
        tasks = SYSTEM_TASKS
        auto_tasks = True
    elif 'USER' in tasks:
        tasks = USER_TASKS
        auto_tasks = True
    elif 'ALL' in tasks:
        tasks = SYSTEM_TASKS + USER_TASKS
        auto_tasks = True
    if auto_tasks:
        if shared.Settings.WASM_BACKEND:
            skip_tasks = []
            if shared.Settings.RELOCATABLE:
                # we don't support PIC + pthreads yet
                skip_tasks += [
                    task for task in SYSTEM_TASKS + USER_TASKS
                    if '-mt' in task or 'thread' in task
                ]
            # cocos2d: must be ported, errors on
            # "Cannot recognize the target platform; are you targeting an unsupported platform?"
            skip_tasks += ['cocos2d']
            print(
                'Skipping building of %s, because WebAssembly does not support pthreads.'
                % ', '.join(skip_tasks))
            tasks = [x for x in tasks if x not in skip_tasks]
        else:
            if os.environ.get('EMSCRIPTEN_NATIVE_OPTIMIZER'):
                print(
                    'Skipping building of native-optimizer; EMSCRIPTEN_NATIVE_OPTIMIZER is environment.'
                )
            elif shared.EMSCRIPTEN_NATIVE_OPTIMIZER:
                print(
                    'Skipping building of native-optimizer; EMSCRIPTEN_NATIVE_OPTIMIZER set in .emscripten config.'
                )
            else:
                tasks += ['native_optimizer']
        print('Building targets: %s' % ' '.join(tasks))
    for what in tasks:
        logger.info('building and verifying ' + what)
        if what in SYSTEM_LIBRARIES:
            library = SYSTEM_LIBRARIES[what]
            if force:
                library.erase()
            library.get_path()
        elif what == 'struct_info':
            build(C_BARE, ['generated_struct_info.json'])
        elif what == 'native_optimizer':
            build(C_BARE, ['optimizer.2.exe'], ['-O2', '-s', 'WASM=0'])
        elif what == 'icu':
            build_port('icu', libname('libicuuc'), ['-s', 'USE_ICU=1'],
                       '#include "unicode/ustring.h"')
        elif what == 'zlib':
            build_port('zlib', 'libz.a', ['-s', 'USE_ZLIB=1'])
        elif what == 'bzip2':
            build_port('bzip2', 'libbz2.a', ['-s', 'USE_BZIP2=1'])
        elif what == 'bullet':
            build_port('bullet', libname('libbullet'), ['-s', 'USE_BULLET=1'])
        elif what == 'vorbis':
            build_port('vorbis', libname('libvorbis'), ['-s', 'USE_VORBIS=1'])
        elif what == 'ogg':
            build_port('ogg', libname('libogg'), ['-s', 'USE_OGG=1'])
        elif what == 'libjpeg':
            build_port('libjpeg', libname('libjpeg'), ['-s', 'USE_LIBJPEG=1'])
        elif what == 'libpng':
            build_port('libpng', libname('libpng'),
                       ['-s', 'USE_ZLIB=1', '-s', 'USE_LIBPNG=1'])
        elif what == 'sdl2':
            build_port('sdl2', libname('libSDL2'), ['-s', 'USE_SDL=2'])
        elif what == 'sdl2-mt':
            build_port('sdl2', libname('libSDL2-mt'),
                       ['-s', 'USE_SDL=2', '-s', 'USE_PTHREADS=1'])
        elif what == 'sdl2-gfx':
            build_port('sdl2-gfx', libname('libSDL2_gfx'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2', '-s',
                'USE_SDL_GFX=2'
            ])
        elif what == 'sdl2-image':
            build_port('sdl2-image', libname('libSDL2_image'),
                       ['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2'])
        elif what == 'sdl2-image-png':
            build_port('sdl2-image', libname('libSDL2_image_png'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2', '-s',
                'SDL2_IMAGE_FORMATS=["png"]'
            ])
        elif what == 'sdl2-image-jpg':
            build_port('sdl2-image', libname('libSDL2_image_jpg'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2', '-s',
                'SDL2_IMAGE_FORMATS=["jpg"]'
            ])
        elif what == 'sdl2-net':
            build_port('sdl2-net', libname('libSDL2_net'),
                       ['-s', 'USE_SDL=2', '-s', 'USE_SDL_NET=2'])
        elif what == 'sdl2-mixer':
            build_port('sdl2-mixer', libname('libSDL2_mixer'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_MIXER=2', '-s',
                'USE_VORBIS=1'
            ])
        elif what == 'freetype':
            build_port('freetype', 'libfreetype.a', ['-s', 'USE_FREETYPE=1'])
        elif what == 'harfbuzz':
            build_port('harfbuzz', 'libharfbuzz.a', ['-s', 'USE_HARFBUZZ=1'])
        elif what == 'harfbuzz-mt':
            build_port('harfbuzz-mt', 'libharfbuzz-mt.a',
                       ['-s', 'USE_HARFBUZZ=1', '-s', 'USE_PTHREADS=1'])
        elif what == 'sdl2-ttf':
            build_port('sdl2-ttf', libname('libSDL2_ttf'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_TTF=2', '-s',
                'USE_FREETYPE=1'
            ])
        elif what == 'binaryen':
            build_port('binaryen', None, ['-s', 'WASM=1'])
        elif what == 'cocos2d':
            build_port('cocos2d', libname('libcocos2d'), [
                '-s', 'USE_COCOS2D=3', '-s', 'USE_ZLIB=1', '-s',
                'USE_LIBPNG=1', '-s', 'ERROR_ON_UNDEFINED_SYMBOLS=0'
            ])
        elif what == 'regal':
            build_port('regal', libname('libregal'), ['-s', 'USE_REGAL=1'])
        elif what == 'regal-mt':
            build_port(
                'regal', libname('libregal'),
                ['-s', 'USE_REGAL=1', '-s', 'USE_PTHREADS=1', '-pthread'])
        elif what == 'boost_headers':
            build_port('boost_headers', libname('libboost_headers'),
                       ['-s', 'USE_BOOST_HEADERS=1'])
        elif what == 'libsockets':
            build(
                '''
        #include <sys/socket.h>
        int main() {
          return socket(0,0,0);
        }
      ''', [libname('libsockets')])
        elif what == 'libsockets_proxy':
            build(
                '''
        #include <sys/socket.h>
        int main() {
          return socket(0,0,0);
        }
      ''', [libname('libsockets_proxy')], [
                    '-s', 'PROXY_POSIX_SOCKETS=1', '-s', 'USE_PTHREADS=1',
                    '-s', 'PROXY_TO_PTHREAD=1'
                ])
        else:
            logger.error('unfamiliar build target: ' + what)
            return 1

        logger.info('...success')
    return 0
예제 #2
0
def main():
    global force
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=get_help())
    parser.add_argument('--lto',
                        action='store_true',
                        help='build bitcode object for LTO')
    parser.add_argument(
        '--pic',
        action='store_true',
        help='build relocatable objects for suitable for dynamic linking')
    parser.add_argument('--force',
                        action='store_true',
                        help='force rebuild of target (by removing it first)')
    parser.add_argument('operation',
                        help='currently only "build" is supported')
    parser.add_argument('targets', nargs='+', help='see below')
    args = parser.parse_args()

    if args.operation != 'build':
        shared.exit_with_error('unfamiliar operation: ' + args.operation)

    # process flags

    # Check sanity so that if settings file has changed, the cache is cleared here.
    # Otherwise, the cache will clear in an emcc process, which is invoked while building
    # a system library into the cache, causing trouble.
    shared.check_sanity()

    if args.lto:
        shared.Settings.LTO = "full"
        # Reconfigure the cache dir to reflect the change
        shared.reconfigure_cache()

    if args.pic:
        shared.Settings.RELOCATABLE = 1
        # Reconfigure the cache dir to reflect the change
        shared.reconfigure_cache()

    if args.force:
        force = True

    # process tasks
    libname = system_libs.Ports.get_lib_name

    auto_tasks = False
    tasks = args.targets
    if 'SYSTEM' in tasks:
        tasks = SYSTEM_TASKS
        auto_tasks = True
    elif 'USER' in tasks:
        tasks = USER_TASKS
        auto_tasks = True
    elif 'MINIMAL' in tasks:
        tasks = MINIMAL_TASKS
        auto_tasks = True
    elif 'ALL' in tasks:
        tasks = SYSTEM_TASKS + USER_TASKS
        auto_tasks = True
    if auto_tasks:
        if shared.Settings.WASM_BACKEND:
            skip_tasks = []
            if shared.Settings.RELOCATABLE:
                # we don't support PIC + pthreads yet
                for task in SYSTEM_TASKS + USER_TASKS:
                    if '-mt' in task:
                        skip_tasks.append(task)
                    if 'pthread' in task and 'stub' not in task:
                        skip_tasks.append(task)
                print(
                    'Skipping building of %s, because we don\'t support threads and PIC code.'
                    % ', '.join(skip_tasks))
            # cocos2d: must be ported, errors on
            # "Cannot recognize the target platform; are you targeting an unsupported platform?"
            skip_tasks += ['cocos2d']
            tasks = [x for x in tasks if x not in skip_tasks]
        else:
            if os.environ.get('EMSCRIPTEN_NATIVE_OPTIMIZER'):
                print(
                    'Skipping building of native-optimizer; EMSCRIPTEN_NATIVE_OPTIMIZER is environment.'
                )
            elif shared.EMSCRIPTEN_NATIVE_OPTIMIZER:
                print(
                    'Skipping building of native-optimizer; EMSCRIPTEN_NATIVE_OPTIMIZER set in .emscripten config.'
                )
            else:
                tasks += ['native_optimizer']
        print('Building targets: %s' % ' '.join(tasks))
    for what in tasks:
        logger.info('building and verifying ' + what)
        if what in SYSTEM_LIBRARIES:
            library = SYSTEM_LIBRARIES[what]
            if force:
                library.erase()
            library.get_path()
        elif what == 'struct_info':
            if force:
                shared.Cache.erase_file('generated_struct_info.json')
            emscripten.generate_struct_info()
        elif what == 'native_optimizer':
            if force:
                shared.Cache.erase_file('optimizer.2.exe')
            js_optimizer.get_native_optimizer()
        elif what == 'icu':
            build_port('icu', libname('libicuuc'))
        elif what == 'zlib':
            shared.Settings.USE_ZLIB = 1
            build_port('zlib', 'libz.a')
            shared.Settings.USE_ZLIB = 0
        elif what == 'bzip2':
            build_port('bzip2', 'libbz2.a')
        elif what == 'bullet':
            build_port('bullet', libname('libbullet'))
        elif what == 'vorbis':
            build_port('vorbis', libname('libvorbis'))
        elif what == 'ogg':
            build_port('ogg', libname('libogg'))
        elif what == 'libjpeg':
            build_port('libjpeg', libname('libjpeg'))
        elif what == 'libpng':
            build_port('libpng', libname('libpng'))
        elif what == 'sdl2':
            build_port('sdl2', libname('libSDL2'))
        elif what == 'sdl2-mt':
            shared.Settings.USE_PTHREADS = 1
            build_port('sdl2', libname('libSDL2-mt'))
            shared.Settings.USE_PTHREADS = 0
        elif what == 'sdl2-gfx':
            build_port('sdl2_gfx', libname('libSDL2_gfx'))
        elif what == 'sdl2-image':
            build_port('sdl2_image', libname('libSDL2_image'))
        elif what == 'sdl2-image-png':
            shared.Settings.SDL2_IMAGE_FORMATS = ["png"]
            build_port('sdl2_image', libname('libSDL2_image_png'))
            shared.Settings.SDL2_IMAGE_FORMATS = []
        elif what == 'sdl2-image-jpg':
            shared.Settings.SDL2_IMAGE_FORMATS = ["jpg"]
            build_port('sdl2_image', libname('libSDL2_image_jpg'))
            shared.Settings.SDL2_IMAGE_FORMATS = []
        elif what == 'sdl2-net':
            build_port('sdl2_net', libname('libSDL2_net'))
        elif what == 'sdl2-mixer':
            old_formats = shared.Settings.SDL2_MIXER_FORMATS
            shared.Settings.SDL2_MIXER_FORMATS = []
            build_port('sdl2_mixer', libname('libSDL2_mixer'))
            shared.Settings.SDL2_MIXER_FORMATS = old_formats
        elif what == 'sdl2-mixer-ogg':
            old_formats = shared.Settings.SDL2_MIXER_FORMATS
            shared.Settings.SDL2_MIXER_FORMATS = ["ogg"]
            build_port('sdl2_mixer', libname('libSDL2_mixer_ogg'))
            shared.Settings.SDL2_MIXER_FORMATS = old_formats
        elif what == 'sdl2-mixer-mp3':
            old_formats = shared.Settings.SDL2_MIXER_FORMATS
            shared.Settings.SDL2_MIXER_FORMATS = ["mp3"]
            build_port('sdl2_mixer', libname('libSDL2_mixer_mp3'))
            shared.Settings.SDL2_MIXER_FORMATS = old_formats
        elif what == 'freetype':
            build_port('freetype', 'libfreetype.a')
        elif what == 'harfbuzz':
            build_port('harfbuzz', 'libharfbuzz.a')
        elif what == 'harfbuzz-mt':
            shared.Settings.USE_PTHREADS = 1
            build_port('harfbuzz', 'libharfbuzz-mt.a')
            shared.Settings.USE_PTHREADS = 0
        elif what == 'sdl2-ttf':
            build_port('sdl2_ttf', libname('libSDL2_ttf'))
        elif what == 'cocos2d':
            build_port('cocos2d', libname('libcocos2d'))
        elif what == 'regal':
            build_port('regal', libname('libregal'))
        elif what == 'regal-mt':
            shared.Settings.USE_PTHREADS = 1
            build_port('regal', libname('libregal-mt'))
            shared.Settings.USE_PTHREADS = 0
        elif what == 'boost_headers':
            build_port('boost_headers', libname('libboost_headers'))
        else:
            logger.error('unfamiliar build target: ' + what)
            return 1

        logger.info('...success')
    return 0
예제 #3
0
def inspect_headers(headers, cflags):
    code = ['#include <stdio.h>', '#include <stddef.h>']
    for header in headers:
        code.append('#include "' + header['name'] + '"')

    code.append('int main() {')
    c_descent('structs', code)
    for header in headers:
        for name, struct in header['structs'].items():
            gen_inspect_code([name], struct, code)

    c_ascent(code)
    c_descent('defines', code)
    for header in headers:
        for name, type_ in header['defines'].items():
            # Add the necessary python type, if missing.
            if '%' not in type_:
                if type_[-1] in ('d', 'i', 'u'):
                    # integer
                    type_ = 'i%' + type_
                elif type_[-1] in ('f', 'F', 'e', 'E', 'g', 'G'):
                    # float
                    type_ = 'f%' + type_
                elif type_[-1] in ('x', 'X', 'a', 'A', 'c', 's'):
                    # hexadecimal or string
                    type_ = 's%' + type_

            c_set(name, type_, name, code)

    code.append('return 0;')
    code.append('}')

    # Write the source code to a temporary file.
    src_file = tempfile.mkstemp('.c', text=True)
    show('Generating C code... ' + src_file[1])
    os.write(src_file[0], '\n'.join(code).encode())

    js_file = tempfile.mkstemp('.js')

    # Check sanity early on before populating the cache with libcompiler_rt
    # If we don't do this the parallel build of compiler_rt will run while holding the cache
    # lock and with EM_EXCLUSIVE_CACHE_ACCESS set causing N processes to race to run sanity checks.
    # While this is not in itself serious problem it is wasteful and noise on stdout.
    # For the same reason we run this early in embuilder.py and emcc.py.
    # TODO(sbc): If we can remove EM_EXCLUSIVE_CACHE_ACCESS then this would not longer be needed.
    shared.check_sanity()

    compiler_rt = system_libs.Library.get_usable_variations(
    )['libcompiler_rt'].get_path()

    # Close all unneeded FDs.
    os.close(src_file[0])
    os.close(js_file[0])

    info = []
    # Compile the program.
    show('Compiling generated code...')

    if any('libcxxabi' in f for f in cflags):
        compiler = shared.EMXX
    else:
        compiler = shared.EMCC

    # -Oz optimizes enough to avoid warnings on code size/num locals
    cmd = [compiler] + cflags + [
        '-o',
        js_file[1],
        src_file[1],
        '-O0',
        '-Werror',
        '-Wno-format',
        '-nostdlib',
        compiler_rt,
        '-sMEMORY64=' + str(settings.MEMORY64),
        '-sBOOTSTRAPPING_STRUCT_INFO=1',
        '-sLLD_REPORT_UNDEFINED=1',
        '-sSTRICT',
        # Use SINGLE_FILE=1 so there is only a single
        # file to cleanup.
        '-sSINGLE_FILE'
    ]

    # Default behavior for emcc is to warn for binaryen version check mismatches
    # so we should try to match that behavior.
    cmd += ['-Wno-error=version-check']

    # TODO(sbc): Remove this one we remove the test_em_config_env_var test
    cmd += ['-Wno-deprecated']

    if settings.LTO:
        cmd += ['-flto=' + settings.LTO]

    show(shared.shlex_join(cmd))
    try:
        subprocess.check_call(cmd, env=system_libs.clean_env())
    except subprocess.CalledProcessError as e:
        sys.stderr.write('FAIL: Compilation failed!: %s\n' % e.cmd)
        sys.exit(1)

    # Run the compiled program.
    show('Calling generated program... ' + js_file[1])
    args = []
    if settings.MEMORY64:
        args += ['--experimental-wasm-bigint']
    info = shared.run_js_tool(js_file[1], node_args=args,
                              stdout=shared.PIPE).splitlines()

    if not DEBUG:
        # Remove all temporary files.
        os.unlink(src_file[1])

        if os.path.exists(js_file[1]):
            os.unlink(js_file[1])

    # Parse the output of the program into a dict.
    return parse_c_output(info)
예제 #4
0
def main():
    if len(sys.argv) < 2 or sys.argv[1] in [
            '-v', '-help', '--help', '-?', '?'
    ]:
        print_help()
        return 0

    operation = sys.argv[1]
    if operation != 'build':
        shared.exit_with_error('unfamiliar operation: ' + operation)

    # process flags

    args = sys.argv[2:]

    def is_flag(arg):
        return arg.startswith('--')

    # Check sanity so that if settings file has changed, the cache is cleared here.
    # Otherwise, the cache will clear in an emcc process, which is invoked while building
    # a system library into the cache, causing trouble.
    shared.check_sanity()

    for arg in args:
        if is_flag(arg):
            arg = arg[2:]
            if arg == 'lto':
                shared.Settings.WASM_OBJECT_FILES = 0
            elif arg == 'pic':
                shared.Settings.RELOCATABLE = 1
            # Reconfigure the cache dir to reflect the change
            shared.reconfigure_cache()

    args = [a for a in args if not is_flag(a)]

    # process tasks
    libname = shared.static_library_name

    auto_tasks = False
    tasks = args
    if 'SYSTEM' in tasks:
        tasks = SYSTEM_TASKS
        auto_tasks = True
    elif 'USER' in tasks:
        tasks = USER_TASKS
        auto_tasks = True
    elif 'ALL' in tasks:
        tasks = SYSTEM_TASKS + USER_TASKS
        auto_tasks = True
    if auto_tasks:
        if shared.Settings.WASM_BACKEND:
            skip_tasks = []
            if shared.Settings.RELOCATABLE:
                # we don't support PIC + pthreads yet
                skip_tasks += [
                    task for task in SYSTEM_TASKS + USER_TASKS
                    if '-mt' in task or 'thread' in task
                ]
            # cocos2d: must be ported, errors on
            # "Cannot recognize the target platform; are you targeting an unsupported platform?"
            skip_tasks += ['cocos2d']
            print(
                'Skipping building of %s, because WebAssembly does not support pthreads.'
                % ', '.join(skip_tasks))
            tasks = [x for x in tasks if x not in skip_tasks]
        else:
            if os.environ.get('EMSCRIPTEN_NATIVE_OPTIMIZER'):
                print(
                    'Skipping building of native-optimizer; EMSCRIPTEN_NATIVE_OPTIMIZER is environment.'
                )
            elif shared.EMSCRIPTEN_NATIVE_OPTIMIZER:
                print(
                    'Skipping building of native-optimizer; EMSCRIPTEN_NATIVE_OPTIMIZER set in .emscripten config.'
                )
            else:
                tasks += ['native_optimizer']
        print('Building targets: %s' % ' '.join(tasks))
    for what in tasks:
        logger.info('building and verifying ' + what)
        if what in SYSTEM_LIBRARIES:
            library = SYSTEM_LIBRARIES[what]
            library.get_path()
        elif what == 'struct_info':
            build(C_BARE, ['generated_struct_info.json'])
        elif what == 'native_optimizer':
            build(C_BARE, ['optimizer.2.exe'], ['-O2', '-s', 'WASM=0'])
        elif what == 'icu':
            build_port('icu', libname('libicuuc'), ['-s', 'USE_ICU=1'])
        elif what == 'zlib':
            build_port('zlib', 'libz.a', ['-s', 'USE_ZLIB=1'])
        elif what == 'bzip2':
            build_port('bzip2', 'libbz2.a', ['-s', 'USE_BZIP2=1'])
        elif what == 'bullet':
            build_port('bullet', libname('libbullet'), ['-s', 'USE_BULLET=1'])
        elif what == 'vorbis':
            build_port('vorbis', libname('libvorbis'), ['-s', 'USE_VORBIS=1'])
        elif what == 'ogg':
            build_port('ogg', libname('libogg'), ['-s', 'USE_OGG=1'])
        elif what == 'libjpeg':
            build_port('libjpeg', libname('libjpeg'), ['-s', 'USE_LIBJPEG=1'])
        elif what == 'libpng':
            build_port('libpng', libname('libpng'),
                       ['-s', 'USE_ZLIB=1', '-s', 'USE_LIBPNG=1'])
        elif what == 'sdl2':
            build_port('sdl2', libname('libSDL2'), ['-s', 'USE_SDL=2'])
        elif what == 'sdl2-mt':
            build_port('sdl2', libname('libSDL2-mt'),
                       ['-s', 'USE_SDL=2', '-s', 'USE_PTHREADS=1'])
        elif what == 'sdl2-gfx':
            build_port('sdl2-gfx', libname('libSDL2_gfx'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2', '-s',
                'USE_SDL_GFX=2'
            ])
        elif what == 'sdl2-image':
            build_port('sdl2-image', libname('libSDL2_image'),
                       ['-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2'])
        elif what == 'sdl2-image-png':
            build_port('sdl2-image', libname('libSDL2_image'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2', '-s',
                'SDL2_IMAGE_FORMATS=["png"]'
            ])
        elif what == 'sdl2-image-jpg':
            build_port('sdl2-image', libname('libSDL2_image'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_IMAGE=2', '-s',
                'SDL2_IMAGE_FORMATS=["jpg"]'
            ])
        elif what == 'sdl2-net':
            build_port('sdl2-net', libname('libSDL2_net'),
                       ['-s', 'USE_SDL=2', '-s', 'USE_SDL_NET=2'])
        elif what == 'sdl2-mixer':
            build_port('sdl2-mixer', 'libSDL2_mixer.a', [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_MIXER=2', '-s',
                'USE_VORBIS=1'
            ])
        elif what == 'freetype':
            build_port('freetype', 'libfreetype.a', ['-s', 'USE_FREETYPE=1'])
        elif what == 'harfbuzz':
            build_port('harfbuzz', 'libharfbuzz.a', ['-s', 'USE_HARFBUZZ=1'])
        elif what == 'sdl2-ttf':
            build_port('sdl2-ttf', libname('libSDL2_ttf'), [
                '-s', 'USE_SDL=2', '-s', 'USE_SDL_TTF=2', '-s',
                'USE_FREETYPE=1'
            ])
        elif what == 'binaryen':
            build_port('binaryen', None, ['-s', 'WASM=1'])
        elif what == 'cocos2d':
            build_port('cocos2d', libname('libcocos2d'), [
                '-s', 'USE_COCOS2D=3', '-s', 'USE_ZLIB=1', '-s',
                'USE_LIBPNG=1', '-s', 'ERROR_ON_UNDEFINED_SYMBOLS=0'
            ])
        elif what == 'regal':
            build_port('regal', libname('libregal'), ['-s', 'USE_REGAL=1'])
        elif what == 'boost_headers':
            build_port('boost_headers', libname('libboost_headers'),
                       ['-s', 'USE_BOOST_HEADERS=1'])
        else:
            logger.error('unfamiliar build target: ' + what)
            return 1

        logger.info('...success')
    return 0
예제 #5
0
def main():
  global force
  parser = argparse.ArgumentParser(description=__doc__,
                                   formatter_class=argparse.RawDescriptionHelpFormatter,
                                   epilog=get_help())
  parser.add_argument('--lto', action='store_true', help='build bitcode object for LTO')
  parser.add_argument('--pic', action='store_true',
                      help='build relocatable objects for suitable for dynamic linking')
  parser.add_argument('--force', action='store_true',
                      help='force rebuild of target (by removing it first)')
  parser.add_argument('operation', help='currently only "build" is supported')
  parser.add_argument('targets', nargs='+', help='see below')
  args = parser.parse_args()

  if args.operation != 'build':
    shared.exit_with_error('unfamiliar operation: ' + args.operation)

  # process flags

  # Check sanity so that if settings file has changed, the cache is cleared here.
  # Otherwise, the cache will clear in an emcc process, which is invoked while building
  # a system library into the cache, causing trouble.
  shared.check_sanity()

  if args.lto:
    shared.Settings.LTO = "full"

  if args.pic:
    shared.Settings.RELOCATABLE = 1

  if args.force:
    force = True

  # process tasks
  auto_tasks = False
  tasks = args.targets
  if 'SYSTEM' in tasks:
    tasks = SYSTEM_TASKS
    auto_tasks = True
  elif 'USER' in tasks:
    tasks = USER_TASKS
    auto_tasks = True
  elif 'MINIMAL' in tasks:
    tasks = MINIMAL_TASKS
    auto_tasks = True
  elif 'ALL' in tasks:
    tasks = SYSTEM_TASKS + USER_TASKS
    auto_tasks = True
  if auto_tasks:
    # cocos2d: must be ported, errors on
    # "Cannot recognize the target platform; are you targeting an unsupported platform?"
    skip_tasks = ['cocos2d']
    tasks = [x for x in tasks if x not in skip_tasks]
    print('Building targets: %s' % ' '.join(tasks))
  for what in tasks:
    logger.info('building and verifying ' + what)
    if what in SYSTEM_LIBRARIES:
      library = SYSTEM_LIBRARIES[what]
      if force:
        library.erase()
      library.get_path()
    elif what == 'sysroot':
      if force:
        shared.Cache.erase_file('sysroot_install.stamp')
      system_libs.ensure_sysroot()
    elif what == 'struct_info':
      if force:
        shared.Cache.erase_file('generated_struct_info.json')
      emscripten.generate_struct_info()
    elif what == 'icu':
      build_port('icu', 'libicuuc.a')
    elif what == 'zlib':
      shared.Settings.USE_ZLIB = 1
      build_port('zlib', 'libz.a')
      shared.Settings.USE_ZLIB = 0
    elif what == 'bzip2':
      build_port('bzip2', 'libbz2.a')
    elif what == 'bullet':
      build_port('bullet', 'libbullet.a')
    elif what == 'vorbis':
      build_port('vorbis', 'libvorbis.a')
    elif what == 'ogg':
      build_port('ogg', 'libogg.a')
    elif what == 'giflib':
      build_port('giflib', 'libgif.a')
    elif what == 'libjpeg':
      build_port('libjpeg', 'libjpeg.a')
    elif what == 'libpng':
      build_port('libpng', 'libpng.a')
    elif what == 'sdl2':
      build_port('sdl2', 'libSDL2.a')
    elif what == 'sdl2-mt':
      shared.Settings.USE_PTHREADS = 1
      build_port('sdl2', 'libSDL2-mt.a')
      shared.Settings.USE_PTHREADS = 0
    elif what == 'sdl2-gfx':
      build_port('sdl2_gfx', 'libSDL2_gfx.a')
    elif what == 'sdl2-image':
      build_port('sdl2_image', 'libSDL2_image.a')
    elif what == 'sdl2-image-png':
      shared.Settings.SDL2_IMAGE_FORMATS = ["png"]
      build_port('sdl2_image', 'libSDL2_image_png.a')
      shared.Settings.SDL2_IMAGE_FORMATS = []
    elif what == 'sdl2-image-jpg':
      shared.Settings.SDL2_IMAGE_FORMATS = ["jpg"]
      build_port('sdl2_image', 'libSDL2_image_jpg.a')
      shared.Settings.SDL2_IMAGE_FORMATS = []
    elif what == 'sdl2-net':
      build_port('sdl2_net', 'libSDL2_net.a')
    elif what == 'sdl2-mixer':
      old_formats = shared.Settings.SDL2_MIXER_FORMATS
      shared.Settings.SDL2_MIXER_FORMATS = []
      build_port('sdl2_mixer', 'libSDL2_mixer.a')
      shared.Settings.SDL2_MIXER_FORMATS = old_formats
    elif what == 'sdl2-mixer-ogg':
      old_formats = shared.Settings.SDL2_MIXER_FORMATS
      shared.Settings.SDL2_MIXER_FORMATS = ["ogg"]
      build_port('sdl2_mixer', 'libSDL2_mixer_ogg.a')
      shared.Settings.SDL2_MIXER_FORMATS = old_formats
    elif what == 'sdl2-mixer-mp3':
      old_formats = shared.Settings.SDL2_MIXER_FORMATS
      shared.Settings.SDL2_MIXER_FORMATS = ["mp3"]
      build_port('sdl2_mixer', 'libSDL2_mixer_mp3.a')
      shared.Settings.SDL2_MIXER_FORMATS = old_formats
    elif what == 'freetype':
      build_port('freetype', 'libfreetype.a')
    elif what == 'harfbuzz':
      build_port('harfbuzz', 'libharfbuzz.a')
    elif what == 'harfbuzz-mt':
      shared.Settings.USE_PTHREADS = 1
      build_port('harfbuzz', 'libharfbuzz-mt.a')
      shared.Settings.USE_PTHREADS = 0
    elif what == 'sdl2-ttf':
      build_port('sdl2_ttf', 'libSDL2_ttf.a')
    elif what == 'cocos2d':
      build_port('cocos2d', 'libcocos2d.a')
    elif what == 'regal':
      build_port('regal', 'libregal.a')
    elif what == 'regal-mt':
      shared.Settings.USE_PTHREADS = 1
      build_port('regal', 'libregal-mt.a')
      shared.Settings.USE_PTHREADS = 0
    elif what == 'boost_headers':
      build_port('boost_headers', 'libboost_headers.a')
    else:
      logger.error('unfamiliar build target: ' + what)
      return 1

    logger.info('...success')
  return 0
예제 #6
0
def main():
    all_build_start_time = time.time()

    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=get_help())
    parser.add_argument('--lto',
                        action='store_const',
                        const='full',
                        help='build bitcode object for LTO')
    parser.add_argument('--lto=thin',
                        dest='lto',
                        action='store_const',
                        const='thin',
                        help='build bitcode object for ThinLTO')
    parser.add_argument(
        '--pic',
        action='store_true',
        help='build relocatable objects for suitable for dynamic linking')
    parser.add_argument('--force',
                        action='store_true',
                        help='force rebuild of target (by removing it first)')
    parser.add_argument('--verbose',
                        action='store_true',
                        help='show build commands')
    parser.add_argument('--wasm64',
                        action='store_true',
                        help='use wasm64 architecture')
    parser.add_argument(
        'operation', help='currently only "build" and "clear" are supported')
    parser.add_argument('targets', nargs='+', help='see below')
    args = parser.parse_args()

    if args.operation not in ('build', 'clear'):
        shared.exit_with_error('unfamiliar operation: ' + args.operation)

    # process flags

    # Check sanity so that if settings file has changed, the cache is cleared here.
    # Otherwise, the cache will clear in an emcc process, which is invoked while building
    # a system library into the cache, causing trouble.
    shared.check_sanity()

    if args.lto:
        settings.LTO = args.lto

    if args.verbose:
        shared.PRINT_STAGES = True

    if args.pic:
        settings.RELOCATABLE = 1

    if args.wasm64:
        settings.MEMORY64 = 2
        MINIMAL_TASKS[:] = [t for t in MINIMAL_TASKS if 'emmalloc' not in t]

    do_build = args.operation == 'build'
    do_clear = args.operation == 'clear'
    if args.force:
        do_clear = True

    # process tasks
    auto_tasks = False
    tasks = args.targets
    system_libraries, system_tasks = get_system_tasks()
    if 'SYSTEM' in tasks:
        tasks = system_tasks
        auto_tasks = True
    elif 'USER' in tasks:
        tasks = PORTS
        auto_tasks = True
    elif 'MINIMAL' in tasks:
        tasks = MINIMAL_TASKS
        auto_tasks = True
    elif 'MINIMAL_PIC' in tasks:
        tasks = MINIMAL_PIC_TASKS
        auto_tasks = True
    elif 'ALL' in tasks:
        tasks = system_tasks + PORTS
        auto_tasks = True
    if auto_tasks:
        # There are some ports that we don't want to build as part
        # of ALL since the are not well tested or widely used:
        skip_tasks = ['cocos2d']
        tasks = [x for x in tasks if x not in skip_tasks]
        print('Building targets: %s' % ' '.join(tasks))
    for what in tasks:
        for old, new in legacy_prefixes.items():
            if what.startswith(old):
                what = what.replace(old, new)
        if do_build:
            logger.info('building ' + what)
        else:
            logger.info('clearing ' + what)
        start_time = time.time()
        if what in system_libraries:
            library = system_libraries[what]
            if do_clear:
                library.erase()
            if do_build:
                library.get_path()
        elif what == 'sysroot':
            if do_clear:
                shared.Cache.erase_file('sysroot_install.stamp')
            if do_build:
                system_libs.ensure_sysroot()
        elif what == 'struct_info':
            if do_clear:
                emscripten.clear_struct_info()
            if do_build:
                emscripten.generate_struct_info()
        elif what in PORTS:
            if do_clear:
                clear_port(what)
            if do_build:
                build_port(what)
        else:
            logger.error('unfamiliar build target: ' + what)
            return 1

        time_taken = time.time() - start_time
        logger.info(
            '...success. Took %s(%.2fs)' %
            (('%02d:%02d mins ' %
              (time_taken // 60, time_taken % 60) if time_taken >= 60 else ''),
             time_taken))

    if len(tasks) > 1:
        all_build_time_taken = time.time() - all_build_start_time
        logger.info(
            'Built %d targets in %s(%.2fs)' %
            (len(tasks),
             ('%02d:%02d mins ' %
              (all_build_time_taken // 60, all_build_time_taken % 60)
              if all_build_time_taken >= 60 else ''), all_build_time_taken))

    return 0
예제 #7
0
def main():
    global force

    all_build_start_time = time.time()

    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=get_help())
    parser.add_argument('--lto',
                        action='store_true',
                        help='build bitcode object for LTO')
    parser.add_argument(
        '--pic',
        action='store_true',
        help='build relocatable objects for suitable for dynamic linking')
    parser.add_argument('--force',
                        action='store_true',
                        help='force rebuild of target (by removing it first)')
    parser.add_argument('operation',
                        help='currently only "build" is supported')
    parser.add_argument('targets', nargs='+', help='see below')
    args = parser.parse_args()

    if args.operation != 'build':
        shared.exit_with_error('unfamiliar operation: ' + args.operation)

    # process flags

    # Check sanity so that if settings file has changed, the cache is cleared here.
    # Otherwise, the cache will clear in an emcc process, which is invoked while building
    # a system library into the cache, causing trouble.
    shared.check_sanity()

    if args.lto:
        settings.LTO = "full"

    if args.pic:
        settings.RELOCATABLE = 1

    if args.force:
        force = True

    # process tasks
    auto_tasks = False
    tasks = args.targets
    if 'SYSTEM' in tasks:
        tasks = SYSTEM_TASKS
        auto_tasks = True
    elif 'USER' in tasks:
        tasks = PORTS
        auto_tasks = True
    elif 'MINIMAL' in tasks:
        tasks = MINIMAL_TASKS
        auto_tasks = True
    elif 'ALL' in tasks:
        tasks = SYSTEM_TASKS + PORTS
        auto_tasks = True
    if auto_tasks:
        # cocos2d: must be ported, errors on
        # "Cannot recognize the target platform; are you targeting an unsupported platform?"
        skip_tasks = ['cocos2d']
        tasks = [x for x in tasks if x not in skip_tasks]
        print('Building targets: %s' % ' '.join(tasks))
    for what in tasks:
        for old, new in legacy_prefixes.items():
            if what.startswith(old):
                what = what.replace(old, new)
        logger.info('building and verifying ' + what)
        start_time = time.time()
        if what in SYSTEM_LIBRARIES:
            library = SYSTEM_LIBRARIES[what]
            if force:
                library.erase()
            library.get_path()
        elif what == 'sysroot':
            if force:
                shared.Cache.erase_file('sysroot_install.stamp')
            system_libs.ensure_sysroot()
        elif what == 'struct_info':
            if force:
                shared.Cache.erase_file('generated_struct_info.json')
            emscripten.generate_struct_info()
        elif what in PORTS:
            build_port(what)
        else:
            logger.error('unfamiliar build target: ' + what)
            return 1

        time_taken = time.time() - start_time
        logger.info(
            '...success. Took %s(%.2fs)' %
            (('%02d:%02d mins ' %
              (time_taken // 60, time_taken % 60) if time_taken >= 60 else ''),
             time_taken))

    if len(tasks) > 1:
        all_build_time_taken = time.time() - all_build_start_time
        logger.info(
            'Built %d targets in %s(%.2fs)' %
            (len(tasks),
             ('%02d:%02d mins ' %
              (all_build_time_taken // 60, all_build_time_taken % 60)
              if all_build_time_taken >= 60 else ''), all_build_time_taken))

    return 0