2021-03-08 05:03:35 +00:00
|
|
|
config = {
|
2022-04-01 22:58:13 +00:00
|
|
|
target = 'native',
|
2021-03-08 05:03:35 +00:00
|
|
|
debug = true,
|
|
|
|
optimize = false,
|
2022-04-01 22:58:13 +00:00
|
|
|
supercharge = false,
|
|
|
|
sanitize = false,
|
|
|
|
strict = true,
|
2022-12-04 23:03:19 +00:00
|
|
|
glfw = true,
|
2022-04-01 22:58:13 +00:00
|
|
|
luajit = false,
|
2022-05-08 21:06:18 +00:00
|
|
|
glslang = true,
|
2023-05-11 07:16:18 +00:00
|
|
|
utf8 = true,
|
2021-03-08 05:03:35 +00:00
|
|
|
modules = {
|
|
|
|
audio = true,
|
|
|
|
data = true,
|
|
|
|
event = true,
|
|
|
|
filesystem = true,
|
|
|
|
graphics = true,
|
|
|
|
headset = true,
|
|
|
|
math = true,
|
|
|
|
physics = true,
|
|
|
|
system = true,
|
|
|
|
thread = true,
|
|
|
|
timer = true
|
|
|
|
},
|
|
|
|
headsets = {
|
2023-06-29 23:22:02 +00:00
|
|
|
simulator = true,
|
2022-04-01 22:58:13 +00:00
|
|
|
openxr = false,
|
2021-03-08 05:03:35 +00:00
|
|
|
webxr = false
|
|
|
|
},
|
2022-04-21 07:27:13 +00:00
|
|
|
renderers = {
|
2022-04-22 00:58:26 +00:00
|
|
|
vulkan = true,
|
|
|
|
webgpu = false
|
2022-04-21 07:27:13 +00:00
|
|
|
},
|
2021-03-08 05:03:35 +00:00
|
|
|
spatializers = {
|
|
|
|
simple = true,
|
|
|
|
oculus = false,
|
|
|
|
phonon = false
|
|
|
|
},
|
|
|
|
android = {
|
2021-10-28 21:35:05 +00:00
|
|
|
sdk = '/path/to/sdk',
|
|
|
|
ndk = '/path/to/ndk',
|
|
|
|
version = 29,
|
|
|
|
buildtools = '30.0.3',
|
|
|
|
keystore = '/path/to/keystore',
|
|
|
|
keystorepass = 'pass:password',
|
2022-04-01 22:58:13 +00:00
|
|
|
manifest = nil,
|
2023-02-06 06:02:04 +00:00
|
|
|
package = 'org.lovr.app',
|
2022-04-01 22:58:13 +00:00
|
|
|
project = nil
|
2021-03-08 05:03:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
-- config notes:
|
|
|
|
-- target can be native or win32/macos/linux/android/wasm
|
|
|
|
-- supercharge adds dangerous/aggressive optimizations that may reduce stability
|
|
|
|
-- sanitize adds checks for memory leaks and undefined behavior (reduces performance)
|
|
|
|
-- strict will make warnings fail the build
|
|
|
|
-- luajit and headsets.openxr should be a path to a folder with the lib (tup can't build them yet)
|
|
|
|
-- android.package should be something like 'org.lovr.app'
|
|
|
|
-- android.project is a path to a lovr project folder that will be included in the apk
|
|
|
|
-- tup.config can also be used to override properties without modifying this file:
|
|
|
|
-- create a tup.config file and add lines like CONFIG_<KEY>=<val> to override properties
|
|
|
|
-- boolean values use y and n, numbers and unquoted strings are also supported
|
|
|
|
-- subtables should be formatted as CONFIG_MODULE_<m>=y, CONFIG_ANDROID_VERSION=29, etc.
|
|
|
|
|
2022-04-01 23:54:28 +00:00
|
|
|
function merge(t, prefix)
|
|
|
|
for k, v in pairs(t) do
|
|
|
|
if type(v) == 'table' then
|
|
|
|
merge(v, k:gsub('s$', ''):upper() .. '_')
|
|
|
|
else
|
|
|
|
local str = tup.getconfig((prefix or '') .. k:upper())
|
|
|
|
if str == 'y' or str == 'n' then
|
|
|
|
t[k] = str == 'y'
|
|
|
|
elseif #str > 0 then
|
|
|
|
t[k] = str
|
|
|
|
end
|
2021-10-28 21:35:05 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-04-01 23:54:28 +00:00
|
|
|
merge(config)
|
|
|
|
|
2021-03-08 05:03:35 +00:00
|
|
|
---> setup
|
|
|
|
|
2022-10-21 04:28:54 +00:00
|
|
|
cc = 'clang'
|
|
|
|
cxx = 'clang++'
|
2022-04-01 22:58:13 +00:00
|
|
|
host = tup.getconfig('TUP_PLATFORM'):gsub('macosx', 'macos')
|
|
|
|
target = config.target == 'native' and host or config.target
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
flags = {
|
2022-08-02 04:24:41 +00:00
|
|
|
'-fPIE',
|
2022-04-01 22:58:13 +00:00
|
|
|
config.debug and '-g' or '',
|
|
|
|
config.optimize and '-Os' or '',
|
|
|
|
config.supercharge and '-flto -march=native -DLOVR_UNCHECKED' or '',
|
2023-10-05 19:23:12 +00:00
|
|
|
config.sanitize and '-fsanitize=address -fsanitize=undefined' or '',
|
2022-04-01 22:58:13 +00:00
|
|
|
}
|
|
|
|
|
2021-03-08 05:03:35 +00:00
|
|
|
cflags = {
|
2022-04-01 22:58:13 +00:00
|
|
|
'-std=c11 -pedantic',
|
2024-03-30 01:04:42 +00:00
|
|
|
'-Wall -Wextra -Wno-unused-parameter -Wno-strict-prototypes',
|
2021-03-08 05:03:35 +00:00
|
|
|
config.strict and '-Werror' or '',
|
2022-04-01 22:58:13 +00:00
|
|
|
config.optimize and '-fdata-sections -ffunction-sections' or '',
|
2021-10-31 19:06:03 +00:00
|
|
|
'-fdiagnostics-color=always',
|
2021-03-08 05:03:35 +00:00
|
|
|
'-fvisibility=hidden',
|
2022-04-01 22:58:13 +00:00
|
|
|
'-Ietc',
|
2021-03-08 05:03:35 +00:00
|
|
|
'-Isrc',
|
|
|
|
'-Isrc/modules',
|
2022-12-22 07:59:41 +00:00
|
|
|
'-Isrc/lib/std',
|
2022-12-31 06:04:27 +00:00
|
|
|
'-Ideps/vulkan-headers/include'
|
2021-03-08 05:03:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bin = target == 'android' and 'bin/apk/lib/arm64-v8a' or 'bin'
|
2022-04-01 22:58:13 +00:00
|
|
|
|
2021-03-08 05:03:35 +00:00
|
|
|
lflags = '-L' .. bin
|
2021-04-07 14:01:30 +00:00
|
|
|
lflags += not config.debug and '-Wl,-s' or ''
|
|
|
|
lflags += config.optimize and (target == 'macos' and '-Wl,-dead_strip' or '-Wl,--gc-sections') or ''
|
2022-08-13 04:08:08 +00:00
|
|
|
lflags += '-rdynamic'
|
2023-10-05 19:23:12 +00:00
|
|
|
lflags += config.sanitize and '-lubsan' or ''
|
2021-03-08 05:03:35 +00:00
|
|
|
|
|
|
|
if target == 'win32' then
|
|
|
|
cflags += '-D_CRT_SECURE_NO_WARNINGS'
|
|
|
|
cflags += '-DWINVER=0x0600' -- Vista
|
|
|
|
cflags += '-D_WIN32_WINNT=0x0600'
|
|
|
|
lflags += '-lshell32 -lole32 -luuid'
|
|
|
|
lflags += config.debug and '-Wl,--subsystem,console' or '-Wl,--subsystem,windows'
|
|
|
|
if not cc:match('mingw') then
|
2022-04-01 22:58:13 +00:00
|
|
|
extras += { 'bin/lovr.lib', 'bin/lovr.exp' }
|
2021-03-08 05:03:35 +00:00
|
|
|
if config.debug then
|
2022-04-01 22:58:13 +00:00
|
|
|
extras += { 'bin/lovr.pdb', 'bin/lovr.ilk' }
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if target == 'macos' then
|
2023-09-21 00:58:13 +00:00
|
|
|
cflags_os_macos += '-xobjective-c'
|
2021-03-08 05:03:35 +00:00
|
|
|
lflags += '-Wl,-rpath,@executable_path'
|
|
|
|
lflags += '-lobjc'
|
2022-03-11 23:44:39 +00:00
|
|
|
lflags += '-framework AVFoundation'
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
if target == 'linux' then
|
|
|
|
cflags += '-D_POSIX_C_SOURCE=200809L'
|
2021-07-19 04:01:17 +00:00
|
|
|
cflags += '-D_DEFAULT_SOURCE'
|
2021-03-08 05:03:35 +00:00
|
|
|
lflags += '-lm -lpthread -ldl'
|
|
|
|
lflags += '-Wl,-rpath,\\$ORIGIN'
|
2024-06-06 16:52:44 +00:00
|
|
|
if config.glfw then
|
|
|
|
lflags += '-lX11 -lxcb -lX11-xcb'
|
|
|
|
else
|
|
|
|
lflags += '-lxcb -lxcb-xinput -lxcb-xkb -lxkbcommon -lxkbcommon-x11'
|
|
|
|
end
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
if target == 'wasm' then
|
2022-12-03 07:13:48 +00:00
|
|
|
cc = 'emcc'
|
|
|
|
cxx = 'em++'
|
2022-04-20 05:43:05 +00:00
|
|
|
cflags += '-std=gnu11'
|
2021-03-08 05:03:35 +00:00
|
|
|
cflags += '-D_POSIX_C_SOURCE=200809L'
|
|
|
|
lflags += '-s FORCE_FILESYSTEM'
|
2022-04-22 00:48:40 +00:00
|
|
|
exported_functions = { '_main', '_lovrDestroy' }
|
2021-03-08 05:03:35 +00:00
|
|
|
if config.headsets.webxr then
|
2022-04-22 00:48:40 +00:00
|
|
|
exported_functions += { '_webxr_attach', '_webxr_detach' }
|
2022-03-30 19:13:53 +00:00
|
|
|
lflags += '--js-library etc/webxr.js'
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
2022-03-30 19:13:53 +00:00
|
|
|
lflags += '--shell-file etc/lovr.html'
|
2022-04-22 00:48:40 +00:00
|
|
|
lflags += '-s EXPORTED_FUNCTIONS=' .. table.concat(exported_functions, ',')
|
2022-04-01 22:58:13 +00:00
|
|
|
extras += { 'bin/lovr.js', 'bin/lovr.wasm' }
|
2022-04-22 01:08:11 +00:00
|
|
|
if config.renderers.webgpu then
|
|
|
|
lflags += '-s USE_WEBGPU=1'
|
|
|
|
end
|
2021-03-08 05:03:35 +00:00
|
|
|
if config.modules.thread then
|
|
|
|
cflags += '-s USE_PTHREADS=1'
|
|
|
|
lflags += '-s USE_PTHREADS=1'
|
2022-04-01 22:58:13 +00:00
|
|
|
extras += 'bin/lovr.worker.js'
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if target == 'android' then
|
2022-03-22 22:47:18 +00:00
|
|
|
assert(config.headsets.openxr, 'You probably want to enable OpenXR')
|
2021-03-08 05:03:35 +00:00
|
|
|
hosts = { win32 = 'windows-x86_64', macos = 'darwin-x86_64', linux = 'linux-x86_64' }
|
2022-10-21 04:28:54 +00:00
|
|
|
cc = ('%s/toolchains/llvm/prebuilt/%s/bin/clang'):format(config.android.ndk, hosts[host])
|
|
|
|
cxx = cc .. '++'
|
2022-04-01 22:58:13 +00:00
|
|
|
flags += '--target=aarch64-linux-android' .. config.android.version
|
|
|
|
flags += config.debug and '-funwind-tables' or ''
|
2021-03-08 05:03:35 +00:00
|
|
|
cflags += '-D_POSIX_C_SOURCE=200809L'
|
2022-04-01 22:58:13 +00:00
|
|
|
cflags += ('-I%s/sources/android/native_app_glue'):format(config.android.ndk)
|
2023-02-06 06:02:04 +00:00
|
|
|
cflags += '-DLOVR_JAVA_PACKAGE=' .. config.android.package:gsub('%.', '_')
|
2022-04-19 02:30:58 +00:00
|
|
|
lflags += '-shared -landroid'
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
2022-04-01 23:05:16 +00:00
|
|
|
troublemakers = {
|
2021-03-08 05:03:35 +00:00
|
|
|
os_android = '-Wno-format-pedantic',
|
2022-04-20 05:45:17 +00:00
|
|
|
miniaudio = '-Wno-unused-function -Wno-pedantic',
|
2021-03-08 05:03:35 +00:00
|
|
|
}
|
|
|
|
|
2022-04-01 23:05:16 +00:00
|
|
|
for file, flags in pairs(troublemakers) do
|
|
|
|
_G['cflags_' .. file] = flags
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
---> deps
|
|
|
|
|
|
|
|
local function lib(name)
|
|
|
|
return (target == 'win32' and '$(bin)/%s.dll' or '$(bin)/lib%s.so'):format(name)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function copy(from, to)
|
|
|
|
tup.rule(from, '^ CP %b^ cp %f %o', to)
|
|
|
|
end
|
|
|
|
|
|
|
|
if config.luajit then
|
|
|
|
if type(config.luajit) ~= 'string' then
|
|
|
|
error('Sorry, building LuaJIT is not supported yet. However, you can set config.luajit to a path to a folder containing the LuaJIT library.')
|
|
|
|
end
|
|
|
|
cflags += '-Ideps/luajit/src'
|
|
|
|
lflags += '-L' .. config.luajit
|
2024-02-20 17:35:39 +00:00
|
|
|
lflags += '-lluajit-5.1'
|
2021-03-08 05:03:35 +00:00
|
|
|
else
|
|
|
|
cflags += '-Ideps/lua'
|
|
|
|
lflags += '-llua'
|
|
|
|
lua_cflags += '-fPIC'
|
|
|
|
lua_cflags += '-Wno-empty-body'
|
|
|
|
lua_lflags += '-shared'
|
|
|
|
lua_lflags += '-lm'
|
|
|
|
lua_src = {
|
|
|
|
'lapi.c', 'lauxlib.c', 'lbaselib.c', 'lcode.c', 'ldblib.c', 'ldebug.c', 'ldo.c', 'ldump.c',
|
|
|
|
'lfunc.c', 'lgc.c', 'linit.c', 'liolib.c', 'llex.c', 'lmathlib.c', 'lmem.c', 'loadlib.c',
|
|
|
|
'lobject.c', 'lopcodes.c', 'loslib.c', 'lparser.c', 'lstate.c', 'lstring.c', 'lstrlib.c',
|
|
|
|
'ltable.c', 'ltablib.c', 'ltm.c', 'lundump.c', 'lvm.c', 'lzio.c'
|
|
|
|
}
|
2022-04-06 16:22:50 +00:00
|
|
|
lua_cflags += ({ linux = '-DLUA_USE_LINUX', android = '-DLUA_USE_LINUX', macos = '-DLUA_USE_MACOSX' })[target] or ''
|
2021-03-08 05:03:35 +00:00
|
|
|
for i = 1, #lua_src do lua_src[i] = 'deps/lua/' .. lua_src[i] end
|
2022-04-01 22:58:13 +00:00
|
|
|
tup.foreach_rule(lua_src, '^ CC lua/%b^ $(cc) $(flags) $(lua_cflags) -c %f -o %o', '.obj/lua/%B.o')
|
|
|
|
tup.rule('.obj/lua/*.o', '^ LD %o^ $(cc) $(flags) -o %o %f $(lua_lflags)', lib('lua'))
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
2024-06-06 16:52:44 +00:00
|
|
|
if config.glfw and (target == 'win32' or target == 'macos' or target == 'linux') then
|
2021-03-08 05:03:35 +00:00
|
|
|
cflags += '-Ideps/glfw/include'
|
2022-12-04 23:03:19 +00:00
|
|
|
cflags += '-DLOVR_USE_GLFW'
|
2021-03-08 05:03:35 +00:00
|
|
|
lflags += '-lglfw'
|
|
|
|
|
|
|
|
glfw_cflags += '-fPIC'
|
|
|
|
glfw_cflags += ({ win32 = '-D_GLFW_WIN32', macos = '-D_GLFW_COCOA', linux = '-D_GLFW_X11' })[target]
|
|
|
|
glfw_src += { 'init.c', 'context.c', 'input.c', 'monitor.c', 'vulkan.c', 'window.c' }
|
|
|
|
glfw_src += ({
|
|
|
|
win32 = { 'win32*.c', 'wgl*.c', 'egl*.c', 'osmesa*.c' },
|
2022-03-11 23:44:39 +00:00
|
|
|
macos = { 'cocoa*.c', 'cocoa*.m', 'posix_thread.c', 'egl*.c', 'nsgl*.m', 'osmesa*.c' },
|
2021-03-08 05:03:35 +00:00
|
|
|
linux = { 'x11*.c', 'xkb*.c', 'posix*.c', 'glx*.c', 'egl*.c', 'linux*.c', 'osmesa*.c' }
|
|
|
|
})[target]
|
|
|
|
for i = 1, #glfw_src do glfw_src[i] = 'deps/glfw/src/' .. glfw_src[i] end
|
|
|
|
glfw_lflags += '-shared'
|
|
|
|
glfw_lflags += target == 'win32' and '-lgdi32' or ''
|
2022-03-11 23:44:39 +00:00
|
|
|
glfw_lflags += target == 'macos' and '-lobjc -framework Cocoa -framework IOKit -framework CoreFoundation' or ''
|
2022-04-01 22:58:13 +00:00
|
|
|
tup.foreach_rule(glfw_src, '^ CC glfw/%b^ $(cc) $(flags) $(glfw_cflags) -c %f -o %o', '.obj/glfw/%B.o')
|
|
|
|
tup.rule('.obj/glfw/*.o', '^ LD %o^ $(cc) $(flags) -o %o %f $(glfw_lflags)', lib('glfw'))
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
2022-05-08 21:06:18 +00:00
|
|
|
if config.modules.graphics and config.glslang then
|
|
|
|
cflags_graphics += '-Ideps/glslang/glslang/Include'
|
2023-04-20 03:49:30 +00:00
|
|
|
cflags_graphics += '-Ideps/glslang/glslang/Public'
|
2022-05-08 21:06:18 +00:00
|
|
|
cflags += '-DLOVR_USE_GLSLANG'
|
|
|
|
lflags += '-lglslang'
|
|
|
|
|
|
|
|
glslang_cflags += '-fPIC'
|
2023-09-29 05:03:08 +00:00
|
|
|
glslang_cflags += '-std=c++17'
|
2022-05-08 21:06:18 +00:00
|
|
|
glslang_cflags += '-fno-exceptions'
|
|
|
|
glslang_cflags += '-fno-rtti'
|
|
|
|
glslang_cflags += '-Ideps/glslang'
|
2024-05-27 09:33:58 +00:00
|
|
|
glslang_cflags += '-I.obj'
|
2022-05-08 21:06:18 +00:00
|
|
|
glslang_lflags += '-shared'
|
|
|
|
glslang_src += 'deps/glslang/glslang/CInterface/*.cpp'
|
|
|
|
glslang_src += 'deps/glslang/glslang/MachineIndependent/*.cpp'
|
|
|
|
glslang_src += 'deps/glslang/glslang/MachineIndependent/preprocessor/*.cpp'
|
|
|
|
glslang_src += ('deps/glslang/glslang/OSDependent/%s/ossource.cpp'):format(target == 'win32' and 'Windows' or 'Unix')
|
|
|
|
glslang_src += 'deps/glslang/glslang/GenericCodeGen/*.cpp'
|
|
|
|
glslang_src += 'deps/glslang/SPIRV/GlslangToSpv.cpp'
|
|
|
|
glslang_src += 'deps/glslang/SPIRV/Logger.cpp'
|
|
|
|
glslang_src += 'deps/glslang/SPIRV/SpvTools.cpp'
|
|
|
|
glslang_src += 'deps/glslang/SPIRV/SpvBuilder.cpp'
|
|
|
|
glslang_src += 'deps/glslang/SPIRV/SpvPostProcess.cpp'
|
|
|
|
glslang_src += 'deps/glslang/SPIRV/InReadableOrder.cpp'
|
|
|
|
glslang_src += 'deps/glslang/SPIRV/CInterface/spirv_c_interface.cpp'
|
2023-04-20 03:49:30 +00:00
|
|
|
glslang_src += 'deps/glslang/glslang/ResourceLimits/resource_limits_c.cpp'
|
|
|
|
glslang_src += 'deps/glslang/glslang/ResourceLimits/ResourceLimits.cpp'
|
2024-05-19 09:01:14 +00:00
|
|
|
glslang_src.extra_inputs = '.obj/glslang/build_info.h'
|
2022-05-08 21:06:18 +00:00
|
|
|
|
2024-05-19 09:01:14 +00:00
|
|
|
tup.rule('deps/glslang/build_info.h.tmpl', 'python3 deps/glslang/build_info.py deps/glslang -i %f -o %o', '.obj/glslang/build_info.h')
|
2022-05-08 21:06:18 +00:00
|
|
|
tup.foreach_rule(glslang_src, '^ CC glslang/%b^ $(cc) $(flags) $(glslang_cflags) -c %f -o %o', '.obj/glslang/%B.o')
|
|
|
|
tup.rule('.obj/glslang/*.o', '^ LD %o^ $(cxx) $(flags) -o %o %f $(glslang_lflags)', lib('glslang'))
|
|
|
|
end
|
|
|
|
|
2021-03-08 05:03:35 +00:00
|
|
|
if config.modules.data then
|
|
|
|
cflags_rasterizer += '-Ideps/msdfgen'
|
2023-10-03 18:17:06 +00:00
|
|
|
cflags_rasterizer += '-DMSDFGEN_PUBLIC='
|
2021-03-08 05:03:35 +00:00
|
|
|
lflags += '-lmsdfgen'
|
|
|
|
|
|
|
|
msdfgen_cflags += '-fPIC'
|
2023-10-03 18:17:06 +00:00
|
|
|
msdfgen_cflags += target == 'win32' and '-DMSDFGEN_PUBLIC=__declspec(dllexport)' or '-DMSDFGEN_PUBLIC='
|
2021-03-08 05:03:35 +00:00
|
|
|
msdfgen_src += 'deps/msdfgen/core/*.cpp'
|
2022-04-01 22:58:13 +00:00
|
|
|
tup.foreach_rule(msdfgen_src, '^ CC msdfgen/%b^ $(cxx) $(flags) $(msdfgen_cflags) -c %f -o %o', '.obj/msdfgen/%B.o')
|
2023-07-01 22:09:35 +00:00
|
|
|
tup.rule('.obj/msdfgen/*.o', '^ LD %o^ $(cxx) $(flags) -shared -o %o %f', lib('msdfgen'))
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
if config.modules.physics then
|
2024-05-19 01:27:15 +00:00
|
|
|
error('Compiling Jolt is not supported yet')
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
if config.headsets.openxr then
|
|
|
|
if target == 'android' then
|
2022-03-16 22:43:07 +00:00
|
|
|
cflags_headset_openxr += '-Ideps/openxr/include'
|
|
|
|
lflags += '-lopenxr_loader'
|
2022-03-21 10:10:13 +00:00
|
|
|
copy('deps/oculus-openxr/Libs/Android/arm64-v8a/Release/libopenxr_loader.so', '$(bin)/%b')
|
2021-03-08 05:03:35 +00:00
|
|
|
else
|
|
|
|
if type(config.headsets.openxr) ~= 'string' then
|
|
|
|
error('Sorry, building OpenXR is not supported yet. However, you can set config.headsets.openxr to a path to a folder containing the OpenXR library.')
|
|
|
|
end
|
2021-04-08 22:25:11 +00:00
|
|
|
cflags_headset_openxr += '-Ideps/openxr/include'
|
2021-03-08 05:03:35 +00:00
|
|
|
lflags += '-L' .. config.headsets.openxr
|
|
|
|
lflags += '-lopenxr_loader'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if config.spatializers.oculus then
|
2021-04-08 22:25:11 +00:00
|
|
|
cflags_headset_oculus += '-Ideps/AudioSDK/Include'
|
2021-03-08 05:03:35 +00:00
|
|
|
ovraudio_libs = {
|
|
|
|
win32 = 'deps/AudioSDK/Lib/x64/ovraudio64.dll',
|
|
|
|
linux = 'deps/AudioSDK/Lib/Linux64/libovraudio64.so',
|
|
|
|
android = 'deps/AudioSDK/Lib/Android/arm64-v8a/libovraudio64.so'
|
|
|
|
}
|
|
|
|
assert(ovraudio_libs[target], 'Oculus Audio is not supported on this target')
|
|
|
|
copy(ovraudio_libs[target], '$(bin)/%b')
|
|
|
|
end
|
|
|
|
|
|
|
|
if config.spatializers.phonon then
|
2021-04-08 22:25:11 +00:00
|
|
|
cflags_spatializer_phonon += '-Ideps/phonon/include'
|
2021-03-08 05:03:35 +00:00
|
|
|
phonon_libs = {
|
|
|
|
win32 = 'deps/phonon/bin/Windows/x64/phonon.dll',
|
|
|
|
macos = 'deps/phonon/lib/OSX/libphonon.dylib',
|
|
|
|
linux = 'deps/phonon/lib/Linux/x64/libphonon.so',
|
|
|
|
android = 'deps/phonon/lib/Android/arm64/libphonon.so'
|
|
|
|
}
|
|
|
|
assert(phonon_libs[target], 'Phonon is not supported on this target')
|
|
|
|
copy(phonon_libs[target], '$(bin)/%b')
|
|
|
|
end
|
|
|
|
|
|
|
|
---> lovr
|
|
|
|
|
|
|
|
src = {
|
|
|
|
'src/main.c',
|
2022-03-22 07:13:21 +00:00
|
|
|
'src/util.c',
|
2021-03-08 05:03:35 +00:00
|
|
|
'src/core/fs.c',
|
2022-04-01 22:58:13 +00:00
|
|
|
('src/core/os_%s.c'):format(target),
|
2022-05-22 22:02:42 +00:00
|
|
|
'src/core/spv.c',
|
2021-03-08 05:03:35 +00:00
|
|
|
'src/api/api.c',
|
|
|
|
'src/api/l_lovr.c'
|
|
|
|
}
|
|
|
|
|
|
|
|
for module, enabled in pairs(config.modules) do
|
|
|
|
if enabled then
|
2024-02-20 17:35:16 +00:00
|
|
|
override = {
|
|
|
|
audio = 'src/modules/audio/audio.c',
|
2024-05-19 01:27:15 +00:00
|
|
|
headset = 'src/modules/headset/headset.c'
|
2024-02-20 17:35:16 +00:00
|
|
|
}
|
2022-04-01 22:58:13 +00:00
|
|
|
src += override[module] or ('src/modules/%s/*.c'):format(module)
|
|
|
|
src += ('src/api/l_%s*.c'):format(module)
|
2021-03-08 05:03:35 +00:00
|
|
|
else
|
|
|
|
cflags += '-DLOVR_DISABLE_' .. module:upper()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
for headset, enabled in pairs(config.headsets) do
|
|
|
|
if enabled then
|
|
|
|
cflags += '-DLOVR_USE_' .. headset:upper()
|
2022-04-01 22:58:13 +00:00
|
|
|
src += ('src/modules/headset/headset_%s.c'):format(headset)
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-04-21 07:27:13 +00:00
|
|
|
for renderer, enabled in pairs(config.renderers) do
|
|
|
|
if enabled then
|
2023-07-09 20:12:01 +00:00
|
|
|
cflags += '-DLOVR_' .. ({ vulkan = 'VK', webgpu = 'WEBGPU' })[renderer]
|
|
|
|
src += 'src/core/gpu_' .. ({ vulkan = 'vk', webgpu = 'web' })[renderer] .. '.c'
|
2022-04-21 07:27:13 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-03-08 05:03:35 +00:00
|
|
|
for spatializer, enabled in pairs(config.spatializers) do
|
|
|
|
if enabled then
|
2022-04-01 22:58:13 +00:00
|
|
|
cflags += ('-DLOVR_ENABLE_%s_SPATIALIZER'):format(spatializer:upper())
|
|
|
|
src += ('src/modules/audio/spatializer_%s.c'):format(spatializer)
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-05-11 07:16:18 +00:00
|
|
|
if config.utf8 then
|
|
|
|
src += 'src/lib/lua/lutf8lib.c'
|
|
|
|
else
|
|
|
|
cflags += '-DLOVR_DISABLE_UTF8'
|
|
|
|
end
|
|
|
|
|
2021-03-08 05:03:35 +00:00
|
|
|
src += 'src/lib/stb/*.c'
|
2023-11-17 00:33:15 +00:00
|
|
|
src += 'src/lib/miniz/*.c'
|
2021-03-08 05:03:35 +00:00
|
|
|
src += (config.modules.audio or config.modules.data) and 'src/lib/miniaudio/*.c' or nil
|
|
|
|
src += config.modules.data and 'src/lib/jsmn/*.c' or nil
|
|
|
|
src += config.modules.data and 'src/lib/minimp3/*.c' or nil
|
2023-12-03 03:57:58 +00:00
|
|
|
src += config.modules.filesystem and 'src/lib/dmon/*.c' or nil
|
2022-03-26 22:25:40 +00:00
|
|
|
src += config.modules.math and 'src/lib/noise/*.c' or nil
|
2023-11-30 04:19:43 +00:00
|
|
|
src += config.modules.thread and 'src/core/job.c' or nil
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
-- embed resource files with xxd
|
|
|
|
|
2023-11-18 07:58:48 +00:00
|
|
|
res = { 'etc/boot.lua', 'etc/*.ttf', 'etc/shaders/*.glsl' }
|
2022-04-01 22:58:13 +00:00
|
|
|
tup.foreach_rule(res, '^ XD %b^ xxd -i %f > %o', '%f.h')
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
for i, pattern in ipairs(res) do
|
|
|
|
src.extra_inputs += pattern .. '.h'
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|
|
|
|
|
2022-05-28 03:47:07 +00:00
|
|
|
-- shaders
|
|
|
|
|
|
|
|
vert = 'etc/shaders/*.vert'
|
|
|
|
frag = 'etc/shaders/*.frag'
|
|
|
|
comp = 'etc/shaders/*.comp'
|
|
|
|
|
2024-02-21 00:02:16 +00:00
|
|
|
glslang_flags += '--quiet'
|
|
|
|
glslang_flags += config.debug and '-gVS' or ''
|
|
|
|
glslang_flags += '--target-env vulkan1.1'
|
|
|
|
|
2022-05-28 03:47:07 +00:00
|
|
|
function compileShaders(stage)
|
|
|
|
pattern = 'etc/shaders/*.' .. stage
|
2024-01-21 05:47:27 +00:00
|
|
|
tup.foreach_rule(pattern, 'glslangValidator $(glslang_flags) --vn lovr_shader_%B_' .. stage .. ' -o %o %f', '%f.h')
|
2022-05-28 03:47:07 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
compileShaders('vert')
|
|
|
|
compileShaders('frag')
|
|
|
|
compileShaders('comp')
|
|
|
|
src.extra_inputs += 'etc/shaders/*.h'
|
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
-- compile
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
tup.foreach_rule(src, '^ CC %b^ $(cc) $(flags) $(cflags) $(cflags_%B) -o %o -c %f', '.obj/%B.o')
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
-- link final output
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
outputs = {
|
2021-03-08 05:03:35 +00:00
|
|
|
win32 = '$(bin)/lovr.exe',
|
|
|
|
macos = '$(bin)/lovr',
|
|
|
|
linux = '$(bin)/lovr',
|
|
|
|
android = '$(bin)/liblovr.so',
|
|
|
|
wasm = '$(bin)/lovr.html'
|
2022-04-01 22:58:13 +00:00
|
|
|
}
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-04-01 22:58:13 +00:00
|
|
|
obj = { '.obj/*.o', extra_inputs = lib('*') }
|
|
|
|
output = { outputs[target], extra_outputs = extras }
|
|
|
|
tup.rule(obj, '^ LD %o^ $(cc) $(flags) -o %o %f $(lflags)', output)
|
2021-03-08 05:03:35 +00:00
|
|
|
|
|
|
|
---> apk
|
|
|
|
|
|
|
|
if target == 'android' then
|
2021-10-28 21:35:05 +00:00
|
|
|
for _, key in pairs({ 'manifest', 'package', 'project' }) do
|
|
|
|
local value = tup.getconfig('ANDROID_' .. key:upper())
|
|
|
|
config.android[key] = #value > 0 and value or config.android[key]
|
|
|
|
end
|
|
|
|
|
2021-07-19 06:58:25 +00:00
|
|
|
java = 'bin/Activity.java'
|
2023-02-06 06:02:04 +00:00
|
|
|
class = config.android.package:gsub('%.', '/') .. '/Activity.class'
|
2021-03-08 05:03:35 +00:00
|
|
|
binclass = 'bin/' .. class
|
|
|
|
jar = 'bin/lovr.jar'
|
|
|
|
dex = 'bin/apk/classes.dex'
|
2022-03-22 22:47:18 +00:00
|
|
|
unaligned = 'bin/.lovr.apk.unaligned'
|
|
|
|
unsigned = 'bin/.lovr.apk.unsigned'
|
|
|
|
apk = 'bin/lovr.apk'
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-11-09 08:21:49 +00:00
|
|
|
manifest = config.android.manifest or 'etc/AndroidManifest.xml'
|
2023-02-06 06:02:04 +00:00
|
|
|
package = '--rename-manifest-package ' .. config.android.package
|
2022-03-24 01:27:05 +00:00
|
|
|
project = config.android.project and #config.android.project > 0 and ('-A ' .. config.android.project) or ''
|
2021-03-08 05:03:35 +00:00
|
|
|
|
2022-03-22 22:47:18 +00:00
|
|
|
version = config.android.version
|
2021-03-08 05:03:35 +00:00
|
|
|
ks = config.android.keystore
|
|
|
|
kspass = config.android.keystorepass
|
2022-03-22 22:47:18 +00:00
|
|
|
androidjar = ('%s/platforms/android-%d/android.jar'):format(config.android.sdk, version)
|
|
|
|
tools = config.android.sdk .. '/build-tools/' .. config.android.buildtools
|
2021-03-08 05:03:35 +00:00
|
|
|
|
|
|
|
copy(manifest, 'bin/AndroidManifest.xml')
|
2023-02-06 06:02:04 +00:00
|
|
|
tup.rule('etc/Activity.java', 'tup varsed %f %o', java)
|
2022-03-22 22:47:18 +00:00
|
|
|
tup.rule(java, '^ JAVAC %b^ javac -classpath $(androidjar) -d bin %f', binclass)
|
2021-03-08 05:03:35 +00:00
|
|
|
tup.rule(binclass, '^ JAR %b^ jar -cf %o -C bin $(class)', jar)
|
2022-03-22 22:47:18 +00:00
|
|
|
tup.rule(jar, '^ D8 %b^ $(tools)/d8 --min-api $(version) --output bin/apk %f', dex)
|
2021-03-08 05:03:35 +00:00
|
|
|
tup.rule(
|
|
|
|
{ 'bin/AndroidManifest.xml', extra_inputs = { lib('*'), dex } },
|
|
|
|
'^ AAPT %b^ $(tools)/aapt package $(package) -F %o -M %f -0 so -I $(androidjar) $(project) bin/apk',
|
|
|
|
unaligned
|
|
|
|
)
|
|
|
|
tup.rule(unaligned, '^ ZIPALIGN %f^ $(tools)/zipalign -f -p 4 %f %o', unsigned)
|
2021-04-08 22:25:11 +00:00
|
|
|
tup.rule(unsigned, '^ APKSIGNER %o^ $(tools)/apksigner sign --ks $(ks) --ks-pass $(kspass) --out %o %f', { apk, extra_outputs = 'bin/lovr.apk.idsig' })
|
2021-03-08 05:03:35 +00:00
|
|
|
end
|