diff --git a/Tupfile b/Tupfile deleted file mode 100644 index 550fe395..00000000 --- a/Tupfile +++ /dev/null @@ -1,98 +0,0 @@ -include_rules - -# core -ifneq (@(PICO),y) -SRC += src/main.c -SRC += src/core/os_$(PLATFORM).c -endif -SRC += src/core/util.c -SRC += src/core/fs.c -SRC += src/core/map.c -SRC += src/core/zip.c - -# modules -SRC_@(AUDIO) += src/modules/audio/audio.c -SRC_@(AUDIO) += src/modules/audio/spatializer_simple.c -SRC_@(AUDIO)@(STEAM_AUDIO) += src/modules/audio/spatializer_phonon.c -SRC_@(AUDIO)@(OCULUS_AUDIO) += src/modules/audio/spatializer_oculus.c -SRC_@(DATA) += src/modules/data/*.c -SRC_@(EVENT) += src/modules/event/*.c -SRC_@(FILESYSTEM) += src/modules/filesystem/*.c -SRC_@(GRAPHICS) += src/modules/graphics/*.c -SRC_@(HEADSET) += src/modules/headset/headset.c -SRC_@(HEADSET)@(SIMULATOR) += src/modules/headset/headset_desktop.c -SRC_@(HEADSET)@(OPENVR) += src/modules/headset/headset_openvr.c -SRC_@(HEADSET)@(OPENXR) += src/modules/headset/headset_openxr.c -SRC_@(HEADSET)@(OCULUS) += src/modules/headset/headset_oculus.c -SRC_@(HEADSET)@(VRAPI) += src/modules/headset/headset_vrapi.c -SRC_@(HEADSET)@(PICO) += src/modules/headset/headset_pico.c -SRC_@(HEADSET)@(WEBXR) += src/modules/headset/headset_webxr.c -SRC_@(MATH) += src/modules/math/*.c -SRC_@(PHYSICS) += src/modules/physics/*.c -SRC_@(SYSTEM) += src/modules/system/*.c -SRC_@(THREAD) += src/modules/thread/*.c -SRC_@(TIMER) += src/modules/timer/*.c - -# lib -SRC += src/lib/stb/*.c -SRC_@(DATA) += src/lib/jsmn/jsmn.c -SRC_@(DATA) += src/lib/minimp3/minimp3.c -SRC_@(GRAPHICS) += src/lib/glad/glad.c -SRC_@(AUDIO)@(DATA) += src/lib/miniaudio/miniaudio.c -SRC_@(MATH) += src/lib/noise1234/noise1234.c -SRC_@(THREAD) += src/lib/tinycthread/tinycthread.c - -# api -SRC += src/api/api.c -SRC += src/api/l_lovr.c -SRC_@(AUDIO) += src/api/l_audio*.c -SRC_@(DATA) += src/api/l_data*.c -SRC_@(EVENT) += src/api/l_event*.c -SRC_@(FILESYSTEM) += src/api/l_filesystem*.c -SRC_@(GRAPHICS) += src/api/l_graphics*.c -SRC_@(HEADSET) += src/api/l_headset*.c -SRC_@(MATH) += src/api/l_math*.c -SRC_@(PHYSICS) += src/api/l_physics*.c -SRC_@(SYSTEM) += src/api/l_system*.c -SRC_@(THREAD) += src/api/l_thread*.c -SRC_@(TIMER) += src/api/l_timer*.c - -# resources -RES += src/resources/boot.lua -RES += src/resources/VarelaRound.ttf -RES_@(OPENVR) += src/resources/*.json -SRC_@(GRAPHICS) += src/resources/shaders.c - -## build: -# 1 [XD] resources -> bin headers -# 2 [CC] compile .c -> .o -# 3 [LD] link .o -> exe -# 4 [CP] copy external libs -> libs folder -: foreach $(RES) $(RES_y) |> !xd |> %f.h -: foreach $(SRC) $(SRC_y) $(SRC_yy) | src/resources/*.h |> !cc |> .obj/%B.o {obj} -: {obj} |> !ld |> bin/$(PREFIX)lovr$(SUFFIX) | $(EXTRAS) $(EXTRAS_y) -: foreach $(LIBS) |> !cp |> $(LIB)/%b - -# APK -ifeq ($(PLATFORM),android) - JAVA = src/resources/Activity.java - CLASS = org/lovr/app/Activity.class - JAR = bin/lovr.jar - DEX = bin/apk/classes.dex - MANIFEST = bin/AndroidManifest.xml - - : src/resources/$(ACTIVITY_y).java |> !cp |> $(JAVA) - : $(ANDROID_MANIFEST_y) |> !cp |> $(MANIFEST) - - # java -> class -> jar -> dex - : $(JAVA) |> ^ JAVAC %b^ javac -classpath $(CLASSPATH) -d bin %f |> bin/$(CLASS) - : bin/$(CLASS) |> ^ JAR %b^ jar -cf %o -C bin $(CLASS) |> $(JAR) - : $(JAR) $(EXTRA_JARS) |> !dx |> $(DEX) - - # aapt - : $(MANIFEST) | $(LIB)/*.so $(DEX) |> ^ AAPT %b^ aapt package $(PACKAGE_RENAME) -F %o -M %f -0 so -I $(ANDROID_JAR) $(ANDROID_ASSETS) bin/apk |> bin/.lovr.unaligned.apk - - # align n sign - : bin/.lovr.unaligned.apk |> !zipalign |> bin/.lovr.unsigned.apk - : bin/.lovr.unsigned.apk |> !apksigner |> bin/lovr.apk | bin/lovr.apk.idsig -endif diff --git a/Tupfile.lua b/Tupfile.lua new file mode 100644 index 00000000..0696cd0c --- /dev/null +++ b/Tupfile.lua @@ -0,0 +1,487 @@ +config = { + target = nil, + debug = true, + optimize = false, + supercharge = false, + sanitize = false, + strict = false, + luajit = false, + modules = { + audio = true, + data = true, + event = true, + filesystem = true, + graphics = true, + headset = true, + math = true, + physics = true, + system = true, + thread = true, + timer = true + }, + headsets = { + desktop = true, + openvr = false, + openxr = false, + oculus = false, + vrapi = false, + pico = false, + webxr = false + }, + spatializers = { + simple = true, + oculus = false, + phonon = false + }, + android = { + sdk = nil, + ndk = nil, + version = nil, + buildtoolsversion = nil, + keystore = nil, + keystorepass = nil, + manifest = nil, + package = nil, + project = nil + } +} + +---> setup + +target = config.target or tup.getconfig('TUP_PLATFORM') +if target == 'macosx' then target = 'macos' end + +cc = 'clang' +cxx = 'clang++' + +cflags = { + '-std=c99', + '-pedantic', + '-Wall', + '-Wextra', + config.strict and '-Werror' or '', + '-Wno-unused-parameter', + '-fvisibility=hidden', + '-Isrc', + '-Isrc/modules', + '-Isrc/lib/stdatomic', +} + +bin = target == 'android' and 'bin/apk/lib/arm64-v8a' or 'bin' +lflags = '-L' .. bin + +base_flags = { + config.debug and '-g' or '', + config.optimize and '-Os' or '', + config.supercharge and '-flto' or '', + config.sanitize and '-fsanitize=address,undefined' or '', +} + +if target == 'win32' then + cflags += '-DLOVR_GL' + 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 + extra_outputs += { 'bin/lovr.lib', 'bin/lovr.exp' } + if config.debug then + extra_outputs += { 'bin/lovr.pdb', 'bin/lovr.ilk' } + end + end +end + +if target == 'macos' then + cflags += '-DLOVR_GL' + lflags += '-Wl,-rpath,@executable_path' + lflags += '-lobjc' +end + +if target == 'linux' then + cflags += '-DLOVR_GL' + cflags += '-D_POSIX_C_SOURCE=200809L' + lflags += '-lm -lpthread -ldl' + lflags += '-Wl,-rpath,\\$ORIGIN' +end + +if target == 'wasm' then + cc = 'emcc' + cxx = 'em++' + cflags += '-DLOVR_WEBGL' + cflags += '-D_POSIX_C_SOURCE=200809L' + lflags += '-s USE_WEBGL2' + lflags += '-s FORCE_FILESYSTEM' + lflags += ([[-s EXPORTED_FUNCTIONS="[ + '_main','_lovrDestroy','_webxr_attach','_webxr_detach','_lovrCanvasCreateFromHandle', + '_lovrCanvasDestroy','_lovrGraphicsSetBackbuffer','_lovrGraphicsSetViewMatrix', + '_lovrGraphicsSetProjection' + ]"]]):gsub('\n', '') + if config.headsets.webxr then + lflags += '--js-library src/resources/webxr.js' + end + lflags += '--shell-file src/resources/lovr.html' + extra_outputs += { 'bin/lovr.js', 'bin/lovr.wasm' } + if config.modules.thread then + cflags += '-s USE_PTHREADS=1' + lflags += '-s USE_PTHREADS=1' + extra_outputs += 'bin/lovr.worker.js' + end +end + +if target == 'android' then + assert(config.headsets.vrapi or config.headsets.pico or config.headsets.openxr, 'Please enable vrapi, pico, or openxr') + hosts = { win32 = 'windows-x86_64', macos = 'darwin-x86_64', linux = 'linux-x86_64' } + host = hosts[tup.getconfig('TUP_PLATFORM')] + cc = ('%s/toolchains/llvm/prebuilt/%s/bin/clang'):format(config.android.ndk, host) + cxx = cc .. '++' + base_flags += '--target=aarch64-linux-android' .. config.android.version + cflags += '-DLOVR_GLES' + cflags += '-D_POSIX_C_SOURCE=200809L' + cflags += '-I' .. config.android.ndk .. '/sources/android/native_app_glue' + lflags += '-shared -landroid -lEGL -lGLESv3' +end + +overrides = { + glad = '-Wno-pedantic', + os_android = '-Wno-format-pedantic', + openvr = '-Wno-unused-variable -Wno-typedef-redefinition -Wno-pedantic', + vrapi = '-Wno-c11-extensions -Wno-gnu-empty-initializer -Wno-pedantic', + miniaudio = '-Wno-unused-function', +} + +for file, override in pairs(overrides) do + _G['cflags_' .. file] = override +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 + lflags += '-lluajit' +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' + } + for i = 1, #lua_src do lua_src[i] = 'deps/lua/' .. lua_src[i] end + tup.foreach_rule(lua_src, '^ CC lua/%b^ $(cc) $(base_flags) $(lua_cflags) -c %f -o %o', '.obj/lua/%B.o') + tup.rule('.obj/lua/*.o', '^ LD %o^ $(cc) $(base_flags) -o %o %f $(lua_lflags)', lib('lua')) +end + +if target == 'win32' or target == 'macos' or target == 'linux' then + cflags += '-Ideps/glfw/include' + 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' }, + macos = { 'cocoa*.c', 'posix*.c' }, + 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 '' + tup.foreach_rule(glfw_src, '^ CC glfw/%b^ $(cc) $(base_flags) $(glfw_cflags) -c %f -o %o', '.obj/glfw/%B.o') + tup.rule('.obj/glfw/*.o', '^ LD %o^ $(cc) $(base_flags) -o %o %f $(glfw_lflags)', lib('glfw')) +end + +if config.modules.data then + cflags_rasterizer += '-Ideps/msdfgen' + lflags += '-lmsdfgen' + + msdfgen_cflags += '-fPIC' + msdfgen_src += 'deps/msdfgen/core/*.cpp' + tup.foreach_rule(msdfgen_src, '^ CC msdfgen/%b^ $(cxx) $(base_flags) $(msdfgen_cflags) -c %f -o %o', '.obj/msdfgen/%B.o') + tup.rule('.obj/msdfgen/*.o', '^ LD %o^ $(cxx) $(base_flags) -shared -o %o %f', lib('msdfgen')) +end + +if config.modules.physics then + cflags += '-Ideps/ode/include' + lflags += '-lode' + + -- ou + ode_cflags += '-DMAC_OS_X_VERSION=1030' + ode_cflags += '-D_OU_NAMESPACE=odeou' + ode_cflags += '-D_OU_FEATURE_SET=_OU_FEATURE_SET_TLS' + ode_cflags += '-DdATOMICS_ENABLED=1' + ode_cflags += '-Ideps/ode/ou/include' + ode_src += 'deps/ode/ou/src/ou/*.cpp' + + -- ccd + ode_cflags += '-Ideps/ode/libccd/src' + ode_cflags += '-Ideps/ode/libccd/src/custom' + ode_cflags += { + '-DdLIBCCD_ENABLED', + '-DdLIBCCD_INTERNAL', + '-DdLIBCCD_BOX_CYL', + '-DdLIBCCD_CYL_CYL', + '-DdLIBCCD_CAP_CYL', + '-DdLIBCCD_CONVEX_BOX', + '-DdLIBCCD_CONVEX_CAP', + '-DdLIBCCD_CONVEX_CYL', + '-DdLIBCCD_CONVEX_SPHERE', + '-DdLIBCCD_CONVEX_CONVEX' + } + ode_c_src += 'deps/ode/libccd/src/*.c' + + -- OPCODE + ode_cflags += '-Ideps/ode/OPCODE' + ode_src += 'deps/ode/OPCODE/*.cpp' + ode_src += 'deps/ode/OPCODE/Ice/*.cpp' + + -- ode + ode_cflags += '-fPIC' + ode_cflags += '-Wno-implicit-float-conversion' + ode_cflags += '-Wno-array-bounds' + ode_cflags += '-Wno-undefined-var-template' + ode_cflags += '-Wno-undefined-bool-conversion' + ode_cflags += '-Wno-unused-value' + ode_cflags += '-Ideps/ode/include' + ode_cflags += '-Ideps/ode/ode/src' + ode_c_src += 'deps/ode/ode/src/*.c' + ode_src += { + 'deps/ode/ode/src/*.cpp', + 'deps/ode/ode/src/joints/*.cpp' + } + + for i = #ode_src, 1, -1 do + if ode_src[i]:match('gimpact') or ode_src[i]:match('dif') then + table.remove(ode_src, i) + end + end + + tup.foreach_rule(ode_c_src, '^ CC ode/%b^ $(cc) $(base_flags) $(ode_cflags) -c %f -o %o', '.obj/ode/%B.o') + tup.foreach_rule(ode_src, '^ CC ode/%b^ $(cxx) $(base_flags) $(ode_cflags) -c %f -o %o', '.obj/ode/%B.o') + tup.rule('.obj/ode/*.o', '^ LD %o^ $(cxx) $(base_flags) -shared -o %o %f', lib('ode')) +end + +if config.headsets.openvr then + cflags_openvr += '-Ideps/openvr/headers' + lflags += '-lopenvr_api' + openvr_libs = { + win32 = 'deps/openvr/bin/win64/openvr_api.dll', + macos = 'deps/openvr/bin/osx32/openvr_api.dll', + linux = 'deps/openvr/bin/linux64/libopenvr_api.so' + } + assert(openvr_libs[target], 'OpenVR is not supported on this target') + copy(openvr_libs[target], '$(bin)/%b') +end + +if config.headsets.openxr then + if target == 'android' then + cflags_openxr += '-Ideps/OpenXR-Oculus/Include' + lflags += 'lopenxr_loader' + copy('deps/OpenXR-Oculus/Libs/Android/arm64-v8a/Release/libopenxr_loader.so', '$(bin)/%b') + 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 + cflags += '-Ideps/openxr/include' + lflags += '-L' .. config.headsets.openxr + lflags += '-lopenxr_loader' + end +end + +if config.headsets.oculus then + assert(target == 'windows', 'LibOVR is not supported on this target') + cflags_oculus += '-Ideps/LibOVR/Include' + copy('deps/LibOVR/LibWindows/x64/Release/VS2017/LibOVR.dll', lib('LibOVR')) +end + +if config.headsets.vrapi then + assert(target == 'android', 'VrApi is not supported on this target') + cflags_vrapi += '-Ideps/VrApi/Include' + lflags += '-lvrapi' + copy('deps/VrApi/Libs/Android/arm64-v8a/Release/libvrapi.so', '$(bin)/%b') +end + +if config.headsets.pico then + assert(target == 'android', 'Pico is not supported on this target') + lflags += '-lPvr_NativeSDK' + copy('deps/pico/jni/arm64-v8a/libPvr_NativeSDK.so', '$(bin)/%b') +end + +if config.spatializers.oculus then + cflags_oculus += '-Ideps/AudioSDK/Include' + 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 + cflags_phonon += '-Ideps/phonon/include' + 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', + 'src/core/os_' .. target .. '.c', + 'src/core/util.c', + 'src/core/fs.c', + 'src/core/map.c', + 'src/core/zip.c', + 'src/api/api.c', + 'src/api/l_lovr.c' +} + +-- TODO rearrange source so that things can be globbed/matched consistently +module_src = { + audio = 'src/modules/audio/audio.c', + data = 'src/modules/data/*.c', + event = 'src/modules/event/*.c', + filesystem = 'src/modules/filesystem/*.c', + graphics = 'src/modules/graphics/*.c', + headset = 'src/modules/headset/headset.c', + math = 'src/modules/math/*.c', + physics = 'src/modules/physics/*.c', + system = 'src/modules/system/*.c', + thread = 'src/modules/thread/*.c', + timer = 'src/modules/timer/*.c' +} + +for module, enabled in pairs(config.modules) do + if enabled then + src += module_src[module] + src += 'src/api/l_' .. module .. '*.c' + else + cflags += '-DLOVR_DISABLE_' .. module:upper() + end +end + +for headset, enabled in pairs(config.headsets) do + if enabled then + cflags += '-DLOVR_USE_' .. headset:upper() + src += 'src/modules/headset/headset_' .. headset .. '.c' + end +end + +for spatializer, enabled in pairs(config.spatializers) do + if enabled then + cflags += '-DLOVR_ENABLE_' .. spatializer:upper() .. '_SPATIALIZER' + src += 'src/modules/audio/spatializer_' .. spatializer .. '.c' + end +end + +src += 'src/lib/stb/*.c' +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 +src += config.modules.graphics and 'src/lib/glad/*.c' or nil +src += config.modules.graphics and 'src/resources/shaders.c' or nil +src += config.modules.math and 'src/lib/noise1234/*.c' or nil +src += config.modules.thread and 'src/lib/tinycthread/*.c' or nil + +res += 'src/resources/*.lua' +res += 'src/resources/*.ttf' +res += 'src/resources/*.json' + +for i = 1, #res do + src.extra_inputs += res[i] .. '.h' +end + +src.extra_inputs += extra_inputs + +obj += '.obj/*.o' +obj.extra_inputs = lib('*') + +---> build + +output = {({ + win32 = '$(bin)/lovr.exe', + macos = '$(bin)/lovr', + linux = '$(bin)/lovr', + android = '$(bin)/liblovr.so', + wasm = '$(bin)/lovr.html' +})[target]} + +output.extra_outputs = extra_outputs + +tup.foreach_rule(res, '^ XD %b^ xxd -i %f > %o', '%f.h') +tup.foreach_rule(src, '^ CC %b^ $(cc) $(base_flags) $(cflags) $(cflags_%B) -o %o -c %f', '.obj/%B.o') +tup.rule(obj, '^ LD %o^ $(cc) $(base_flags) -o %o %f $(lflags)', output) + +---> apk + +if target == 'android' then + activity = + config.headsets.vrapi and 'src/resources/Activity_vrapi.java' or + config.headsets.pico and 'src/resources/Activity_pico.java' or + config.headsets.openxr and 'src/resources/Activity_openxr.java' + + java = 'src/resources/Activity.java' + class = 'org/lovr/app/Activity.class' + binclass = 'bin/' .. class + jar = 'bin/lovr.jar' + dex = 'bin/apk/classes.dex' + + androidjar = ('%s/platforms/android-%d/android.jar'):format(config.android.sdk, config.android.version) + extrajar = config.headsets.pico and 'deps/pico/classes.jar' or nil + classpathsep = tup.getconfig('TUP_PLATFORM') == 'win32' and ';' or ':' + classpath = table.concat({ androidjar, extrajar }, classpathsep) + + package = config.android.package and ('--rename-manifest-package ' .. config.android.package) or '' + project = config.android.project + + manifest = config.android.manifest or + config.headsets.vrapi and 'src/resources/AndroidManifest_oculus.xml' or + config.headsets.pico and 'src/resources/AndroidManifest_pico.xml' or + config.headsets.openxr and 'src/resources/AndroidManifest_oculus.xml' + + tools = config.android.sdk .. '/build-tools/' .. config.android.buildtoolsversion + + ks = config.android.keystore + kspass = config.android.keystorepass + + unaligned = 'bin/.lovr.apk.unaligned' + unsigned = 'bin/.lovr.apk.unsigned' + apk = 'bin/lovr.apk' + + copy(manifest, 'bin/AndroidManifest.xml') + copy(activity, java) + tup.rule(java, '^ JAVAC %b^ javac -classpath $(classpath) -d bin %f', binclass) + tup.rule(binclass, '^ JAR %b^ jar -cf %o -C bin $(class)', jar) + tup.rule({ jar, extrajar }, '^ DX %b^ $(tools)/dx --dex --output %o %f', dex) + 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) + tup.rule(unsigned, '^ APKSIGNER %o^ $(tools)/apksigner sign --ks $(ks) --ks-pass $(kspass) --out %o %f', apk) +end diff --git a/Tuprules.tup b/Tuprules.tup deleted file mode 100644 index 7606e84c..00000000 --- a/Tuprules.tup +++ /dev/null @@ -1,283 +0,0 @@ -ROOT = $(TUP_CWD) -DEPS = $(ROOT)/deps -LIB = bin - -## Base -ifeq (@(CC),) -CC = clang -else -CC = @(CC) -endif -CFLAGS += -std=c99 -pedantic -CFLAGS += -I$(ROOT)/src -CFLAGS += -I$(ROOT)/src/modules -CFLAGS += -I$(ROOT)/src/lib/stdatomic -CFLAGS += -fvisibility=hidden -CFLAGS += -Wall -Wextra -CFLAGS += -Wno-unused-parameter -CFLAGS_glad.c += -Wno-pedantic -CFLAGS_os_android.c += -Wno-format-pedantic -CFLAGS_os_macos.c += -xobjective-c -CFLAGS_headset_openvr.c += -Wno-unused-variable -Wno-typedef-redefinition -Wno-pedantic -CFLAGS_headset_vrapi.c += -Wno-c11-extensions -Wno-gnu-empty-initializer -Wno-pedantic -CFLAGS_miniaudio.c += -Wno-unused-function -CFLAGS_@(STRICT) += -Werror -FLAGS_@(DEBUG) += -g -FLAGS_@(OPTIMIZE) += -Oz -FLAGS_@(SANITIZE) += -fsanitize=address,undefined -CFLAGS_@(OPTIMIZE) += -fdata-sections -ffunction-sections -ifneq (@(DEBUG),y) -LDFLAGS += -Wl,-s -endif - -## Modules -DISABLE_@(AUDIO) += -DLOVR_DISABLE_AUDIO -DISABLE_@(DATA) += -DLOVR_DISABLE_DATA -DISABLE_@(EVENT) += -DLOVR_DISABLE_EVENT -DISABLE_@(FILESYSTEM) += -DLOVR_DISABLE_FILESYSTEM -DISABLE_@(GRAPHICS) += -DLOVR_DISABLE_GRAPHICS -DISABLE_@(HEADSET) += -DLOVR_DISABLE_HEADSET -DISABLE_@(MATH) += -DLOVR_DISABLE_MATH -DISABLE_@(PHYSICS) += -DLOVR_DISABLE_PHYSICS -DISABLE_@(SYSTEM) += -DLOVR_DISABLE_SYSTEM -DISABLE_@(THREAD) += -DLOVR_DISABLE_THREAD -DISABLE_@(TIMER) += -DLOVR_DISABLE_TIMER - -## Headset backends -CFLAGS_@(SIMULATOR) += -DLOVR_USE_DESKTOP_HEADSET -CFLAGS_@(OPENVR) += -DLOVR_USE_OPENVR -CFLAGS_@(OPENXR) += -DLOVR_USE_OPENXR -CFLAGS_@(OPENXR) += -Ideps/openxr/include -CFLAGS_@(OCULUS) += -DLOVR_USE_OCULUS -CFLAGS_@(OCULUS) += -I@(OCULUS_PATH)/LibOVR/Include -CFLAGS_@(VRAPI) += -DLOVR_USE_VRAPI -CFLAGS_@(PICO) += -DLOVR_USE_PICO -CFLAGS_@(WEBXR) += -DLOVR_USE_WEBXR - -## Spatializer backends -CFLAGS_@(OCULUS_AUDIO) += -DLOVR_ENABLE_OCULUS_AUDIO -CFLAGS_@(STEAM_AUDIO) += -DLOVR_ENABLE_PHONON - -ifeq (@(PLATFORM),) -PLATFORM = @(TUP_PLATFORM) -else -PLATFORM = @(PLATFORM) -endif - -## Windows -ifeq ($(PLATFORM),win32) - win32 = y - SUFFIX = .exe - CFLAGS += -DLOVR_GL - CFLAGS += -D_CRT_SECURE_NO_WARNINGS - CFLAGS += -Wno-language-extension-token - LDFLAGS += -lShell32 -lOle32 - LDFLAGS_@(OPTIMIZE) += -Wl,--gc-sections - EXTRAS += bin/lovr.lib bin/lovr.exp - EXTRAS_@(DEBUG) += bin/lovr.pdb bin/lovr.ilk -endif - -## Linux -ifeq ($(PLATFORM),linux) - linux = y - CFLAGS += -D_POSIX_C_SOURCE=200809L -D_DEFAULT_SOURCE - CFLAGS += -DLOVR_GL - LDFLAGS += -lm -lpthread -ldl - LDFLAGS += -Wl,-rpath,\$ORIGIN - LDFLAGS_@(OPTIMIZE) += -Wl,--gc-sections -endif - -## macOS -ifeq ($(PLATFORM),macosx) - macos = y - PLATFORM = macos - CFLAGS += -DLOVR_GL - LDFLAGS += -Wl,-rpath,@executable_path - LDFLAGS_@(OPTIMIZE) += -Wl,-dead_strip - LDFLAGS += -lobjc -endif - -## Android -ifeq ($(PLATFORM),android) - android = y - SUFFIX = .so - PREFIX = apk/lib/arm64-v8a/lib - LIB = bin/apk/lib/arm64-v8a - - ifeq (@(TUP_PLATFORM),win32) - HOST = windows-x86_64 - endif - ifeq (@(TUP_PLATFORM),macosx) - HOST = darwin-x86_64 - endif - ifeq (@(TUP_PLATFORM),linux) - HOST = linux-x86_64 - endif - - CC = @(ANDROID_NDK)/toolchains/llvm/prebuilt/$(HOST)/bin/clang - CFLAGS += -DLOVR_GLES - CFLAGS += -I@(ANDROID_NDK)/sources/android/native_app_glue - FLAGS += --target=aarch64-linux-android@(ANDROID_VERSION) - FLAGS_@(DEBUG) += -funwind-tables - LDFLAGS += -shared -landroid -lEGL -lGLESv3 - LDFLAGS_@(OPTIMIZE) += -Wl,--gc-sections - - ACTIVITY_@(OPENXR) = Activity_openxr - ACTIVITY_@(VRAPI) = Activity_vrapi - ACTIVITY_@(PICO) = Activity_pico - ANDROID_MANIFEST_@(OPENXR) = src/resources/AndroidManifest_oculus.xml - ANDROID_MANIFEST_@(VRAPI) = src/resources/AndroidManifest_oculus.xml - ANDROID_MANIFEST_@(PICO) = src/resources/AndroidManifest_pico.xml - ifneq (@(ANDROID_MANIFEST),) - ANDROID_MANIFEST_y = @(ANDROID_MANIFEST) - endif - ifneq (@(ANDROID_PACKAGE),) - PACKAGE_RENAME = --rename-manifest-package @(ANDROID_PACKAGE) - endif - ifneq (@(ANDROID_ASSETS),) - ANDROID_ASSETS = -A @(ANDROID_ASSETS) - endif - - ANDROID_JAR = @(ANDROID_SDK)/platforms/android-@(ANDROID_VERSION)/android.jar - CLASSPATH = $(ANDROID_JAR) - ifeq (@(PICO),y) - EXTRA_JARS = $(DEPS)/pico/classes.jar - ifeq (@(TUP_PLATFORM),win32) - CLASSPATH = "$(CLASSPATH);$(EXTRA_JARS)" - else - CLASSPATH = "$(CLASSPATH):$(EXTRA_JARS)" - endif - endif - - TOOLS = @(ANDROID_SDK)/build-tools/@(ANDROID_BUILD_TOOLS_VERSION) - !dx = |> ^ DX %b^ dx --dex --output=%o %f |> - !zipalign = |> ^ ZIPALIGN %f^ $(TOOLS)/zipalign -f -p 4 %f %o |> - !apksigner = |> ^ APKSIGNER %o^ $(TOOLS)/apksigner sign --ks @(ANDROID_KEYSTORE) --ks-pass @(ANDROID_KEYSTORE_PASS) --out %o %f |> - - # OpenXR - OPENXR_LIB_PATH = $(DEPS)/OpenXR-Oculus/Libs/Android/arm64-v8a/Release - CFLAGS_@(OPENXR) += -I$(DEPS)/OpenXR-Oculus/Include - LDFLAGS_@(OPENXR) += -L$(OPENXR_LIB_PATH) -lopenxr_loader - LIBS_@(OPENXR) += $(OPENXR_LIB_PATH)/libopenxr_loader.so - - # VrApi - VRAPI_LIB_PATH = $(DEPS)/oculus-mobile/VrApi/Libs/Android/arm64-v8a/Release - CFLAGS_@(VRAPI) += -I$(DEPS)/oculus-mobile/VrApi/Include - LDFLAGS_@(VRAPI) += -L$(VRAPI_LIB_PATH) -lvrapi - LIBS_@(VRAPI) += $(VRAPI_LIB_PATH)/libvrapi.so - - # pico - PICO_LIB_PATH = $(DEPS)/pico/jni/arm64-v8a - LDFLAGS_@(PICO) += -L$(PICO_LIB_PATH) -lPvr_NativeSDK - LIBS_@(PICO) += $(PICO_LIB_PATH)/libPvr_NativeSDK.so -endif - -## emscripten -ifeq ($(PLATFORM),web) - web = y - SUFFIX = .html - CFLAGS += -DLOVR_WEBGL - LDFLAGS += -s USE_WEBGL2 - LDFLAGS += -s FORCE_FILESYSTEM - LDFLAGS += -s EXPORTED_FUNCTIONS="['_main','_lovrDestroy','_webxr_attach','_webxr_detach','_lovrCanvasCreateFromHandle','_lovrCanvasDestroy','_lovrGraphicsSetBackbuffer','_lovrGraphicsSetViewMatrix','_lovrGraphicsSetProjection']" - LDFLAGS_@(WEBXR) += --js-library $(ROOT)/src/resources/webxr.js - LDFLAGS += --shell-file $(ROOT)/src/resources/lovr.html - FLAGS_@(THREAD) += -s USE_PTHREADS=1 - EXTRAS = bin/lovr.js bin/lovr.wasm - EXTRAS_@(THREAD) += bin/lovr.worker.js -endif - -## Libraries -ifneq (@(CMAKE_DEPS),) - BUILD = @(CMAKE_DEPS) - - ifeq (@(OPTIMIZE),y) - CONFIG = Release - else - CONFIG = Debug - endif - - # Lua - ifeq (@(LUAJIT),y) - CFLAGS += -I$(DEPS)/luajit/src - LDFLAGS_$(win32) += -L$(BUILD)/luajit/src/$(CONFIG) -lluajit - LDFLAGS_$(macos) += -L$(BUILD)/luajit/src -lluajit - LDFLAGS_$(linux) += -L$(BUILD)/luajit/src -lluajit - LDFLAGS_$(android) += -L$(BUILD)/luajit/src -lluajit - LIBS_$(win32) += $(BUILD)/luajit/src/$(CONFIG)/luajit.dll - LIBS_$(macos) += $(BUILD)/luajit/src/libluajit.dylib - LIBS_$(linux) += $(BUILD)/luajit/src/libluajit.so - else - error "Vanillua does not work on this commit" - endif - - # GLFW - CFLAGS_$(win32) += -I$(DEPS)/glfw/include - CFLAGS_$(macos) += -I$(DEPS)/glfw/include - CFLAGS_$(linux) += -I$(DEPS)/glfw/include - LDFLAGS_$(win32) += -L$(BUILD)/glfw/src/$(CONFIG) -lglfw3dll - LDFLAGS_$(macos) += -L$(BUILD)/glfw/src -lglfw - LDFLAGS_$(linux) += -L$(BUILD)/glfw/src -lglfw - LIBS_$(win32) += $(BUILD)/glfw/src/$(CONFIG)/glfw3.dll - LIBS_$(macos) += $(BUILD)/glfw/src/libglfw.*dylib - LIBS_$(linux) += $(BUILD)/glfw/src/libglfw.*so* - - # msdfgen - CFLAGS_@(DATA) += -I$(DEPS)/msdfgen - LDFLAGS_@(DATA)_$(win32) += -L$(BUILD)/msdfgen/$(CONFIG) -lmsdfgen - LDFLAGS_@(DATA)_$(macos) += -L$(BUILD)/msdfgen -lmsdfgen - LDFLAGS_@(DATA)_$(linux) += -L$(BUILD)/msdfgen -lmsdfgen - LDFLAGS_@(DATA)_$(android) += -L$(BUILD)/raw/lib/arm64-v8a -lmsdfgen - LDFLAGS_@(DATA)_$(web) += $(BUILD)/msdfgen/libmsdfgen.a - LIBS_@(DATA)_$(win32) += $(BUILD)/msdfgen/$(CONFIG)/msdfgen.dll - LIBS_@(DATA)_$(macos) += $(BUILD)/msdfgen/libmsdfgen.dylib - LIBS_@(DATA)_$(linux) += $(BUILD)/msdfgen/libmsdfgen.so - LIBS_@(DATA)_$(android) += $(BUILD)/raw/lib/arm64-v8a/libmsdfgen.so - - # OpenVR - CFLAGS_@(OPENVR) += -I$(DEPS)/openvr/headers - LDFLAGS_@(OPENVR)_$(win32) += -L$(DEPS)/openvr/bin/win64 -lopenvr_api64 - LDFLAGS_@(OPENVR)_$(macos) += -L$(DEPS)/openvr/bin/osx32 -lopenvr_api - LDFLAGS_@(OPENVR)_$(linux) += -L$(DEPS)/openvr/bin/linux64 -lopenvr_api - LIBS_@(OPENVR)_$(win32) += $(DEPS)/openvr/bin/win64/openvr_api.dll - LIBS_@(OPENVR)_$(macos) += $(DEPS)/openvr/bin/osx32/libopenvr_api.dylib - LIBS_@(OPENVR)_$(linux) += $(DEPS)/openvr/bin/linux64/libopenvr_api.so - - # ODE - CFLAGS_@(PHYSICS) += -I$(DEPS)/ode/include -I$(BUILD)/ode/include - LDFLAGS_@(PHYSICS)_$(win32) += -L$(BUILD)/ode/$(CONFIG) -lode - LDFLAGS_@(PHYSICS)_$(macos) += -L$(BUILD)/ode -lode - LDFLAGS_@(PHYSICS)_$(linux) += -L$(BUILD)/ode -lode - LDFLAGS_@(PHYSICS)_$(android) += -L$(BUILD)/raw/lib/arm64-v8a -lode - LDFLAGS_@(PHYSICS)_$(web) += $(BUILD)/ode/libode.a - LIBS_@(PHYSICS)_$(win32) += $(BUILD)/ode/$(CONFIG)/ode.dll - LIBS_@(PHYSICS)_$(macos) += $(BUILD)/ode/libode.dylib - LIBS_@(PHYSICS)_$(linux) += $(BUILD)/ode/libode.so - LIBS_@(PHYSICS)_$(android) += $(BUILD)/raw/lib/arm64-v8a/libode.so - - # Oculus Audio - CFLAGS_@(OCULUS_AUDIO) += -I@(OCULUS_AUDIO_PATH)/Include - LDFLAGS_@(OCULUS_AUDIO)_$(win32) += -L@(OCULUS_AUDIO_PATH)/Lib/x64 -lovraudio64 - LDFLAGS_@(OCULUS_AUDIO)_$(linux) += -L@(OCULUS_AUDIO_PATH)/Lib/Linux64 -lovraudio64 - LDFLAGS_@(OCULUS_AUDIO)_$(android) += -L@(OCULUS_AUDIO_PATH)/Lib/Android/arm64-v8a -lovraudio64 - LIB_@(OCULUS_AUDIO)_$(win32) += @(OCULUS_AUDIO_PATH)/Lib/x64/ovraudio64.dll - LIB_@(OCULUS_AUDIO)_$(linux) += @(OCULUS_AUDIO_PATH)/Lib/Linux64/libovraudio64.so - LIB_@(OCULUS_AUDIO)_$(android) += @(OCULUS_AUDIO_PATH)/Lib/Android/arm64-v8a/libovraudio64.so - - # Phonon - CFLAGS_@(STEAM_AUDIO) += -I@(STEAM_AUDIO_PATH)/include - LIBS_@(STEAM_AUDIO)_$(win32) += @(STEAM_AUDIO_PATH)/bin/Windows/x64/phonon.dll - LIBS_@(STEAM_AUDIO)_$(macos) += @(STEAM_AUDIO_PATH)/lib/OSX/libphonon.dylib - LIBS_@(STEAM_AUDIO)_$(linux) += @(STEAM_AUDIO_PATH)/lib/Linux/x64/libphonon.so - LIBS_@(STEAM_AUDIO)_$(android) += @(STEAM_AUDIO_PATH)/lib/Android/arm64/libphonon.so -endif - -LIBS += $(LIBS_y) $(LIBS_y_y) -CFLAGS += $(FLAGS) $(FLAGS_y) $(DISABLE_n) $(CFLAGS_y) @(EXTRA_CFLAGS) -LDFLAGS += $(FLAGS) $(FLAGS_y) $(LDFLAGS_y) $(LDFLAGS_y_y) @(EXTRA_LDFLAGS) - -## Macros -!cc = |> ^o CC %b^ $(CC) $(CFLAGS) $(CFLAGS_%b) -o %o -c %f |> -!ld = |> ^ LD %o^ $(CC) -o %o %f $(LDFLAGS) |> -!xd = |> ^ XD %f^ xxd -i %f > %o |> -!cp = |> ^ CP %b^ cp %f %o |> diff --git a/src/core/os_win32.c b/src/core/os_win32.c index 93d0e01c..9d6b0edd 100644 --- a/src/core/os_win32.c +++ b/src/core/os_win32.c @@ -1,5 +1,7 @@ #include "os.h" #define WIN32_LEAN_AND_MEAN +#define WINVER 0x0600 +#define _WIN32_WINNT 0x0600 #include #include #include diff --git a/src/core/util.h b/src/core/util.h index ef83fc5b..acb536aa 100644 --- a/src/core/util.h +++ b/src/core/util.h @@ -9,7 +9,7 @@ #define LOVR_VERSION_PATCH 0 #define LOVR_VERSION_ALIAS "Government Goop" -#ifdef _WIN32 +#ifdef _MSC_VER #define LOVR_NORETURN __declspec(noreturn) #define LOVR_THREAD_LOCAL __declspec(thread) #define LOVR_RESTRICT __restrict diff --git a/src/lib/stdatomic/stdatomic.h b/src/lib/stdatomic/stdatomic.h index a44a204e..d08cc01d 100644 --- a/src/lib/stdatomic/stdatomic.h +++ b/src/lib/stdatomic/stdatomic.h @@ -3,7 +3,7 @@ #pragma once -#ifndef _WIN32 +#ifndef _MSC_VER #include #include @@ -143,7 +143,7 @@ _Bool atomic_flag_clear_explicit(volatile atomic_flag*, memory_order); #include -typedef unsigned int atomic_uint; +typedef volatile long atomic_uint; #define atomic_fetch_add(p, x) _InterlockedExchangeAdd(p, x) #define atomic_fetch_sub(p, x) _InterlockedExchangeAdd(p, -(x)) diff --git a/src/modules/audio/audio.c b/src/modules/audio/audio.c index cd94976d..24e02e88 100644 --- a/src/modules/audio/audio.c +++ b/src/modules/audio/audio.c @@ -215,10 +215,10 @@ static void onCapture(ma_device* device, void* output, const void* input, uint32 static const ma_device_callback_proc callbacks[] = { onPlayback, onCapture }; static Spatializer* spatializers[] = { -#ifdef LOVR_ENABLE_PHONON +#ifdef LOVR_ENABLE_PHONON_SPATIALIZER &phononSpatializer, #endif -#ifdef LOVR_ENABLE_OCULUS_AUDIO +#ifdef LOVR_ENABLE_OCULUS_SPATIALIZER &oculusSpatializer, #endif &simpleSpatializer diff --git a/tup.config.default b/tup.config.default deleted file mode 100644 index 60747abb..00000000 --- a/tup.config.default +++ /dev/null @@ -1,79 +0,0 @@ -## LÖVR config -# y is 'yes' and n is 'no' -# Equal signs should not have spaces around them - -## Options -# CC: The "C Compiler" to use. Some common compilers are clang and gcc. -# STRICT: Fail the build if there are any warnings. -# DEBUG: Include debug symbols in the build, increasing file size. -# OPTIMIZE: Make the executable faster and smaller, but compile slower. -# SANITIZE: Add extra runtime checks to detect memory leaks and undefined behavior (adds overhead). -# CMAKE_DEPS: If building dependencies with CMake, set this to the CMake build folder. -# EXTRA_CFLAGS: Additional compiler flags (e.g. libraries, warnings). -# EXTRA_LDFLAGS: Additional linker flags. -# PLATFORM: The platform to compile for (win32, macos, linux, android, web, or blank to autodetect). -CONFIG_CC=clang -CONFIG_STRICT=y -CONFIG_DEBUG=y -CONFIG_OPTIMIZE=n -CONFIG_SANITIZE=n -CONFIG_CMAKE_DEPS=build -CONFIG_EXTRA_CFLAGS= -CONFIG_EXTRA_LDFLAGS= -CONFIG_PLATFORM= - -## Modules -# The set of enabled Lua modules. -# Disabling unneeded modules will reduce executable size and improve compile times. -CONFIG_AUDIO=y -CONFIG_DATA=y -CONFIG_EVENT=y -CONFIG_FILESYSTEM=y -CONFIG_GRAPHICS=y -CONFIG_HEADSET=y -CONFIG_MATH=y -CONFIG_PHYSICS=y -CONFIG_SYSTEM=y -CONFIG_THREAD=y -CONFIG_TIMER=y - -## Headset backends -# Enabling headset backends adds support for more types of VR SDKs and hardware. -# Some proprietary SDKs cannot be included in LÖVR, so the path to the SDK must be provided. -CONFIG_SIMULATOR=y -CONFIG_OPENVR=y -CONFIG_OPENXR=n -CONFIG_OCULUS=n -CONFIG_VRAPI=n -CONFIG_PICO=n -CONFIG_WEBXR=n -CONFIG_OCULUS_PATH= - -## Spatializer backends -CONFIG_STEAM_AUDIO=n -CONFIG_STEAM_AUDIO_PATH= -CONFIG_OCULUS_AUDIO=n -CONFIG_OCULUS_AUDIO_PATH= - -## LuaJIT -CONFIG_LUAJIT=y - -## Android settings -# ANDROID_SDK: The path to the Android SDK -# ANDROID_NDK: The path to the Android NDK -# ANDROID_VERSION: The Android version to build against (usually 21 or 26) -# ANDROID_BUILD_TOOLS_VERSION: The version of the Android build tools to use (in build-tools folder) -# ANDROID_KEYSTORE: The path to the keystore (use keytool to generate) -# ANDROID_KEYSTORE_PASS: The keystore password (use either pass:, env:, or file:) -# ANDROID_MANIFEST: Optional path to a custom Android manifest file (xml) -# ANDROID_PACKAGE: Optional package id override (default is org.lovr.app, taken from manifest) -# ANDROID_ASSETS: Optional path to a folder to embed as the assets folder of the apk -CONFIG_ANDROID_SDK= -CONFIG_ANDROID_NDK= -CONFIG_ANDROID_VERSION= -CONFIG_ANDROID_BUILD_TOOLS_VERSION= -CONFIG_ANDROID_KEYSTORE= -CONFIG_ANDROID_KEYSTORE_PASS= -CONFIG_ANDROID_MANIFEST= -CONFIG_ANDROID_PACKAGE= -CONFIG_ANDROID_ASSETS=