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
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
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)
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
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
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
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