Files
rive-cpp/tests/rive_tools_project.lua
JoshJRive c18e964c42 fix(build): Correct tracking of intended target OS in premake (#10853) c7a0379ab3
We've been testing _TARGET_OS in a lot of places in our build, but that is not actually updated in Android/Emscripten builds (it would continue to report, say, Windows). Among other things, this meant that we would build D3D12 shaders for every Android build, even though they were not needed.

This adds a `rive_target_os` value to `rive_build_config.lua` which is updated manually for those two projects, so that scripts won't do the Windows/mac things when building for android/emscripten on those platforms.

Co-authored-by: Josh Jersild <joshua@rive.app>
2025-10-21 21:11:40 +00:00

400 lines
11 KiB
Lua

dofile('rive_build_config.lua')
defines({ 'WITH_RIVE_TOOLS' })
RIVE_RUNTIME_DIR = path.getabsolute('..')
RIVE_PLS_DIR = path.getabsolute('../renderer')
dofile(RIVE_RUNTIME_DIR .. '/premake5_v2.lua')
dofile(RIVE_RUNTIME_DIR .. '/cg_renderer/premake5.lua')
dofile(RIVE_RUNTIME_DIR .. '/dependencies/premake5_libpng_v2.lua')
dofile(RIVE_RUNTIME_DIR .. '/dependencies/premake5_glfw_v2.lua')
dofile(RIVE_RUNTIME_DIR .. '/decoders/premake5_v2.lua')
dofile(RIVE_PLS_DIR .. '/premake5_pls_renderer.lua')
newoption({ trigger = 'with-skia', description = 'use skia' })
if _OPTIONS['with-skia'] then
dofile(RIVE_RUNTIME_DIR .. '/skia/renderer/premake5_v2.lua')
end
function rive_tools_project(name, project_kind)
project(name)
if project_kind == 'RiveTool' then
kind(
_OPTIONS['for_unreal'] and 'StaticLib'
or _OPTIONS['for_android'] and 'SharedLib'
or _OPTIONS['os'] == 'ios' and 'StaticLib'
or 'ConsoleApp'
)
dependson({
'tools_common',
'rive_pls_renderer',
'rive_cg_renderer',
'rive_decoders',
'rive',
'libpng',
'zlib',
'libjpeg',
'libwebp',
'rive_yoga',
'rive_harfbuzz',
'rive_sheenbidi',
'miniaudio',
})
filter({ 'system:windows', 'options:with-asan', 'options:toolset=clang' })
do
links({
'clang_rt.asan_dbg_dynamic-x86_64.lib',
'clang_rt.asan_dynamic_runtime_thunk-x86_64.lib',
})
end
filter({})
else
kind(project_kind)
end
fatalwarnings { "All" }
defines({
'SK_GL',
'GL_SILENCE_DEPRECATION', -- For glReadPixels()
'YOGA_EXPORT=',
})
includedirs({
'.',
RIVE_PLS_DIR .. '/include',
RIVE_PLS_DIR .. '/path_fiddle',
RIVE_PLS_DIR .. '/shader_hotload',
RIVE_PLS_DIR .. '/src',
RIVE_RUNTIME_DIR .. '/include',
RIVE_RUNTIME_DIR .. '/cg_renderer/include',
'unit_tests',
'%{cfg.targetdir}/include/libpng',
})
externalincludedirs({
'include',
RIVE_PLS_DIR .. '/glad',
RIVE_PLS_DIR .. '/glad/include',
yoga,
libpng,
zlib,
})
if ndk then
externalincludedirs({ ndk .. '/sources' })
links({ 'log', 'android' })
end
if _OPTIONS['with_vulkan'] then
dofile(RIVE_PLS_DIR .. '/rive_vk_bootstrap/bootstrap_project.lua')
end
filter({ 'options:with_rive_scripting' })
do
includedirs({
luau .. '/VM/include',
})
end
filter({ 'system:windows or macosx or linux', 'options:not for_unreal' })
do
externalincludedirs({
glfw .. '/include',
})
end
filter('options:with-skia')
do
includedirs({
RIVE_RUNTIME_DIR .. '/skia/renderer/include',
RIVE_RUNTIME_DIR .. '/skia/dependencies',
RIVE_RUNTIME_DIR .. '/skia/dependencies/skia',
})
defines({ 'RIVE_SKIA' })
libdirs({ RIVE_RUNTIME_DIR .. '/skia/dependencies/skia/out/static' })
end
filter({ 'toolset:not msc' })
do
buildoptions({ '-Wshorten-64-to-32' })
end
filter({ 'system:windows' })
do
architecture('x64')
defines({
'_USE_MATH_DEFINES',
'_CRT_SECURE_NO_WARNINGS',
'_CRT_NONSTDC_NO_DEPRECATE',
'_WINSOCK_DEPRECATED_NO_WARNINGS',
'UNICODE',
})
end
filter('system:android')
do
defines({ 'RIVE_TOOLS_NO_GLFW' })
end
filter('system:ios')
do
defines({ 'RIVE_TOOLS_NO_GLFW', 'RIVE_TOOLS_NO_GL' })
end
-- Match PLS math options for testing simd.
filter({ 'system:not windows', 'options:not no_ffp_contract' })
do
buildoptions({
'-ffp-contract=on',
'-fassociative-math',
-- Don't warn about simd vectors larger than 128 bits when AVX is not enabled.
'-Wno-psabi',
})
end
filter({ 'system:windows', 'options:toolset=msc' })
do
-- MSVC doesn't allow designated initializers on C++17.
defines({
'_SILENCE_CXX20_IS_POD_DEPRECATION_WARNING',
'_SILENCE_ALL_CXX20_DEPRECATION_WARNINGS',
})
buildoptions({
-- "warning C4577: 'noexcept' used with no exception handling mode specified;
-- termination on exception is not guaranteed. Specify /EHsc"
'/EHsc',
})
end
filter('options:with-dawn')
do
includedirs({
RIVE_PLS_DIR .. '/dependencies/dawn/include',
RIVE_PLS_DIR .. '/dependencies/dawn/out/release/gen/include',
})
end
filter({ 'kind:ConsoleApp or SharedLib or WindowedApp' })
do
libdirs({ RIVE_RUNTIME_DIR .. '/build/%{cfg.system}/bin/' .. RIVE_BUILD_CONFIG })
links({
'tools_common',
'rive_pls_renderer',
'rive_cg_renderer',
'rive_decoders',
'rive',
'libpng',
'zlib',
'libwebp',
'rive_yoga',
'rive_harfbuzz',
'rive_sheenbidi',
'miniaudio',
})
end
filter({ 'kind:ConsoleApp or SharedLib or WindowedApp', 'options:not no_rive_jpeg' })
do
links({
'libjpeg',
})
end
filter({})
if ndk then
relative_ndk = ndk
if string.sub(ndk, 1, 1) == '/' then
-- An absolute file path wasn't working with premake.
local current_path = string.gmatch(path.getabsolute('.'), '([^\\/]+)')
for dir in current_path do
relative_ndk = '../' .. relative_ndk
end
end
files({
relative_ndk .. '/sources/android/native_app_glue/android_native_app_glue.c',
})
end
filter({ 'kind:ConsoleApp or SharedLib or WindowedApp', 'system:windows' })
do
links({
'glfw3',
'opengl32',
'd3d11',
'd3d12',
'dxguid',
'dxgi',
'Dbghelp',
'd3dcompiler',
'ws2_32',
})
end
filter({ 'kind:ConsoleApp or SharedLib or WindowedApp', 'system:macosx' })
do
links({
'glfw3',
'Metal.framework',
'QuartzCore.framework',
'Cocoa.framework',
'CoreGraphics.framework',
'CoreFoundation.framework',
'CoreMedia.framework',
'CoreServices.framework',
'IOKit.framework',
'Security.framework',
'OpenGL.framework',
'bz2',
'iconv',
'lzma',
'z', -- lib av format
})
end
filter({ 'kind:ConsoleApp or SharedLib or WindowedApp', 'system:linux' })
do
links({ 'glfw3', 'm', 'z', 'dl', 'pthread', 'GL' })
end
filter({ 'kind:ConsoleApp or SharedLib or WindowedApp', 'system:android' })
do
links({ 'EGL', 'GLESv3', 'log' })
end
filter({ 'kind:ConsoleApp or SharedLib or WindowedApp', 'options:with-dawn' })
do
libdirs({
RIVE_PLS_DIR .. '/dependencies/dawn/out/release/obj/src/dawn',
RIVE_PLS_DIR .. '/dependencies/dawn/out/release/obj/src/dawn/native',
RIVE_PLS_DIR .. '/dependencies/dawn/out/release/obj/src/dawn/platform',
RIVE_PLS_DIR .. '/dependencies/dawn/out/release/obj/src/dawn/platform',
})
links({
'winmm',
'webgpu_dawn',
'dawn_native_static',
'dawn_proc_static',
'dawn_platform_static',
})
end
filter({
'kind:ConsoleApp or SharedLib or WindowedApp',
'options:with-dawn',
'system:windows',
})
do
links({ 'dxguid' })
end
filter({
'kind:ConsoleApp or SharedLib or WindowedApp',
'options:with-dawn',
'system:macosx',
})
do
links({ 'IOSurface.framework' })
end
filter({ 'kind:ConsoleApp or SharedLib or WindowedApp', 'options:with-skia' })
do
links({ 'skia', 'rive_skia_renderer' })
end
filter('system:emscripten')
do
targetextension('.js')
linkoptions({
'-sEXPORTED_FUNCTIONS=_main,_rive_print_message_on_server,_malloc,_free',
'-sEXPORTED_RUNTIME_METHODS=ccall,cwrap',
'-sENVIRONMENT=web',
'-sUSE_GLFW=3',
'-sMIN_WEBGL_VERSION=2',
'-sMAX_WEBGL_VERSION=2',
'-sASYNCIFY',
'-sASYNCIFY_IMPORTS="[async_sleep, wasi_snapshot_preview1.fd_write]"',
'-sASYNCIFY_STACK_SIZE=16384',
'-sGL_TESTING',
'-sALLOW_MEMORY_GROWTH',
'-sINITIAL_HEAP=134217728',
'-lwebsocket.js',
})
end
filter({ 'system:emscripten', 'options:with-webgpu', 'options:not with_wagyu' })
do
linkoptions({
'-sUSE_WEBGPU',
})
end
filter('files:**.html')
do
buildmessage('Copying %{file.relpath} to %{cfg.targetdir}')
buildcommands({ 'cp %{file.relpath} %{cfg.targetdir}/%{file.name}' })
buildoutputs({ '%{cfg.targetdir}/%{file.name}' })
end
filter({})
if RIVE_WAGYU_PORT then
buildoptions({ RIVE_WAGYU_PORT })
linkoptions({ RIVE_WAGYU_PORT })
end
end
rive_tools_project('tools_common', 'StaticLib')
do
files({
'common/*.cpp',
'unit_tests/assets/*.cpp',
RIVE_PLS_DIR .. '/path_fiddle/fiddle_context_gl.cpp',
RIVE_PLS_DIR .. '/path_fiddle/fiddle_context_d3d.cpp',
RIVE_PLS_DIR .. '/path_fiddle/fiddle_context_d3d12.cpp',
RIVE_PLS_DIR .. '/path_fiddle/fiddle_context_vulkan.cpp',
RIVE_PLS_DIR .. '/path_fiddle/fiddle_context_dawn.cpp',
RIVE_PLS_DIR .. '/shader_hotload/**.cpp',
})
if rive_target_os == 'windows' then
externalincludedirs({
dx12_headers .. '/include/directx',
})
end
filter({ 'options:for_unreal' })
do
defines({ 'RIVE_UNREAL', 'RIVE_TOOLS_NO_GLFW', 'RIVE_TOOLS_NO_GL' })
end
filter({ 'toolset:not msc' })
do
buildoptions({ '-Wshorten-64-to-32' })
end
filter('system:macosx or ios')
do
files({ 'common/*.mm' })
end
filter('system:macosx')
do
files({
RIVE_PLS_DIR .. '/path_fiddle/fiddle_context_metal.mm',
RIVE_PLS_DIR .. '/path_fiddle/fiddle_context_dawn_helper.mm',
})
end
filter('system:emscripten')
do
files({ 'common/rive_wasm_app.cpp' })
end
filter({})
end