From 021e0cc8c973ee3fe999fc47d809cb9fe6e0c314 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Wed, 12 Mar 2025 22:53:04 +0000 Subject: [PATCH 01/13] Allow deferred/combined building of ports with system_libs. This version requires threading the 'deferred' flag through each port definition. --- embuilder.py | 2 +- tools/ports/__init__.py | 9 +++++---- tools/ports/boost_headers.py | 6 +++--- tools/ports/bullet.py | 6 +++--- tools/ports/sdl2.py | 6 +++--- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/embuilder.py b/embuilder.py index e93e0471f84e2..ae6fbaf25513b 100755 --- a/embuilder.py +++ b/embuilder.py @@ -171,7 +171,7 @@ def clear_port(port_name): def build_port(port_name): with get_port_variant(port_name) as port_name: - ports.build_port(port_name, settings) + ports.build_port(port_name, settings, deferred=True) def get_system_tasks(): diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index 1a86a15b8c66c..bbdc37dad4e6c 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -175,7 +175,7 @@ def install_headers(src_dir, pattern='*.h', target=None): maybe_copy(f, os.path.join(dest, os.path.basename(f))) @staticmethod - def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags=[], exclude_files=[], exclude_dirs=[], srcs=[]): # noqa + def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags=[], exclude_files=[], exclude_dirs=[], srcs=[], deferred=False): # noqa build_dir = os.path.join(Ports.get_build_dir(), port_name) if srcs: srcs = [os.path.join(src_dir, s) for s in srcs] @@ -199,7 +199,8 @@ def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags= ninja_file = os.path.join(build_dir, 'build.ninja') system_libs.ensure_sysroot() system_libs.create_ninja_file(srcs, ninja_file, output_path, cflags=cflags) - system_libs.run_ninja(build_dir) + if not deferred: + system_libs.run_ninja(build_dir) else: commands = [] objects = [] @@ -525,12 +526,12 @@ def get_needed_ports(settings): return needed -def build_port(port_name, settings): +def build_port(port_name, settings, deferred=False): port = ports_by_name[port_name] port_set = OrderedSet([port]) resolve_dependencies(port_set, settings) for port in dependency_order(port_set): - port.get(Ports, settings, shared) + port.get(Ports, settings, shared, deferred=deferred) def clear_port(port_name, settings): diff --git a/tools/ports/boost_headers.py b/tools/ports/boost_headers.py index 738684562b584..74f3a5800855d 100644 --- a/tools/ports/boost_headers.py +++ b/tools/ports/boost_headers.py @@ -13,7 +13,7 @@ def needed(settings): return settings.USE_BOOST_HEADERS == 1 -def get(ports, settings, shared): +def get(ports, settings, shared, deferred=False): ports.fetch_project('boost_headers', f'https://github.com/emscripten-ports/boost/releases/download/boost-{TAG}/boost-headers-{TAG}.zip', sha512hash=HASH) @@ -30,9 +30,9 @@ def create(final): shared.safe_ensure_dirs(os.path.dirname(dummy_file)) ports.write_file(dummy_file, 'static void dummy() {}') - ports.build_port(source_path, final, 'boost_headers', srcs=['dummy.cpp']) + ports.build_port(source_path, final, 'boost_headers', srcs=['dummy.cpp'], deferred=deferred) - return [shared.cache.get_lib('libboost_headers.a', create, what='port')] + return [shared.cache.get_lib('libboost_headers.a', create, what='port', deferred=deferred)] def clear(ports, settings, shared): diff --git a/tools/ports/bullet.py b/tools/ports/bullet.py index a53028553d6e9..df62113617c9a 100644 --- a/tools/ports/bullet.py +++ b/tools/ports/bullet.py @@ -14,7 +14,7 @@ def needed(settings): return settings.USE_BULLET == 1 -def get(ports, settings, shared): +def get(ports, settings, shared, deferred): ports.fetch_project('bullet', f'https://github.com/emscripten-ports/bullet/archive/{TAG}.zip', sha512hash=HASH) def create(final): @@ -42,9 +42,9 @@ def create(final): '-std=gnu++14' ] - ports.build_port(src_path, final, 'bullet', includes=includes, flags=flags, exclude_dirs=['MiniCL']) + ports.build_port(src_path, final, 'bullet', includes=includes, flags=flags, exclude_dirs=['MiniCL'], deferred=deferred) - return [shared.cache.get_lib('libbullet.a', create)] + return [shared.cache.get_lib('libbullet.a', create, deferred=deferred)] def clear(ports, settings, shared): diff --git a/tools/ports/sdl2.py b/tools/ports/sdl2.py index b8fba24bc2cc4..0df8c06f43b8e 100644 --- a/tools/ports/sdl2.py +++ b/tools/ports/sdl2.py @@ -20,7 +20,7 @@ def get_lib_name(settings): return 'libSDL2' + ('-mt' if settings.PTHREADS else '') + '.a' -def get(ports, settings, shared): +def get(ports, settings, shared, deferred=False): # get the port ports.fetch_project('sdl2', f'https://github.com/libsdl-org/SDL/archive/{TAG}.zip', sha512hash=HASH) @@ -74,9 +74,9 @@ def create(final): includes = [ports.get_include_dir('SDL2')] if settings.PTHREADS: flags += ['-pthread'] - ports.build_port(src_dir, final, 'sdl2', srcs=srcs, includes=includes, flags=flags) + ports.build_port(src_dir, final, 'sdl2', srcs=srcs, includes=includes, flags=flags, deferred=deferred) - return [shared.cache.get_lib(get_lib_name(settings), create, what='port')] + return [shared.cache.get_lib(get_lib_name(settings), create, what='port', deferred=deferred)] def clear(ports, settings, shared): From ba2b0d65eba82849b42b446ffd369cd7c2b4373c Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Thu, 13 Mar 2025 22:39:49 +0000 Subject: [PATCH 02/13] use a global in cache/__init__.py instead --- tools/cache.py | 2 -- tools/ports/__init__.py | 14 ++++++++++---- tools/ports/boost_headers.py | 6 +++--- tools/ports/bullet.py | 6 +++--- tools/ports/sdl2.py | 6 +++--- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/tools/cache.py b/tools/cache.py index 445de535d5683..3819828bc9071 100644 --- a/tools/cache.py +++ b/tools/cache.py @@ -177,8 +177,6 @@ def get(shortname, creator, what=None, force=False, quiet=False, deferred=False) logger.info(message) utils.safe_ensure_dirs(cachename.parent) creator(str(cachename)) - if not deferred: - assert cachename.exists() if not quiet: logger.info(' - ok') diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index bbdc37dad4e6c..5c6874695ce6d 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -36,6 +36,7 @@ logger = logging.getLogger('ports') +build_deferred = False def init_port(name, port): ports.append(port) @@ -175,7 +176,7 @@ def install_headers(src_dir, pattern='*.h', target=None): maybe_copy(f, os.path.join(dest, os.path.basename(f))) @staticmethod - def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags=[], exclude_files=[], exclude_dirs=[], srcs=[], deferred=False): # noqa + def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags=[], exclude_files=[], exclude_dirs=[], srcs=[]): # noqa build_dir = os.path.join(Ports.get_build_dir(), port_name) if srcs: srcs = [os.path.join(src_dir, s) for s in srcs] @@ -199,7 +200,7 @@ def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags= ninja_file = os.path.join(build_dir, 'build.ninja') system_libs.ensure_sysroot() system_libs.create_ninja_file(srcs, ninja_file, output_path, cflags=cflags) - if not deferred: + if not build_deferred: system_libs.run_ninja(build_dir) else: commands = [] @@ -527,11 +528,13 @@ def get_needed_ports(settings): def build_port(port_name, settings, deferred=False): + global build_deferred + build_deferred = deferred port = ports_by_name[port_name] port_set = OrderedSet([port]) resolve_dependencies(port_set, settings) for port in dependency_order(port_set): - port.get(Ports, settings, shared, deferred=deferred) + port.get(Ports, settings, shared) def clear_port(port_name, settings): @@ -574,10 +577,13 @@ def add_cflags(args, settings): # noqa: U100 # Now get (i.e. build) the ports in dependency order. This is important because the # headers from one ports might be needed before we can build the next. + global build_deferred + assert not build_deferred, "add_cflags shouldn't be called from embuilder" + build_deferred = True for port in dependency_order(needed): port.get(Ports, settings, shared) args += port.process_args(Ports) - + build_deferred = False def show_ports(): sorted_ports = sorted(ports, key=lambda p: p.name) diff --git a/tools/ports/boost_headers.py b/tools/ports/boost_headers.py index 74f3a5800855d..738684562b584 100644 --- a/tools/ports/boost_headers.py +++ b/tools/ports/boost_headers.py @@ -13,7 +13,7 @@ def needed(settings): return settings.USE_BOOST_HEADERS == 1 -def get(ports, settings, shared, deferred=False): +def get(ports, settings, shared): ports.fetch_project('boost_headers', f'https://github.com/emscripten-ports/boost/releases/download/boost-{TAG}/boost-headers-{TAG}.zip', sha512hash=HASH) @@ -30,9 +30,9 @@ def create(final): shared.safe_ensure_dirs(os.path.dirname(dummy_file)) ports.write_file(dummy_file, 'static void dummy() {}') - ports.build_port(source_path, final, 'boost_headers', srcs=['dummy.cpp'], deferred=deferred) + ports.build_port(source_path, final, 'boost_headers', srcs=['dummy.cpp']) - return [shared.cache.get_lib('libboost_headers.a', create, what='port', deferred=deferred)] + return [shared.cache.get_lib('libboost_headers.a', create, what='port')] def clear(ports, settings, shared): diff --git a/tools/ports/bullet.py b/tools/ports/bullet.py index df62113617c9a..a53028553d6e9 100644 --- a/tools/ports/bullet.py +++ b/tools/ports/bullet.py @@ -14,7 +14,7 @@ def needed(settings): return settings.USE_BULLET == 1 -def get(ports, settings, shared, deferred): +def get(ports, settings, shared): ports.fetch_project('bullet', f'https://github.com/emscripten-ports/bullet/archive/{TAG}.zip', sha512hash=HASH) def create(final): @@ -42,9 +42,9 @@ def create(final): '-std=gnu++14' ] - ports.build_port(src_path, final, 'bullet', includes=includes, flags=flags, exclude_dirs=['MiniCL'], deferred=deferred) + ports.build_port(src_path, final, 'bullet', includes=includes, flags=flags, exclude_dirs=['MiniCL']) - return [shared.cache.get_lib('libbullet.a', create, deferred=deferred)] + return [shared.cache.get_lib('libbullet.a', create)] def clear(ports, settings, shared): diff --git a/tools/ports/sdl2.py b/tools/ports/sdl2.py index 0df8c06f43b8e..b8fba24bc2cc4 100644 --- a/tools/ports/sdl2.py +++ b/tools/ports/sdl2.py @@ -20,7 +20,7 @@ def get_lib_name(settings): return 'libSDL2' + ('-mt' if settings.PTHREADS else '') + '.a' -def get(ports, settings, shared, deferred=False): +def get(ports, settings, shared): # get the port ports.fetch_project('sdl2', f'https://github.com/libsdl-org/SDL/archive/{TAG}.zip', sha512hash=HASH) @@ -74,9 +74,9 @@ def create(final): includes = [ports.get_include_dir('SDL2')] if settings.PTHREADS: flags += ['-pthread'] - ports.build_port(src_dir, final, 'sdl2', srcs=srcs, includes=includes, flags=flags, deferred=deferred) + ports.build_port(src_dir, final, 'sdl2', srcs=srcs, includes=includes, flags=flags) - return [shared.cache.get_lib(get_lib_name(settings), create, what='port', deferred=deferred)] + return [shared.cache.get_lib(get_lib_name(settings), create, what='port')] def clear(ports, settings, shared): From f6e3bdd50b37cbd9a3c463d27401b1db9db86b6d Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 14 Mar 2025 18:24:01 +0000 Subject: [PATCH 03/13] Use separate build directories for ports variants --- .circleci/config.yml | 2 +- embuilder.py | 6 ++++-- tools/cache.py | 4 ++++ tools/ports/__init__.py | 25 +++++++++++++++---------- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0e36c06187d14..0bf7ad4927717 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -499,7 +499,7 @@ jobs: - build-libs - run: name: Clean build directory - command: rm -rf ~/cache/build + command: rm -rf ~/cache/build ~/cache/ports-builds - persist # Perhaps we don't need to run this suite with every commit. Consider moving this to FYI bot. test-posixtest: diff --git a/embuilder.py b/embuilder.py index ae6fbaf25513b..f3690ca06497a 100755 --- a/embuilder.py +++ b/embuilder.py @@ -170,8 +170,9 @@ def clear_port(port_name): def build_port(port_name): - with get_port_variant(port_name) as port_name: - ports.build_port(port_name, settings, deferred=True) + with get_port_variant(port_name) as port_name_base: + variant = port_name.removeprefix(port_name_base) + ports.build_port(port_name_base, settings, {'deferred':USE_NINJA, 'variant':variant}) def get_system_tasks(): @@ -221,6 +222,7 @@ def main(): # a system library into the cache, causing trouble. cache.setup() shared.check_sanity() + utils.safe_ensure_dirs(cache.get_path('build')) if args.lto: settings.LTO = args.lto diff --git a/tools/cache.py b/tools/cache.py index 3819828bc9071..69ed18877f6c4 100644 --- a/tools/cache.py +++ b/tools/cache.py @@ -129,6 +129,10 @@ def get_lib_dir(absolute): return path +def get_lib_subdir(): + return get_lib_dir(False).relative_to(Path(get_sysroot(False), 'lib')) + + def get_lib_name(name, absolute=False): return str(get_lib_dir(absolute=absolute).joinpath(name)) diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index 5c6874695ce6d..b63fafd406acb 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -35,8 +35,11 @@ ports_dir = os.path.dirname(os.path.abspath(__file__)) logger = logging.getLogger('ports') +logger.setLevel(logging.DEBUG) + +DEFAULT_BUILD_CONFIG = {'deferred': False, 'variant': ''} +current_build_config = DEFAULT_BUILD_CONFIG -build_deferred = False def init_port(name, port): ports.append(port) @@ -177,7 +180,8 @@ def install_headers(src_dir, pattern='*.h', target=None): @staticmethod def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags=[], exclude_files=[], exclude_dirs=[], srcs=[]): # noqa - build_dir = os.path.join(Ports.get_build_dir(), port_name) + build_dir = os.path.join(Ports.get_build_dir(), cache.get_lib_subdir(), port_name) + current_build_config['variant'] + logger.debug(f'build_port: {port_name} in {build_dir}') if srcs: srcs = [os.path.join(src_dir, s) for s in srcs] else: @@ -200,7 +204,7 @@ def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags= ninja_file = os.path.join(build_dir, 'build.ninja') system_libs.ensure_sysroot() system_libs.create_ninja_file(srcs, ninja_file, output_path, cflags=cflags) - if not build_deferred: + if not current_build_config['deferred']: system_libs.run_ninja(build_dir) else: commands = [] @@ -527,9 +531,10 @@ def get_needed_ports(settings): return needed -def build_port(port_name, settings, deferred=False): - global build_deferred - build_deferred = deferred +def build_port(port_name, settings, build_config=DEFAULT_BUILD_CONFIG): + global current_build_config + current_build_config = build_config + logger.debug(f'build_Port {port_name}') port = ports_by_name[port_name] port_set = OrderedSet([port]) resolve_dependencies(port_set, settings) @@ -577,13 +582,13 @@ def add_cflags(args, settings): # noqa: U100 # Now get (i.e. build) the ports in dependency order. This is important because the # headers from one ports might be needed before we can build the next. - global build_deferred - assert not build_deferred, "add_cflags shouldn't be called from embuilder" - build_deferred = True + global current_build_config + assert not current_build_config['deferred'], "add_cflags shouldn't be called from embuilder" + current_build_config['deferred'] = True for port in dependency_order(needed): port.get(Ports, settings, shared) args += port.process_args(Ports) - build_deferred = False + current_build_config['deferred'] = False def show_ports(): sorted_ports = sorted(ports, key=lambda p: p.name) From eb3101c30b2b61d059031be06a4cea36bc475e0c Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 14 Mar 2025 18:39:01 +0000 Subject: [PATCH 04/13] clean up, work around lack of str.removeprefix --- embuilder.py | 4 +++- tools/ports/__init__.py | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/embuilder.py b/embuilder.py index f3690ca06497a..601fd25cebf77 100755 --- a/embuilder.py +++ b/embuilder.py @@ -171,7 +171,9 @@ def clear_port(port_name): def build_port(port_name): with get_port_variant(port_name) as port_name_base: - variant = port_name.removeprefix(port_name_base) + # TODO: switch this to use str.removeprefix once we use Python 3.9 + assert port_name.index(port_name_base) == 0 + variant = port_name[len(port_name_base):] ports.build_port(port_name_base, settings, {'deferred':USE_NINJA, 'variant':variant}) diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index b63fafd406acb..c1537849da755 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -35,7 +35,6 @@ ports_dir = os.path.dirname(os.path.abspath(__file__)) logger = logging.getLogger('ports') -logger.setLevel(logging.DEBUG) DEFAULT_BUILD_CONFIG = {'deferred': False, 'variant': ''} current_build_config = DEFAULT_BUILD_CONFIG @@ -534,7 +533,7 @@ def get_needed_ports(settings): def build_port(port_name, settings, build_config=DEFAULT_BUILD_CONFIG): global current_build_config current_build_config = build_config - logger.debug(f'build_Port {port_name}') + logger.debug(f'build_port {port_name}') port = ports_by_name[port_name] port_set = OrderedSet([port]) resolve_dependencies(port_set, settings) From 830eddbaad3f8a69cedd02015b9f6d84587533f0 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 14 Mar 2025 22:53:21 +0000 Subject: [PATCH 05/13] Use lib archive path/name instead of variant name to separate directories --- embuilder.py | 5 +---- tools/cache.py | 4 ---- tools/ports/__init__.py | 27 ++++++++++++++------------- tools/ports/sdl2_gfx.py | 2 -- tools/ports/sdl2_image.py | 2 -- tools/ports/sdl2_mixer.py | 2 -- tools/ports/sdl2_net.py | 2 -- 7 files changed, 15 insertions(+), 29 deletions(-) diff --git a/embuilder.py b/embuilder.py index 601fd25cebf77..bea59b9d773e3 100755 --- a/embuilder.py +++ b/embuilder.py @@ -171,10 +171,7 @@ def clear_port(port_name): def build_port(port_name): with get_port_variant(port_name) as port_name_base: - # TODO: switch this to use str.removeprefix once we use Python 3.9 - assert port_name.index(port_name_base) == 0 - variant = port_name[len(port_name_base):] - ports.build_port(port_name_base, settings, {'deferred':USE_NINJA, 'variant':variant}) + ports.build_port(port_name_base, settings, deferred=USE_NINJA) def get_system_tasks(): diff --git a/tools/cache.py b/tools/cache.py index 69ed18877f6c4..3819828bc9071 100644 --- a/tools/cache.py +++ b/tools/cache.py @@ -129,10 +129,6 @@ def get_lib_dir(absolute): return path -def get_lib_subdir(): - return get_lib_dir(False).relative_to(Path(get_sysroot(False), 'lib')) - - def get_lib_name(name, absolute=False): return str(get_lib_dir(absolute=absolute).joinpath(name)) diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index c1537849da755..5ea5324793c5c 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -6,6 +6,7 @@ import logging import hashlib import os +from pathlib import Path import shutil import glob import importlib.util @@ -36,8 +37,7 @@ logger = logging.getLogger('ports') -DEFAULT_BUILD_CONFIG = {'deferred': False, 'variant': ''} -current_build_config = DEFAULT_BUILD_CONFIG +build_deferred = False def init_port(name, port): @@ -179,8 +179,9 @@ def install_headers(src_dir, pattern='*.h', target=None): @staticmethod def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags=[], exclude_files=[], exclude_dirs=[], srcs=[]): # noqa - build_dir = os.path.join(Ports.get_build_dir(), cache.get_lib_subdir(), port_name) + current_build_config['variant'] - logger.debug(f'build_port: {port_name} in {build_dir}') + mangled_name = str(Path(output_path).relative_to(cache.get_sysroot(True))).replace(os.sep, '_') + build_dir = os.path.join(Ports.get_build_dir(), mangled_name) + logger.debug(f'build_port: {port_name} {output_path} in {build_dir}') if srcs: srcs = [os.path.join(src_dir, s) for s in srcs] else: @@ -203,7 +204,7 @@ def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags= ninja_file = os.path.join(build_dir, 'build.ninja') system_libs.ensure_sysroot() system_libs.create_ninja_file(srcs, ninja_file, output_path, cflags=cflags) - if not current_build_config['deferred']: + if not build_deferred: system_libs.run_ninja(build_dir) else: commands = [] @@ -530,10 +531,10 @@ def get_needed_ports(settings): return needed -def build_port(port_name, settings, build_config=DEFAULT_BUILD_CONFIG): - global current_build_config - current_build_config = build_config - logger.debug(f'build_port {port_name}') +def build_port(port_name, settings, deferred=False): + global build_deferred + build_deferred = deferred + logger.debug(f'build_port {port_name}, {"deferred" if deferred else ""}') port = ports_by_name[port_name] port_set = OrderedSet([port]) resolve_dependencies(port_set, settings) @@ -581,13 +582,13 @@ def add_cflags(args, settings): # noqa: U100 # Now get (i.e. build) the ports in dependency order. This is important because the # headers from one ports might be needed before we can build the next. - global current_build_config - assert not current_build_config['deferred'], "add_cflags shouldn't be called from embuilder" - current_build_config['deferred'] = True + global build_deferred + assert not build_deferred, "add_cflags shouldn't be called from embuilder" + build_deferred = True for port in dependency_order(needed): port.get(Ports, settings, shared) args += port.process_args(Ports) - current_build_config['deferred'] = False + build_deferred = False def show_ports(): sorted_ports = sorted(ports, key=lambda p: p.name) diff --git a/tools/ports/sdl2_gfx.py b/tools/ports/sdl2_gfx.py index 8e2ed0fd78bfb..55de8b3299557 100644 --- a/tools/ports/sdl2_gfx.py +++ b/tools/ports/sdl2_gfx.py @@ -16,8 +16,6 @@ def needed(settings): def get(ports, settings, shared): - sdl_build = os.path.join(ports.get_build_dir(), 'sdl2') - assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_gfx' ports.fetch_project('sdl2_gfx', f'https://github.com/svn2github/sdl2_gfx/archive/{TAG}.zip', sha512hash=HASH) def create(final): diff --git a/tools/ports/sdl2_image.py b/tools/ports/sdl2_image.py index 7a7d0aadd896c..1d01524034597 100644 --- a/tools/ports/sdl2_image.py +++ b/tools/ports/sdl2_image.py @@ -52,8 +52,6 @@ def get_lib_name(settings): def get(ports, settings, shared): - sdl_build = os.path.join(ports.get_build_dir(), 'sdl2') - assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_image' ports.fetch_project('sdl2_image', f'https://github.com/libsdl-org/SDL_image/archive/refs/tags/{TAG}.zip', sha512hash=HASH) libname = get_lib_name(settings) diff --git a/tools/ports/sdl2_mixer.py b/tools/ports/sdl2_mixer.py index a8aa5747ecf51..b08cbfb77d2cb 100644 --- a/tools/ports/sdl2_mixer.py +++ b/tools/ports/sdl2_mixer.py @@ -36,8 +36,6 @@ def get_lib_name(settings): def get(ports, settings, shared): - sdl_build = os.path.join(ports.get_build_dir(), 'sdl2') - assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_mixer' ports.fetch_project('sdl2_mixer', f'https://github.com/libsdl-org/SDL_mixer/archive/{TAG}.zip', sha512hash=HASH) libname = get_lib_name(settings) diff --git a/tools/ports/sdl2_net.py b/tools/ports/sdl2_net.py index cd2cf6a549ad0..09f10eba6bcd1 100644 --- a/tools/ports/sdl2_net.py +++ b/tools/ports/sdl2_net.py @@ -16,8 +16,6 @@ def needed(settings): def get(ports, settings, shared): - sdl_build = os.path.join(ports.get_build_dir(), 'sdl2') - assert os.path.exists(sdl_build), 'You must use SDL2 to use SDL2_net' ports.fetch_project('sdl2_net', f'https://github.com/emscripten-ports/SDL2_net/archive/{TAG}.zip', sha512hash=HASH) def create(final): From 70822383da4f96b012f3b40f5c11d6abaa2d6b39 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 14 Mar 2025 23:29:18 +0000 Subject: [PATCH 06/13] remove unused argument --- tools/cache.py | 2 +- tools/system_libs.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/cache.py b/tools/cache.py index 3819828bc9071..b11ca19171d76 100644 --- a/tools/cache.py +++ b/tools/cache.py @@ -152,7 +152,7 @@ def get_lib(libname, *args, **kwargs): # Request a cached file. If it isn't in the cache, it will be created with # the given creator function -def get(shortname, creator, what=None, force=False, quiet=False, deferred=False): +def get(shortname, creator, what=None, force=False, quiet=False): ensure_setup() cachename = Path(cachedir, shortname) # Check for existence before taking the lock in case we can avoid the diff --git a/tools/system_libs.py b/tools/system_libs.py index 9b3a3c2308dfd..ba533d307f91b 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -427,8 +427,7 @@ def build(self): return cache.get(self.get_path(), self.do_build, force=USE_NINJA == 2, quiet=USE_NINJA) def generate(self): - return cache.get(self.get_path(), self.do_generate, force=USE_NINJA == 2, quiet=USE_NINJA, - deferred=True) + return cache.get(self.get_path(), self.do_generate, force=USE_NINJA == 2, quiet=USE_NINJA) def get_link_flag(self): """ From 0ad6f2c6639ac881f596aee3b43ddb943f5bdf9b Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Thu, 20 Mar 2025 18:13:55 +0000 Subject: [PATCH 07/13] remove unnecessary file deletion --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index aef9201b0e9af..a88d1068baa1d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -499,7 +499,7 @@ jobs: - build-libs - run: name: Clean build directory - command: rm -rf ~/cache/build ~/cache/ports-builds + command: rm -rf ~/cache/build - persist # Perhaps we don't need to run this suite with every commit. Consider moving this to FYI bot. test-posixtest: From 36090e3b3a532886d76ab75d176d97a2de73913b Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Thu, 20 Mar 2025 18:24:37 +0000 Subject: [PATCH 08/13] fix ruff --- tools/ports/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index 94688ae0c16ac..80e9102d0bfa5 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -590,6 +590,7 @@ def add_cflags(args, settings): # noqa: U100 args += port.process_args(Ports) build_deferred = False + def show_ports(): sorted_ports = sorted(ports, key=lambda p: p.name) print('Available official ports:') From 94648d8ca9d1e39a2461d2c2e4db9353f4ba2c5c Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Thu, 20 Mar 2025 19:24:45 +0000 Subject: [PATCH 09/13] remove unneeded ensure_dirs --- embuilder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/embuilder.py b/embuilder.py index bea59b9d773e3..da5c2c1a9cdbc 100755 --- a/embuilder.py +++ b/embuilder.py @@ -221,7 +221,6 @@ def main(): # a system library into the cache, causing trouble. cache.setup() shared.check_sanity() - utils.safe_ensure_dirs(cache.get_path('build')) if args.lto: settings.LTO = args.lto From 75b115132fe3a4ce4e3ac0319b911c683d24c27d Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Tue, 25 Mar 2025 23:33:38 +0000 Subject: [PATCH 10/13] Use global --- embuilder.py | 7 ++++++- tools/ports/__init__.py | 16 ++++------------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/embuilder.py b/embuilder.py index da5c2c1a9cdbc..e2d7a655d0a6e 100755 --- a/embuilder.py +++ b/embuilder.py @@ -15,6 +15,7 @@ import argparse import fnmatch import logging +import os import sys import time from contextlib import contextmanager @@ -171,7 +172,7 @@ def clear_port(port_name): def build_port(port_name): with get_port_variant(port_name) as port_name_base: - ports.build_port(port_name_base, settings, deferred=USE_NINJA) + ports.build_port(port_name_base, settings) def get_system_tasks(): @@ -280,6 +281,10 @@ def main(): if auto_tasks: print('Building targets: %s' % ' '.join(tasks)) + if USE_NINJA: + os.environ['EMBUILDER_PORT_BUILD_DEFERRED'] = '1' + print(f'setting EMBUILDER_PORT_BUILD_DEFERRED=1 pid {os.getpid()}') + for what in tasks: for old, new in legacy_prefixes.items(): if what.startswith(old): diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index 8a1aedf99298d..3a363fcfa373d 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -37,8 +37,6 @@ logger = logging.getLogger('ports') -build_deferred = False - def init_port(name, port): ports.append(port) @@ -205,7 +203,8 @@ def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags= ninja_file = os.path.join(build_dir, 'build.ninja') system_libs.ensure_sysroot() system_libs.create_ninja_file(srcs, ninja_file, output_path, cflags=cflags) - if not build_deferred: + print(f'deferred {os.getenv('EMBUILDER_PORT_BUILD_DEFERRED')} pid {os.getpid()}') + if not os.getenv('EMBUILDER_PORT_BUILD_DEFERRED'): system_libs.run_ninja(build_dir) else: commands = [] @@ -533,10 +532,7 @@ def get_needed_ports(settings): return needed -def build_port(port_name, settings, deferred=False): - global build_deferred - build_deferred = deferred - logger.debug(f'build_port {port_name}, {"deferred" if deferred else ""}') +def build_port(port_name, settings): port = ports_by_name[port_name] port_set = OrderedSet([port]) resolve_dependencies(port_set, settings) @@ -583,14 +579,10 @@ def add_cflags(args, settings): # noqa: U100 needed = get_needed_ports(settings) # Now get (i.e. build) the ports in dependency order. This is important because the - # headers from one ports might be needed before we can build the next. - global build_deferred - assert not build_deferred, "add_cflags shouldn't be called from embuilder" - build_deferred = True + # headers from one port might be needed before we can build the next. for port in dependency_order(needed): port.get(Ports, settings, shared) args += port.process_args(Ports) - build_deferred = False def show_ports(): From 3e52a80010fd79947d74e41d8ad49baf93025b90 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Tue, 25 Mar 2025 23:44:50 +0000 Subject: [PATCH 11/13] skip ports.get to avoid redundant header install --- tools/ports/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/ports/__init__.py b/tools/ports/__init__.py index 3a363fcfa373d..fc6e725d54863 100644 --- a/tools/ports/__init__.py +++ b/tools/ports/__init__.py @@ -203,7 +203,6 @@ def build_port(src_dir, output_path, port_name, includes=[], flags=[], cxxflags= ninja_file = os.path.join(build_dir, 'build.ninja') system_libs.ensure_sysroot() system_libs.create_ninja_file(srcs, ninja_file, output_path, cflags=cflags) - print(f'deferred {os.getenv('EMBUILDER_PORT_BUILD_DEFERRED')} pid {os.getpid()}') if not os.getenv('EMBUILDER_PORT_BUILD_DEFERRED'): system_libs.run_ninja(build_dir) else: @@ -581,7 +580,9 @@ def add_cflags(args, settings): # noqa: U100 # Now get (i.e. build) the ports in dependency order. This is important because the # headers from one port might be needed before we can build the next. for port in dependency_order(needed): - port.get(Ports, settings, shared) + # When using embuilder, don't build the dependencies + if not os.getenv('EMBUILDER_PORT_BUILD_DEFERRED'): + port.get(Ports, settings, shared) args += port.process_args(Ports) From ca3585eaa9c816684ace52c8f11ea90c5a541cfd Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Wed, 26 Mar 2025 00:03:56 +0000 Subject: [PATCH 12/13] skip ports.get when embuilder --- embuilder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/embuilder.py b/embuilder.py index e2d7a655d0a6e..3168fdeb78083 100755 --- a/embuilder.py +++ b/embuilder.py @@ -283,7 +283,6 @@ def main(): if USE_NINJA: os.environ['EMBUILDER_PORT_BUILD_DEFERRED'] = '1' - print(f'setting EMBUILDER_PORT_BUILD_DEFERRED=1 pid {os.getpid()}') for what in tasks: for old, new in legacy_prefixes.items(): From 1772acd5fbd6fc06c9e2dabc42a2a85da732e3db Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Mon, 7 Apr 2025 19:58:47 +0000 Subject: [PATCH 13/13] Put back assertion --- tools/cache.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/cache.py b/tools/cache.py index b11ca19171d76..2446da39d845a 100644 --- a/tools/cache.py +++ b/tools/cache.py @@ -177,6 +177,8 @@ def get(shortname, creator, what=None, force=False, quiet=False): logger.info(message) utils.safe_ensure_dirs(cachename.parent) creator(str(cachename)) + if not os.getenv('EMBUILDER_PORT_BUILD_DEFERRED'): + assert cachename.is_file() if not quiet: logger.info(' - ok')