Import("env") assetsenv = env.Clone( tools=["fbt_assets"], FW_LIB_NAME="assets", ASSETS_WORK_DIR=env.Dir("compiled"), ASSETS_SRC_DIR=env.Dir("#/assets"), ) assetsenv.ApplyLibFlags() # Keep firmware flash icons in build dir for api symbols for asset packs icons_path = ( assetsenv.Dir("#/build/icons") if assetsenv["IS_BASE_FIRMWARE"] else assetsenv["ASSETS_WORK_DIR"] ) icons = assetsenv.CompileIcons( icons_path, assetsenv["ASSETS_SRC_DIR"].Dir("icons"), fw_bundle=True, ) assetsenv.Alias("icons", icons) # Extra icons lib so apps don't override asset packs to use fw icons not exposed to api # Not used anywhere in code, apps still reference assets_icons.h, but if one of the # icons they need is not exposed in api, they can link with fap_libs=["assets"] which # will use this lib purely for linking as a drop-in for missing symbols. # Should mean that apps made for OFW with fap_libs=["assets"], when compiled with # this FBT, will still use asset packs at runtime and only link non-exposed icons. if assetsenv["IS_BASE_FIRMWARE"]: dropin_icons = assetsenv.CompileIcons( assetsenv["ASSETS_WORK_DIR"], assetsenv["ASSETS_SRC_DIR"].Dir("icons"), icon_bundle_name="_assets_icons_dropin", ) # Protobuf .proto -> .c + .h proto_src = assetsenv.Glob("protobuf/*.proto", source=True) proto_options = assetsenv.Glob("protobuf/*.options", source=True) proto = assetsenv.ProtoBuilder(assetsenv["ASSETS_WORK_DIR"], proto_src) assetsenv.Depends(proto, proto_options) # Precious(proto) assetsenv.Alias("proto", proto) # Internal animations dolphin_internal = assetsenv.DolphinSymBuilder( assetsenv["ASSETS_WORK_DIR"], assetsenv["ASSETS_SRC_DIR"].Dir("dolphin"), DOLPHIN_RES_TYPE="internal", ) assetsenv.Alias("dolphin_internal", dolphin_internal) # Blocking animations dolphin_blocking = assetsenv.DolphinSymBuilder( assetsenv["ASSETS_WORK_DIR"], assetsenv["ASSETS_SRC_DIR"].Dir("dolphin"), DOLPHIN_RES_TYPE="blocking", ) assetsenv.Alias("dolphin_blocking", dolphin_blocking) # Protobuf version meta proto_ver = assetsenv.ProtoVerBuilder( "${ASSETS_WORK_DIR}/protobuf_version.h", assetsenv["ASSETS_SRC_DIR"].File("protobuf/Changelog"), ) assetsenv.Depends(proto_ver, proto) assetsenv.Alias("proto_ver", proto_ver) # Gather everything into a static lib assets_parts = (icons, proto, dolphin_blocking, dolphin_internal, proto_ver) env.Replace(FW_ASSETS_HEADERS=assets_parts) assetslib = assetsenv.Library("fw${FW_LIB_NAME}", assets_parts) assetsenv.Install("${LIB_DIST_DIR}", assetslib) if assetsenv["IS_BASE_FIRMWARE"]: dropin_parts = (dropin_icons, proto, dolphin_blocking, dolphin_internal, proto_ver) dropin_assetslib = assetsenv.Library("${FW_LIB_NAME}", dropin_parts) assetsenv.Install("${LIB_DIST_DIR}", dropin_assetslib) # Resources for SD card if assetsenv["IS_BASE_FIRMWARE"]: dolphin_external_out_dir = assetsenv["ASSETS_WORK_DIR"].Dir("dolphin") # External dolphin animations dolphin_external = assetsenv.DolphinExtBuilder( dolphin_external_out_dir, assetsenv["ASSETS_SRC_DIR"].Dir("dolphin"), DOLPHIN_RES_TYPE="external", ) if assetsenv["FORCE"]: assetsenv.AlwaysBuild(dolphin_external) assetsenv.Alias("dolphin_ext", dolphin_external) assetsenv.Clean(dolphin_external, dolphin_external_out_dir) env.Replace(DOLPHIN_EXTERNAL_OUT_DIR=dolphin_external_out_dir) asset_packs_out_dir = assetsenv["ASSETS_WORK_DIR"].Dir("asset_packs") # Default asset packs asset_packs = assetsenv.AssetPacksBuilder( asset_packs_out_dir, assetsenv["ASSETS_SRC_DIR"].Dir("packs"), ) if assetsenv["FORCE"]: assetsenv.AlwaysBuild(asset_packs) assetsenv.Alias("asset_packs", asset_packs) assetsenv.Clean(asset_packs, asset_packs_out_dir) env.Replace(ASSET_PACKS_OUT_DIR=asset_packs_out_dir) Return("assetslib")