Exemple #1
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
Exemple #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"

  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
Exemple #3
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
Exemple #4
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
Exemple #5
0
root_dir = os.path.dirname(os.path.dirname(script_dir))

sys.path.append(root_dir)

import emscripten
from tools.settings import settings


def check_structs():
    for struct in info['structs'].keys():
        key = 'C_STRUCTS.' + struct + '.'
        # grep --quiet ruturns 0 when there is a match
        if subprocess.run(['git', 'grep', '--quiet', key],
                          check=False).returncode != 0:
            print(struct)


def check_defines():
    for define in info['defines'].keys():
        key = 'cDefine(.' + define + '.)'
        # grep --quiet ruturns 0 when there is a match
        if subprocess.run(['git', 'grep', '--quiet', key],
                          check=False).returncode != 0:
            print(define)


emscripten.generate_struct_info()
info = json.loads(open(settings.STRUCT_INFO).read())
check_structs()
check_defines()
Exemple #6
0
def main():
  emscripten.generate_struct_info()
  info = json.loads(open(settings.STRUCT_INFO).read())
  check_structs(info)
  check_defines(info)
  return 0