| dofile('rive_build_config.lua') | |
| filter({ 'options:with_rive_tools' }) | |
| do | |
| defines({ 'WITH_RIVE_TOOLS' }) | |
| end | |
| filter({ 'options:with_rive_text' }) | |
| do | |
| defines({ 'WITH_RIVE_TEXT' }) | |
| end | |
| filter({ 'options:with_rive_canvas' }) | |
| do | |
| defines({ 'RIVE_CANVAS' }) | |
| end | |
| filter({ 'options:with_rive_scripting' }) | |
| do | |
| defines({ 'WITH_RIVE_SCRIPTING' }) | |
| end | |
| -- The wasm backend carries no Luau in any capacity; every other backend | |
| -- keeps it, and 'both' runs the two side by side for differential tools. | |
| if _OPTIONS['scripting_vm'] ~= 'wasm' then | |
| filter({ 'options:with_rive_scripting' }) | |
| do | |
| defines({ 'WITH_RIVE_SCRIPTING_LUAU' }) | |
| end | |
| filter({}) | |
| end | |
| -- Workspace scope: gated members change class layout, so every project | |
| -- must agree on the define. | |
| if _OPTIONS['scripting_vm'] == 'wasm' or _OPTIONS['scripting_vm'] == 'both' | |
| then | |
| filter({ 'options:with_rive_scripting' }) | |
| do | |
| defines({ 'WITH_RIVE_SCRIPTING_WASM' }) | |
| end | |
| filter({}) | |
| if _OPTIONS['wasm_hw_bounds'] then | |
| filter({ 'options:with_rive_scripting' }) | |
| do | |
| defines({ 'RIVE_WASM_HW_BOUNDS' }) | |
| end | |
| filter({}) | |
| end | |
| end | |
| filter({ 'options:with_rive_test_signature' }) | |
| do | |
| -- Swaps `g_scriptVerificationPublicKey` for the public key that | |
| -- corresponds to `SampleSigningContext._samplePrivateKey` in Dart, | |
| -- so .riv files signed locally via the sample keypair verify. | |
| -- NEVER enable on shipping builds — it accepts .rivs any attacker | |
| -- could produce. | |
| defines({ 'WITH_RIVE_TEST_SIGNATURE' }) | |
| end | |
| filter({ 'options:track_rive_shader_id' }) | |
| do | |
| -- Stores ShaderAsset::assetId() on each ore::ShaderModule. | |
| defines({ 'TRACK_RIVE_SHADER_ID' }) | |
| end | |
| filter({ 'options:with_rive_audio=system' }) | |
| do | |
| defines({ 'WITH_RIVE_AUDIO', 'MA_NO_RESOURCE_MANAGER' }) | |
| end | |
| filter({ 'options:with_rive_audio=external' }) | |
| do | |
| defines({ | |
| 'WITH_RIVE_AUDIO', | |
| 'EXTERNAL_RIVE_AUDIO_ENGINE', | |
| 'MA_NO_DEVICE_IO', | |
| 'MA_NO_RESOURCE_MANAGER', | |
| }) | |
| end | |
| filter({ 'options:with_rive_layout' }) | |
| do | |
| defines({ 'WITH_RIVE_LAYOUT' }) | |
| end | |
| filter({ 'options:with_rive_editor' }) | |
| do | |
| defines({ 'WITH_RIVE_EDITOR' }) | |
| -- Generated runtime bases include their editor extension `.inl` from the | |
| -- kernel tree, so every project that sees a generated header needs the | |
| -- kernel include root, not just the `rive` library. | |
| includedirs({ path.getabsolute('../editor_native/kernel/include') }) | |
| end | |
| filter({}) | |
| dependencies = path.getabsolute('dependencies/') | |
| dofile(path.join(dependencies, 'premake5_harfbuzz_v2.lua')) | |
| dofile(path.join(dependencies, 'premake5_sheenbidi_v2.lua')) | |
| dofile(path.join(dependencies, 'premake5_miniaudio_v2.lua')) | |
| dofile(path.join(dependencies, 'premake5_yoga_v2.lua')) | |
| if _OPTIONS['with_optick'] then | |
| dofile(path.join(dependencies, 'premake5_optick.lua')) | |
| end | |
| if _OPTIONS['with_microprofile'] then | |
| dofile(path.join(dependencies, 'premake5_microprofile.lua')) | |
| end | |
| if _OPTIONS['with_rive_scripting'] then | |
| local scripting = require(path.join(path.getabsolute('scripting/'), 'premake5')) | |
| luau = scripting.luau | |
| libhydrogen = scripting.libhydrogen | |
| if _OPTIONS['scripting_vm'] == 'wasm' or _OPTIONS['scripting_vm'] == 'both' | |
| then | |
| local wamrLib = | |
| require(path.join(path.getabsolute('scripting/'), 'premake5_wamr')) | |
| wamr = wamrLib.wamr | |
| wamrConfigDefines = wamrLib.configDefines | |
| wamrInternalIncludes = wamrLib.internalIncludes | |
| end | |
| else | |
| project('luau_vm') | |
| do | |
| kind('StaticLib') | |
| files({ 'dummy.cpp' }) | |
| end | |
| luau = '' | |
| libhydrogen = '' | |
| end | |
| project('rive') | |
| do | |
| kind('StaticLib') | |
| includedirs({ | |
| 'include', | |
| harfbuzz .. '/src', | |
| sheenbidi .. '/Headers', | |
| miniaudio, | |
| yoga, | |
| }) | |
| -- ORE headers conditionally include <vulkan/vulkan.h> when | |
| -- ORE_BACKEND_VK is defined; the rive base library transitively pulls | |
| -- those headers in, so the Vulkan SDK paths need to be visible here too. | |
| if _OPTIONS['with_vulkan'] and _OPTIONS['with_rive_canvas'] then | |
| local dependency = require('dependency') | |
| local vh = dependency.github('KhronosGroup/Vulkan-Headers', | |
| 'vulkan-sdk-1.4.321') | |
| local vma = dependency.github( | |
| 'GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator', | |
| 'v3.3.0') | |
| externalincludedirs({ vh .. '/include', vma .. '/include' }) | |
| end | |
| if _OPTIONS['with_microprofile'] then | |
| includedirs({microprofile}) | |
| end | |
| filter('action:xcode4') | |
| do | |
| -- xcode doesnt like angle brackets except for -isystem | |
| -- should use externalincludedirs but GitHub runners dont have latest premake5 binaries | |
| buildoptions({ '-isystem' .. yoga }) | |
| end | |
| filter({}) | |
| defines({ 'YOGA_EXPORT=', '_RIVE_INTERNAL_' }) | |
| files({ 'src/**.cpp', 'include/**.h', 'include/**.hpp' }) | |
| filter({'toolset:msc' }) | |
| do | |
| -- add a debug visualizer for various runtime types for MSVC debugging. | |
| -- (the visualization only works with MSVC-compiled projects, Clang- | |
| -- built projects don't work) | |
| files({ 'runtime.natvis' }) | |
| end | |
| -- TODO: remove once simple_array.hpp migrates off std::is_pod. | |
| -- Console toolchains OOM on the ~18k deprecation warnings otherwise. | |
| filter({ 'options:_console_only_ore_vk' }) | |
| do | |
| buildoptions({ '-Wno-deprecated-declarations' }) | |
| end | |
| filter('options:not for_unreal') | |
| do | |
| fatalwarnings({ 'All' }) | |
| end | |
| filter({'options:for_unreal'}) | |
| do | |
| defines({ '_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR' }) | |
| end | |
| filter({ 'options:with_rive_text', 'options:not no-harfbuzz-renames' }) | |
| do | |
| includedirs({ | |
| dependencies, | |
| }) | |
| forceincludes({ 'rive_harfbuzz_renames.h' }) | |
| end | |
| filter({ 'options:not no-yoga-renames' }) | |
| do | |
| includedirs({ | |
| dependencies, | |
| }) | |
| forceincludes({ 'rive_yoga_renames.h' }) | |
| end | |
| filter({ 'system:macosx', 'options:variant=runtime' }) | |
| do | |
| buildoptions({ | |
| '-Wimplicit-float-conversion -fembed-bitcode -arch arm64 -arch x86_64 -isysroot ' | |
| .. (os.getenv('MACOS_SYSROOT') or ''), | |
| }) | |
| end | |
| filter('system:windows') | |
| do | |
| architecture('x64') | |
| defines({ '_USE_MATH_DEFINES' }) | |
| end | |
| filter({}) | |
| if _OPTIONS['with_optick'] then | |
| includedirs({ optick .. '/src' }) | |
| end | |
| filter('system:macosx or system:ios') | |
| do | |
| files({ 'src/text/font_hb_apple.mm' }) | |
| end | |
| if TESTING == true then | |
| filter({ 'toolset:not msc' }) | |
| do | |
| buildoptions({ '-Wshorten-64-to-32', '-fprofile-instr-generate', '-fcoverage-mapping' }) | |
| end | |
| end | |
| filter({ 'options:with_rive_scripting', 'options:not no-rive-decoders' }) | |
| do | |
| defines({ 'RIVE_DECODERS' }) | |
| includedirs({ 'decoders/include' }) | |
| end | |
| filter({ 'options:with_rive_scripting' }) | |
| do | |
| includedirs({ | |
| libhydrogen, | |
| }) | |
| files({ | |
| libhydrogen .. '/libhydrogen.c', | |
| }) | |
| end | |
| if _OPTIONS['scripting_vm'] ~= 'wasm' then | |
| filter({ 'options:with_rive_scripting' }) | |
| do | |
| includedirs({ luau .. '/VM/include' }) | |
| end | |
| end | |
| if wamr then | |
| filter({ 'options:with_rive_scripting' }) | |
| do | |
| includedirs({ wamr .. '/core/iwasm/include' }) | |
| defines(wamrConfigDefines) | |
| -- The tier transplant is the one TU reading instance internals | |
| -- (layout hinges on the config defines above); runtime builds | |
| -- compile its stub without them. The tests workspace forces | |
| -- tools on without the option, so honor both signals. | |
| if WITH_RIVE_TOOLS == true then | |
| includedirs(wamrInternalIncludes) | |
| else | |
| filter({ | |
| 'options:with_rive_scripting', | |
| 'options:with_rive_tools', | |
| }) | |
| includedirs(wamrInternalIncludes) | |
| end | |
| filter({ 'options:with_rive_scripting', 'system:macosx' }) | |
| defines({ 'BH_PLATFORM_DARWIN' }) | |
| filter({ 'options:with_rive_scripting', 'system:linux' }) | |
| defines({ 'BH_PLATFORM_LINUX' }) | |
| filter({ 'options:with_rive_scripting', 'system:windows' }) | |
| defines({ 'BH_PLATFORM_WINDOWS', 'HAVE_STRUCT_TIMESPEC' }) | |
| filter({ | |
| 'options:with_rive_scripting', | |
| 'system:windows', | |
| 'files:**/wamr_state_transplant.cpp', | |
| }) | |
| -- platform_common.h hardcodes __declspec on BH_MALLOC while our | |
| -- static-link wasm_export.h declares it plain. | |
| buildoptions({ '-Wno-dll-attribute-on-redeclaration' }) | |
| filter({ 'options:with_rive_scripting' }) | |
| end | |
| filter({}) | |
| end | |
| filter({ 'options:with_rive_canvas' }) | |
| do | |
| -- lua_gpu.cpp and lua_scripted_context.cpp include renderer (C++17) headers. | |
| includedirs({ 'renderer/include' }) | |
| end | |
| filter({ 'options:with_rive_canvas', 'options:not cpp20' }) | |
| do | |
| -- We need to also set the dialect to C++17 when building with Rive | |
| -- canvas, unless we're also setting it to C++20 (in which case we | |
| -- want to keep that preference) | |
| cppdialect('C++17') | |
| end | |
| -- On Apple, ore_context.hpp imports Metal.h (ORE_BACKEND_METAL is globally | |
| -- defined), which requires ObjC++ compilation. Swap .cpp files for .mm | |
| -- wrappers so they are compiled as ObjC++. | |
| -- Also undefine the GL globals that bleed in from pls_renderer.lua — | |
| -- the runtime rive project only uses Metal on macOS/iOS. | |
| filter({ 'system:macosx or system:ios', 'options:with_rive_canvas' }) | |
| do | |
| -- Swap .cpp for .mm wrappers: ore_context.hpp imports <Metal/Metal.h> | |
| -- (via ORE_BACKEND_METAL) which is only valid in ObjC++ files. | |
| removefiles({ 'src/lua/lua_scripted_context.cpp' }) | |
| removefiles({ 'src/lua/renderer/lua_gpu.cpp' }) | |
| files({ 'src/lua/lua_scripted_context_apple.mm' }) | |
| files({ 'src/lua/renderer/lua_gpu_apple.mm' }) | |
| end | |
| filter({ 'options:with_rive_scripting', 'options:not with_rive_tools' }) | |
| do | |
| -- =1 required; an empty define evaluates to 0 on strict preprocessors. | |
| defines({ 'HYDRO_SIGN_VERIFY_ONLY=1' }) | |
| end | |
| if _OPTIONS['scripting_vm'] == 'wasm' then | |
| filter({}) | |
| removefiles({ 'src/lua/**' }) | |
| end | |
| filter({ | |
| 'options:with_rive_scripting', | |
| 'options:config=release', | |
| 'system:android', | |
| 'options:arch=arm', | |
| 'files:**/libhydrogen.c' | |
| }) | |
| do | |
| -- Android ARMv7 devices running API < 29 cannot load ELF TLS relocations | |
| -- (e.g. R_ARM_TLS_*). In release builds with scripting, libhydrogen.c can | |
| -- introduce these TLS relocations (through `__thread` for RNG) when LTO | |
| -- is enabled, which then fails to link at runtime (`unknown reloc type 17`). | |
| -- We want to keep global LTO for performance, but compile only this | |
| -- translation unit without LTO, forcing emulated TLS so that the final | |
| -- ARMv7 librive-android.so does not include unsupported ELF TLS relocations. | |
| buildoptions({'-fno-lto', '-femulated-tls'}) | |
| end | |
| end | |
| newoption({ | |
| trigger = 'with_rive_tools', | |
| description = 'Enables tools usually not necessary for runtime.', | |
| }) | |
| newoption({ | |
| trigger = 'with_rive_scripting', | |
| description = 'Enables scripting for the runtime.', | |
| }) | |
| -- Internal capability flag opted into by platform packages. | |
| newoption({ | |
| trigger = '_nx_platform', | |
| description = 'internal: Nintendo build (set by platform packages)', | |
| }) | |
| newoption({ | |
| trigger = 'scripting_vm', | |
| value = 'VM', | |
| description = 'Scripting execution backend.', | |
| allowed = { | |
| { 'luau', 'Native Luau VM (default)' }, | |
| { 'wasm', 'WAMR executing wasm script modules, no Luau in the build' }, | |
| { 'both', 'Both backends, for differential tools' }, | |
| }, | |
| default = 'luau', | |
| }) | |
| newoption({ | |
| trigger = 'wasm_hw_bounds', | |
| description = 'WAMR hardware bounds checks for wasm modules compiled ' | |
| .. 'without sw bounds (AnimaScript); Luau artifacts stay sw. ' | |
| .. '64-bit desktop/mobile only: reserves 8GB address space per ' | |
| .. 'module memory and installs a SIGSEGV/SIGBUS handler.', | |
| }) | |
| newoption({ | |
| trigger = 'with_rive_test_signature', | |
| description = 'Test-only: accept .riv files signed by the Dart ' | |
| .. 'SampleSigningContext keypair. Do not enable on shipping builds.', | |
| }) | |
| newoption({ | |
| trigger = 'with_rive_text', | |
| description = 'Compiles in text features.', | |
| }) | |
| newoption({ | |
| trigger = 'with_rive_audio', | |
| value = 'disabled', | |
| description = 'The audio mode to use.', | |
| allowed = { { 'disabled' }, { 'system' }, { 'external' } }, | |
| }) | |
| newoption({ | |
| trigger = 'with_rive_layout', | |
| description = 'Compiles in layout features.', | |
| }) | |
| newoption({ | |
| trigger = 'with_rive_canvas', | |
| description = 'Compiles in RenderCanvas and Ore GPU abstraction layer.', | |
| }) | |
| newoption({ | |
| trigger = 'with_rive_editor', | |
| description = 'Enables editor-mode hooks (onPropertyChanging, applyChange, arena). ' | |
| .. 'Defined only by editor_native — never by runtime SDK consumers.', | |
| }) | |
| newoption({ | |
| trigger = 'with_rive_docs', | |
| description = 'Indicates building for use with the docs generator.', | |
| }) | |
| newoption({ | |
| trigger = 'track_rive_shader_id', | |
| description = 'Stores ShaderAsset::assetId() on each ore::ShaderModule.', | |
| }) |