diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a76aaa5..31eea801 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -637,6 +637,12 @@ elseif(ANDROID) target_compile_definitions(lovr PRIVATE -DLOVR_GLES) target_include_directories(lovr PRIVATE "${ANDROID_NDK}/sources/android/native_app_glue") + # Dynamically linked targets output libraries in lib/ for easy including in apk with aapt + set_target_properties( + lovr ${LOVR_ODE} ${LOVR_OPENAL} + PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib/${ANDROID_ABI}" + ) + if(LOVR_BUILD_EXE) get_filename_component(ANDROID_SDK "${ANDROID_NDK}" DIRECTORY) # SDK root is parent of NDK dir set(ANDROID_JAR "${ANDROID_SDK}/platforms/${ANDROID_PLATFORM}/android.jar") @@ -647,12 +653,6 @@ elseif(ANDROID) set(ANDROID_ASSETS -A ${ANDROID_ASSETS}) endif() - # Dynamically linked targets output libraries in lib/ and are copied to the apk with aapt - set_target_properties( - lovr ${LOVR_ODE} ${LOVR_OPENAL} - PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib/${ANDROID_ABI}" - ) - # Flavor-specific config: # - Imported targets need to have their libraries manually copied to lib/ # - Figure out which Java class (Activity) and AndroidManifest.xml to use diff --git a/Tupfile b/Tupfile index f9b31891..fa936b25 100644 --- a/Tupfile +++ b/Tupfile @@ -1,12 +1,16 @@ include_rules # core +ifneq (@(PICO),y) SRC += src/main.c +endif SRC += src/core/arr.c SRC += src/core/fs.c SRC += src/core/maf.c SRC += src/core/map.c +ifneq (@(PICO),y) SRC += src/core/os_$(PLATFORM).c +endif SRC += src/core/png.c SRC += src/core/ref.c SRC += src/core/utf.c @@ -25,6 +29,7 @@ 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)@(WEBVR) += src/modules/headset/headset_webvr.c SRC_@(HEADSET)@(WEBXR) += src/modules/headset/headset_webxr.c SRC_@(HEADSET)@(LEAP) += src/modules/headset/headset_leap.c @@ -77,12 +82,14 @@ ifeq ($(PLATFORM),android) # There needs to be a Java class for the activity with 2 lines of code to load native libraries. # It gets compiled to a class file with javac and then into bytecode using dx CLASS = org/lovr/app/Activity.class - : src/resources/Activity.java |> ^ JAVAC %b^ javac -classpath $(ANDROID_JAR) -d . %f |> $(CLASS) - : $(CLASS) |> !dx |> classes.dex + : src/resources/$(ACTIVITY_y).java |> !cp |> src/resources/Activity.java + : src/resources/Activity.java |> ^ JAVAC %b^ javac -classpath $(CLASSPATH) -d . %f |> $(CLASS) + : $(CLASS) $(EXTRA_JARS) |> !dx |> classes.dex # Create an apk from the Android manifest. The zip command is used afterwards to add raw files # because it is way faster than calling aapt again and apks are just zips (TODO windows). - : @(ANDROID_MANIFEST) | $(LIB)/*.so classes.dex |> ^ AAPT %b^ aapt package -F %o -M %f -I $(ANDROID_JAR) $(ANDROID_ASSETS) && zip -qu0 %o $(LIB)/*.so classes.dex |> tmp/lovr.unaligned.apk + : $(ANDROID_MANIFEST_y) |> !cp |> src/resources/AndroidManifest.xml + : src/resources/AndroidManifest.xml | $(LIB)/*.so classes.dex |> ^ AAPT %b^ aapt package -F %o -M %f -I $(ANDROID_JAR) $(ANDROID_ASSETS) && zip -qu0 %o $(LIB)/*.so classes.dex |> tmp/lovr.unaligned.apk # Even though we have an apk, it isn't actually valid yet. It has to be aligned using the special # zipalign tool, and then signed using apksigner. diff --git a/Tuprules.tup b/Tuprules.tup index 1f3a3257..998c100d 100644 --- a/Tuprules.tup +++ b/Tuprules.tup @@ -37,6 +37,7 @@ CFLAGS_@(OPENXR) += -DLOVR_USE_OPENXR 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 CFLAGS_@(LEAP) += -DLOVR_USE_LEAP @@ -182,6 +183,7 @@ ifeq ($(PLATFORM),android) ANDROID_JAR = @(ANDROID_SDK)/sdk/platforms/android-@(ANDROID_VERSION)/android.jar GLUE = @(ANDROID_SDK)/sdk/ndk-bundle/sources/android/native_app_glue VRAPI_LIB_PATH = $(DEPS)/VrApi/Libs/Android/arm64-v8a/Release + PICO_LIB_PATH = $(DEPS)/pico/jni/arm64-v8a CFLAGS += --target=aarch64-linux-android@(ANDROID_VERSION) CFLAGS += -I$(GLUE) LDFLAGS += --target=aarch64-linux-android@(ANDROID_VERSION) @@ -193,11 +195,30 @@ ifeq ($(PLATFORM),android) PREFIX = $(LIB)/lib SUFFIX = .so CFLAGS_@(GRAPHICS) += -DLOVR_GLES + ACTIVITY_@(VRAPI) = Activity_vrapi + ACTIVITY_@(PICO) = Activity_pico + + ifeq (@(ANDROID_MANIFEST),) + ANDROID_MANIFEST_@(VRAPI) = src/resources/AndroidManifest_vrapi.xml + ANDROID_MANIFEST_@(PICO) = src/resources/AndroidManifest_pico.xml + else + ANDROID_MANIFEST_y = @(ANDROID_MANIFEST) + endif ifneq (@(ANDROID_ASSETS),) ANDROID_ASSETS = -A @(ANDROID_ASSETS) endif + 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 + # Macros !dx = |> ^ DX %b^ dx --dex --output=%o %f |> !zipalign = |> ^ ZIPALIGN %f^ $(TOOLS)/zipalign -f 4 %f %o |> @@ -219,15 +240,17 @@ ifeq ($(PLATFORM),android) CFLAGS_@(ENET) += -I$(DEPS)/enet/include CFLAGS_@(VRAPI) += -I$(DEPS)/VrApi/Include - LDFLAGS_@(AUDIO) += -L$(BUILD)/openal -lopenal + LDFLAGS_@(AUDIO) += -L$(BUILD)/$(LIB) -lopenal LDFLAGS_@(DATA) += -L$(BUILD)/lib_msdfgen -lmsdfgen - LDFLAGS_@(PHYSICS) += -L$(BUILD)/ode -lode + LDFLAGS_@(PHYSICS) += -L$(BUILD)/$(LIB) -lode LDFLAGS_@(ENET) += -L$(BUILD)/enet -lenet LDFLAGS_@(VRAPI) += -L$(VRAPI_LIB_PATH) -lvrapi + LDFLAGS_@(PICO) += -L$(PICO_LIB_PATH) -lPvr_NativeSDK - LIBS_@(AUDIO) += $(BUILD)/openal/libopenal.*so* - LIBS_@(PHYSICS) += $(BUILD)/ode/libode.so + LIBS_@(AUDIO) += $(BUILD)/$(LIB)/libopenal.*so* + LIBS_@(PHYSICS) += $(BUILD)/$(LIB)/libode.so LIBS_@(VRAPI) += $(VRAPI_LIB_PATH)/libvrapi.so + LIBS_@(PICO) += $(PICO_LIB_PATH)/libPvr_NativeSDK.so endif endif