Added support for building on Linux (incl. Android/WSL)

This does not require a compatibility layer (Darling) nor a toolchain
(Theos). Instead, clang and lld from Linux distribution is used with
iOS SDK to compile the natives part (C/Objective-C). Of course, this
also allows compiling on Android with Termux or Windows with WSL.
This commit is contained in:
Duy Tran Khanh committed 2022-07-28 10:59:56 +07:00
1 parent 7bbbe2cb54
commit 74cbcc28af
4 files changed
+50 -11

No files matched your search

+25 -9
View File
@@ -46,6 +46,12 @@ DEVICE_IP ?= 127.0.0.1
DEVICE_PORT ?= 22
$(warning Building on a jailbroken iOS device.)
endif
else ifeq ($(DETECTPLAT),Linux)
$(warning Building on Linux. Note that all targets may not compile or require external components.)
IOS := 0
# SDKPATH presence is checked later
BOOTJDK ?= /usr/bin
SYSARCH := $(shell uname -m)
else
$(error This platform is not currently supported for building PojavLauncher.)
endif
@@ -132,23 +138,23 @@ DEPLOY = \
ldid -S$(SOURCEDIR)/entitlements.xml $(WORKINGDIR)/PojavLauncher.app/PojavLauncher; \
if [ '$(2)' = '0' ]; then \
scp -r -P $(DEVICE_PORT) -o "StrictHostKeyChecking no" -o "UserKnownHostsFile=/dev/null" \
$(WORKINGDIR)/libOSMesaOverride.dylib.framework \
$(WORKINGDIR)/libawt_xawt.dylib \
$(WORKINGDIR)/*.framework \
$(WORKINGDIR)/*.dylib \
$(WORKINGDIR)/PojavLauncher.app/PojavLauncher \
$(SOURCEDIR)/JavaApp/local_out/*.jar \
root@$(DEVICE_IP):/var/tmp/; \
ssh root@$(DEVICE_IP) -p $(DEVICE_PORT) -t " \
mv /var/tmp/libawt_xawt.dylib $(1)/Applications/PojavLauncher.app/Frameworks/libawt_xawt.dylib && \
mv /var/tmp/libOSMesaOverride.dylib.framework $(1)/Applications/PojavLauncher.app/Frameworks/libOSMesaOverride.dylib.framework && \
mv /var/tmp/*.dylib $(1)/Applications/PojavLauncher.app/Frameworks/ && \
mv /var/tmp/*.framework $(1)/Applications/PojavLauncher.app/Frameworks/ && \
mv /var/tmp/PojavLauncher $(1)/Applications/PojavLauncher.app/PojavLauncher && \
mv /var/tmp/*.jar $(1)/Applications/PojavLauncher.app/libs/ && \
cd $(1)/Applications/PojavLauncher.app/Frameworks && \
ln -sf libawt_xawt.dylib libawt_headless.dylib && \
chown -R 501:501 $(1)/Applications/PojavLauncher.app/*"; \
else \
sudo rm -rf $(1)/Applications/PojavLauncher.app/Frameworks/libOSMesaOverride.dylib.framework; \
sudo mv $(WORKINGDIR)/libawt_xawt.dylib $(1)/Applications/PojavLauncher.app/Frameworks/libawt_xawt.dylib; \
sudo mv $(WORKINGDIR)/libOSMesaOverride.dylib.framework $(1)/Applications/PojavLauncher.app/Frameworks/; \
sudo rm -rf $(1)/Applications/PojavLauncher.app/Frameworks/{libOSMesaOverride.dylib,MetalANGLE}.framework; \
sudo mv $(WORKINGDIR)/*.dylib $(1)/Applications/PojavLauncher.app/Frameworks/; \
sudo mv $(WORKINGDIR)/*.framework $(1)/Applications/PojavLauncher.app/Frameworks/; \
sudo mv $(WORKINGDIR)/PojavLauncher.app/PojavLauncher $(1)/Applications/PojavLauncher.app/PojavLauncher; \
sudo mv $(SOURCEDIR)/JavaApp/local_out/*.jar $(1)/Applications/PojavLauncher.app/libs/; \
cd $(1)/Applications/PojavLauncher.app/Frameworks; \
@@ -183,6 +189,12 @@ ifeq ($(call HAS_COMMAND,dpkg-deb --version),1)
$(error You need to install dpkg-dev)
endif
ifeq ($(DETECTPLAT),Linux)
ifeq ($(call HAS_COMMAND,lld),1)
$(error You need to install lld)
endif
endif
ifeq ($(call HAS_COMMAND,nproc --version),1)
ifeq ($(call HAS_COMMAND,gnproc --version),1)
$(warning Unable to determine number of threads, defaulting to 2.)
@@ -194,6 +206,10 @@ else
JOBS ?= $(shell nproc)
endif
ifndef SDKPATH
$(error You need to specify SDKPATH to the path of iPhoneOS.sdk. The SDK version should be 14.0 or newer.)
endif
# Now for the actual Makefile recipes.
# all - runs clean, native, java, extras, and package.
# check - Makes sure that all variables are correct.
@@ -282,9 +298,9 @@ deb: native java extras
$(call DIRCHECK,$(WORKINGDIR)/PojavLauncher.app/libs)
$(call DIRCHECK,$(WORKINGDIR)/PojavLauncher.app/libs_caciocavallo)
@cp -R $(SOURCEDIR)/Natives/resources/* $(WORKINGDIR)/PojavLauncher.app/ || exit 1
@cp $(WORKINGDIR)/libawt_xawt.dylib $(WORKINGDIR)/PojavLauncher.app/Frameworks/ || exit 1
@cp $(WORKINGDIR)/*.dylib $(WORKINGDIR)/PojavLauncher.app/Frameworks/ || exit 1
@( cd $(WORKINGDIR)/PojavLauncher.app/Frameworks; ln -sf libawt_xawt.dylib libawt_headless.dylib ) || exit 1
@cp -R $(WORKINGDIR)/libOSMesaOverride.dylib.framework $(WORKINGDIR)/PojavLauncher.app/Frameworks/ || exit 1
@cp -R $(WORKINGDIR)/*.framework $(WORKINGDIR)/PojavLauncher.app/Frameworks/ || exit 1
@cp -R $(SOURCEDIR)/JavaApp/libs/* $(WORKINGDIR)/PojavLauncher.app/libs/ || exit 1
@cp $(SOURCEDIR)/JavaApp/local_out/*.jar $(WORKINGDIR)/PojavLauncher.app/libs/ || exit 1
@cp -R $(SOURCEDIR)/JavaApp/libs_caciocavallo/* $(WORKINGDIR)/PojavLauncher.app/libs_caciocavallo/ || exit 1
+1 -1
View File
@@ -2,7 +2,7 @@
// AppDelegate.h
//
#import "MGLKit.h"
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, UINavigationControllerDelegate>
+13 -1
View File
@@ -1,9 +1,15 @@
cmake_minimum_required(VERSION 3.6)
project(PojavLauncher)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcommon -fobjc-arc -ObjC")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -target arm64-apple-ios -fcommon -fobjc-arc -ObjC")
set(CMAKE_C_FLAGS_DEBUG "-funwind-tables -g")
if("${CMAKE_HOST_SYSTEM_NAME}" MATCHES "Linux|^GNU$|Android")
set(GLOBAL_LDFLAGS "-isysroot ${CMAKE_OSX_SYSROOT} -Wl,-syslibroot,${CMAKE_OSX_SYSROOT} -fuse-ld=lld")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GLOBAL_LDFLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GLOBAL_LDFLAGS}")
endif()
include_directories(
"resources/Frameworks/Alderis.framework/Headers"
"external/AFNetworking/AFNetworking"
@@ -48,6 +54,7 @@ set_target_properties(libOSMesaOverride.dylib PROPERTIES
MACOSX_FRAMEWORK_IDENTIFIER dylib.mesa3d.libOSMesaOverride
)
target_link_libraries(libOSMesaOverride.dylib
"${GLOBAL_LDFLAGS}"
"${OSMESA_LIB}"
)
@@ -57,6 +64,7 @@ add_library(tinygl4angle SHARED
external/gl4es/tinygl4angle.c
)
target_link_libraries(tinygl4angle
"${GLOBAL_LDFLAGS}"
"-F'${CMAKE_CURRENT_LIST_DIR}/resources/Frameworks'"
"-framework MetalANGLE"
)
@@ -118,6 +126,10 @@ add_executable(PojavLauncher
utils.m
)
if("${CMAKE_HOST_SYSTEM_NAME}" MATCHES "Linux|^GNU$|Android")
target_sources(PojavLauncher PUBLIC non_darwin_utils.m)
endif()
target_link_libraries(PojavLauncher
"-F'${CMAKE_CURRENT_LIST_DIR}/build'"
"-F'${CMAKE_CURRENT_LIST_DIR}/resources/Frameworks'"
+11
View File
@@ -0,0 +1,11 @@
#import <Foundation/Foundation.h>
// This is only compiled when building on non-Apple platforms
int __isPlatformVersionAtLeast(int platform, int major, int minor, int patch) {
NSOperatingSystemVersion version;
version.majorVersion = major;
version.minorVersion = minor;
version.patchVersion = patch;
return [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:version];
}