Add iOS support with build scripts, toolchain, and assets (#302)

* feat: add iOS support

* ios: clean up icon

* ci: add ios build

* fix(gui): revert asset lookups to use "%s/assets/%s/%s" for macOS

* refactor(gui): remove extra `iconv` linkage for iOS

* chore(gitignore): remove unused `xcuserdata` and `DerivedData` entries

* fix(gui): use provided `LibXML2` in non-vendored builds

* fix(ci): add Xcode setup step for iOS build

* fix(pipe): prevent relay threads from using freed stack memory

* fix(input): replace bitfields with explicit wire packing for touch and gyro data

* fix merge issues

* fix cmake merge bug

* cmake: attempt iOS SDL fix

* older ios

* feat: add iOS support

* ios: clean up icon

* ci: add ios build

* refactor(gui): remove extra `iconv` linkage for iOS

* chore(gitignore): remove unused `xcuserdata` and `DerivedData` entries

* fix(ci): add Xcode setup step for iOS build

* cmake: attempt iOS SDL fix

* older ios

* cleanup

* build signed macOS app alongside iOS app

* cmake: detect ios version and include liquid glass icon if available

* ci: upload continuous release

* cmake: move more ios code to toolchain

* remove ios simulator target

* improvements

* remove CMakePresets.json

* Update ios-toolchain.cmake

* move ios folder to gui folder

* converge Info.plist templates

* update comments and readme

* cmake: remove redundant code

* remove redundant ios folder

* cmake: add comments to cache strings

* cmake/ci: maybe fix new apple builds

* cmake: fix new ios build

* cmake: fix macOS build?

---------

Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com>
This commit is contained in:
Joshua Brest (杰成)andMattKC authored and GitHub committed 2026-09-09 02:25:50 -07:00
1 parent a055ed60e7
commit 78b923719c
31 files changed
+572 -101

No files matched your search

+191 -6
View File
@@ -10,6 +10,195 @@ permissions:
contents: write
packages: write
jobs:
build-ios:
name: Build iOS
runs-on: macos-15
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.4'
- name: Configure iOS
run: |
cmake -S . -B build -G Xcode --toolchain cmake/ios-toolchain.cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5
- name: Build iOS
run: cmake --build build --config Release --target vanilla
- name: Create unsigned IPA
run: |
APP=build/bin/Release/Vanilla.app
test -d "$APP"
mkdir -p Payload
cp -R "$APP" Payload/
zip -9rX vanilla-ios.ipa Payload
- name: Upload iOS Artifact
uses: actions/upload-artifact@v4
with:
name: ios
path: vanilla-ios.ipa
- name: Upload Continuous Release
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'vanilla-wiiu/vanilla' }}
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
curl -fLOSs --retry 2 --retry-delay 60 https://github.com/probonopd/uploadtool/raw/master/upload.sh
bash upload.sh vanilla-ios.ipa
build-macos:
name: Build macOS
runs-on: macos-15
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.4'
- name: Configure
run: |
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \
-DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \
-DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
-DVANILLA_BUILD_PIPE=OFF \
-DVANILLA_BUILD_VENDORED=ON
- name: Build
run: cmake --build build --target vanilla
- name: Package
run: |
ditto -c -k --keepParent "$GITHUB_WORKSPACE/build/bin/Vanilla.app" vanilla-macos-universal-unsigned.zip
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: macos universal unsigned
path: vanilla-macos-universal-unsigned.zip
if-no-files-found: error
sign-macos:
name: Sign and notarize macOS
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'vanilla-wiiu/vanilla' }}
needs: build-macos
runs-on: macos-15
environment: macos-release
steps:
- uses: actions/checkout@v4
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.4'
- name: Download unsigned macOS artifact
uses: actions/download-artifact@v4
with:
name: macos universal unsigned
path: incoming
- name: Unpack
run: |
mkdir -p signing
ditto -x -k incoming/vanilla-macos-universal-unsigned.zip signing
- name: Import signing certificate
env:
MACOS_CERTIFICATE_BASE64: ${{ secrets.MACOS_CERTIFICATE_BASE64 }}
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
MACOS_KEYCHAIN_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
MACOS_NOTARY_KEY_BASE64: ${{ secrets.MACOS_NOTARY_KEY_BASE64 }}
MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }}
run: |
certificate_path="$RUNNER_TEMP/developer-id.p12"
keychain_path="$RUNNER_TEMP/vanilla-signing.keychain-db"
notary_key_path="$RUNNER_TEMP/AuthKey_${MACOS_NOTARY_KEY_ID}.p8"
printf '%s' "$MACOS_CERTIFICATE_BASE64" | base64 --decode -o "$certificate_path"
printf '%s' "$MACOS_NOTARY_KEY_BASE64" | base64 --decode -o "$notary_key_path"
security create-keychain -p "$MACOS_KEYCHAIN_PASSWORD" "$keychain_path"
security set-keychain-settings -lut 21600 "$keychain_path"
security unlock-keychain -p "$MACOS_KEYCHAIN_PASSWORD" "$keychain_path"
security import "$certificate_path" -P "$MACOS_CERTIFICATE_PASSWORD" -A -t cert -f pkcs12 -k "$keychain_path"
security set-key-partition-list -S apple-tool:,apple: -k "$MACOS_KEYCHAIN_PASSWORD" "$keychain_path"
security list-keychains -d user -s "$keychain_path"
signing_identity="$(security find-identity -v -p codesigning "$keychain_path" | sed -n 's/.*"\(Developer ID Application:.*\)"/\1/p' | head -n 1)"
echo "MACOS_NOTARY_KEY_PATH=$notary_key_path" >> "$GITHUB_ENV"
echo "MACOS_SIGNING_IDENTITY=$signing_identity" >> "$GITHUB_ENV"
- name: Sign
run: |
codesign \
--force \
--timestamp \
--options runtime \
--entitlements "$GITHUB_WORKSPACE/gui/res/Vanilla.entitlements" \
--sign "$MACOS_SIGNING_IDENTITY" \
"$GITHUB_WORKSPACE/signing/Vanilla.app"
codesign --verify --deep --strict --verbose=2 "$GITHUB_WORKSPACE/signing/Vanilla.app"
- name: Notarize and staple app
env:
MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }}
MACOS_NOTARY_ISSUER_ID: ${{ secrets.MACOS_NOTARY_ISSUER_ID }}
run: |
APP="$GITHUB_WORKSPACE/signing/Vanilla.app"
ARCHIVE="$RUNNER_TEMP/Vanilla-notary.zip"
ditto -c -k --keepParent "$APP" "$ARCHIVE"
xcrun notarytool submit "$ARCHIVE" \
--key "$MACOS_NOTARY_KEY_PATH" \
--key-id "$MACOS_NOTARY_KEY_ID" \
--issuer "$MACOS_NOTARY_ISSUER_ID" \
--wait
xcrun stapler staple "$APP"
xcrun stapler validate "$APP"
spctl --assess --type execute --verbose=4 "$APP"
- name: Package
run: ditto -c -k --keepParent signing/Vanilla.app vanilla-macos-universal.zip
- name: Remove signing credentials
if: ${{ always() }}
env:
MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }}
run: |
security delete-keychain "$RUNNER_TEMP/vanilla-signing.keychain-db" || true
rm -f "$RUNNER_TEMP/developer-id.p12"
if [ -n "$MACOS_NOTARY_KEY_ID" ]; then
rm -f "$RUNNER_TEMP/AuthKey_${MACOS_NOTARY_KEY_ID}.p8"
fi
- name: Upload signed macOS artifact
uses: actions/upload-artifact@v4
with:
name: macOS signed and notarized
path: vanilla-macos-universal.zip
if-no-files-found: error
- name: Upload signed continuous release
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'vanilla-wiiu/vanilla' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
curl -fLOSs --retry 2 --retry-delay 60 https://github.com/probonopd/uploadtool/raw/master/upload.sh
bash upload.sh vanilla-macos-universal.zip
build:
strategy:
fail-fast: false
@@ -27,9 +216,6 @@ jobs:
- os: android
arch: universal
artifact: vanilla-android-universal.apk
- os: macos
arch: universal
artifact: vanilla-macos-universal.zip
- os: raspberrypi0w
arch: armv6l
artifact: vanilla-raspberrypi0w-image.zip
@@ -95,8 +281,8 @@ jobs:
run: |
tar czf ${{ matrix.platform.artifact }} -C "${{ github.workspace }}/build" .
- name: Archive (Windows/macOS/Raspberry Pi/Nintendo Switch)
if: ${{ matrix.platform.os == 'windows' || matrix.platform.os == 'macos' || matrix.platform.os == 'raspberrypi0w' || matrix.platform.os == 'raspberrypi64' || matrix.platform.os == 'nintendoswitch' || matrix.platform.os == 'orangepi_zero3' || matrix.platform.os == 'orangepi_zero2w' }}
- name: Archive (Windows/Raspberry Pi/Nintendo Switch)
if: ${{ matrix.platform.os == 'windows' || matrix.platform.os == 'raspberrypi0w' || matrix.platform.os == 'raspberrypi64' || matrix.platform.os == 'nintendoswitch' || matrix.platform.os == 'orangepi_zero3' || matrix.platform.os == 'orangepi_zero2w' }}
run: |
cd build
zip -r ../${{ matrix.platform.artifact }} .
@@ -130,4 +316,3 @@ jobs:
run: |
curl -fLOSs --retry 2 --retry-delay 60 https://github.com/probonopd/uploadtool/raw/master/upload.sh
bash upload.sh ${{ matrix.platform.artifact }}
+4
View File
@@ -1,4 +1,5 @@
build/
CMakeUserPresets.json
.vscode/
.directory
.cache/
@@ -12,3 +13,6 @@ buildpi/
.idea/
android/local.properties
android/app/src/main/assets
# macOS
.DS_Store
+7 -1
View File
@@ -13,7 +13,13 @@ if(UNIX AND NOT APPLE AND NOT ANDROID)
set(LINUX TRUE)
endif()
if(ANDROID OR MSVC)
if(APPLE)
# FFmpeg's configure step expects both compiler drivers even though Vanilla
# itself is written in C.
enable_language(CXX)
endif()
if(ANDROID OR MSVC OR IOS)
set(vendored_default TRUE)
else()
set(vendored_default FALSE)
+1 -1
View File
@@ -32,7 +32,7 @@ An Arch User Repository (AUR) package called `vanilla-wiiu-git` is available for
- [Raspberry Pi](https://github.com/vanilla-wiiu/vanilla/wiki/Single%E2%80%90Board-Computers) (requires [external Wi-Fi adapter](https://github.com/vanilla-wiiu/vanilla/wiki/Linux-Setup-Guide#raspberry-pi))
- [Orange Pi](https://github.com/vanilla-wiiu/vanilla/wiki/Single%E2%80%90Board-Computers) (requires [external Wi-Fi adapter](https://github.com/vanilla-wiiu/vanilla/wiki/Linux-Setup-Guide#raspberry-pi))
- macOS (currently frontend only)
- *iOS* - Coming soon
- [iOS](https://github.com/vanilla-wiiu/vanilla/wiki/iOS) (currently frontend only)
## What Wi-Fi adapter should I use?
+50
View File
@@ -0,0 +1,50 @@
set(CMAKE_SYSTEM_NAME iOS)
if(NOT CMAKE_GENERATOR STREQUAL "Xcode")
message(FATAL_ERROR "iOS build requires Xcode generator")
endif()
set(CMAKE_OSX_SYSROOT iphoneos CACHE STRING "iOS SDK")
set(CMAKE_OSX_ARCHITECTURES arm64 CACHE STRING "iOS architectures")
set(CMAKE_XCODE_GENERATE_SCHEME ON CACHE BOOL "Generate an Xcode scheme")
# Determine Xcode version to determine iOS deployment target
if(NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET)
execute_process(
COMMAND xcodebuild -version
RESULT_VARIABLE _vanilla_xcode_version_result
OUTPUT_VARIABLE _vanilla_xcode_version_output
ERROR_VARIABLE _vanilla_xcode_version_error
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT _vanilla_xcode_version_result EQUAL 0)
message(FATAL_ERROR "Could not determine the selected Xcode version: ${_vanilla_xcode_version_error}")
endif()
string(REGEX MATCH "Xcode ([0-9]+(\\.[0-9]+)*)" _vanilla_xcode_version_match "${_vanilla_xcode_version_output}")
if(NOT CMAKE_MATCH_1)
message(FATAL_ERROR "Could not parse the selected Xcode version from: ${_vanilla_xcode_version_output}")
endif()
if(CMAKE_MATCH_1 VERSION_GREATER_EQUAL 26.0)
set(_vanilla_ios_deployment_target 15.0)
else()
set(_vanilla_ios_deployment_target 12.0)
endif()
set(CMAKE_OSX_DEPLOYMENT_TARGET "${_vanilla_ios_deployment_target}" CACHE STRING "Minimum iOS deployment version")
endif()
if(IS_DIRECTORY "${CMAKE_OSX_SYSROOT}")
set(VANILLA_IOS_SDK_PATH "${CMAKE_OSX_SYSROOT}")
else()
execute_process(
COMMAND xcrun --sdk "${CMAKE_OSX_SYSROOT}" --show-sdk-path
RESULT_VARIABLE _vanilla_ios_sdk_result
OUTPUT_VARIABLE VANILLA_IOS_SDK_PATH
ERROR_VARIABLE _vanilla_ios_sdk_error
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT _vanilla_ios_sdk_result EQUAL 0 OR NOT IS_DIRECTORY "${VANILLA_IOS_SDK_PATH}")
message(FATAL_ERROR "Could not resolve iOS SDK '${CMAKE_OSX_SYSROOT}': ${_vanilla_ios_sdk_error}")
endif()
endif()
-33
View File
@@ -1,33 +0,0 @@
FROM docker.io/ubuntu:24.04@sha256:33ceb71981b602c1a7443a53469e4dba065f7503eab3078a2d7a57a2ab987517
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
RUN apt -y update && \
apt -y install build-essential git clang patch python3 cmake patch libssl-dev libxml2-dev liblzma-dev cpio libbz2-dev zlib1g-dev bash wget nasm && \
apt-get clean && \
apt-get autoremove --yes && \
rm -rf /var/lib/{apt,dpkg,cache,log}/
RUN git clone https://github.com/tpoechtrager/osxcross
RUN wget -c https://archive.org/download/xcode-clt/Command_Line_Tools_for_Xcode_16.4.dmg
RUN /osxcross/tools/gen_sdk_package_tools_dmg.sh /Command_Line_Tools_for_Xcode_*.dmg
RUN rm /Command_Line_Tools_for_Xcode_*.dmg
RUN mv /osxcross/*.sdk.tar.xz /osxcross/tarballs/
RUN SDK_VERSION=14 UNATTENDED=1 /osxcross/build.sh
RUN /osxcross/build_compiler_rt.sh
# Fix linker in osxcross cmake (https://github.com/tpoechtrager/osxcross/issues/454)
RUN echo 'set(CMAKE_LINKER "${OSXCROSS_TARGET_DIR}/bin/${OSXCROSS_HOST}-ld" CACHE FILEPATH "ld")' >> /osxcross/target/toolchain.cmake
RUN echo 'set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=${CMAKE_LINKER}")' >> /osxcross/target/toolchain.cmake
RUN echo 'set(CMAKE_SHARED_LINKER_FLAGS "-fuse-ld=${CMAKE_LINKER}")' >> /osxcross/target/toolchain.cmake
RUN echo 'set(CMAKE_MODULE_LINKER_FLAGS "-fuse-ld=${CMAKE_LINKER}")' >> /osxcross/target/toolchain.cmake
ENV PATH=/osxcross/target/bin:$PATH
ENTRYPOINT [ "/vanilla/docker/macos/build.sh" ]
-13
View File
@@ -1,13 +0,0 @@
#!/bin/sh
set -e
cmake \
-S /vanilla \
-B /build \
-DVANILLA_BUILD_VENDORED=ON \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_TOOLCHAIN_FILE=/vanilla/docker/macos/toolchain.cmake
cmake --build /build --parallel
mv /build/bin/*.app /install/
-19
View File
@@ -1,19 +0,0 @@
set(CMAKE_CROSSCOMPILING ON)
set(CMAKE_SYSTEM_NAME "Darwin")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13")
set(CMAKE_OSX_SYSROOT "/osxcross/target/SDK/MacOSX14.sdk")
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64")
set(CMAKE_INSTALL_NAME_TOOL "xcrun install_name_tool")
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang)
execute_process(COMMAND xcrun -find ar OUTPUT_VARIABLE CMAKE_AR OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND xcrun -find nm OUTPUT_VARIABLE CMAKE_NM OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND xcrun -find ranlib OUTPUT_VARIABLE CMAKE_RANLIB OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND xcrun -find strip OUTPUT_VARIABLE CMAKE_STRIP OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND xcrun -find ld OUTPUT_VARIABLE CMAKE_LINKER OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CMAKE_C_FLAGS "--target=darwin -fuse-ld=${CMAKE_LINKER}")
set(CMAKE_CXX_FLAGS "--target=darwin -fuse-ld=${CMAKE_LINKER}")
+169 -6
View File
@@ -69,6 +69,27 @@ function(compile_ffmpeg _target_name _system_name _system_processor)
)
elseif(MSVC)
set(FFMPEG_TARGET_OS "win32")
elseif(IOS)
set(FFMPEG_TARGET_OS "darwin")
set(_ios_version_flag "-mios-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
set(FFMPEG_LDFLAGS "${CMAKE_C_FLAGS} -arch ${_system_processor} ${_ios_version_flag} -isysroot ${VANILLA_IOS_SDK_PATH}")
set(FFMPEG_CFLAGS "${CMAKE_C_FLAGS} -arch ${_system_processor} ${_ios_version_flag} -isysroot ${VANILLA_IOS_SDK_PATH} -w")
list(APPEND FFMPEG_CONFIGURE_ARGS
--disable-asm
--disable-avdevice
--disable-indevs
--disable-outdevs
--nm=${CMAKE_NM}
--ar=${CMAKE_AR}
--ranlib=${CMAKE_RANLIB}
--cc=${CMAKE_C_COMPILER}
--cxx=${CMAKE_CXX_COMPILER}
--ld=${CMAKE_C_COMPILER}
--strip=${CMAKE_STRIP}
--host-cc=clang
--host-ld=clang
--enable-videotoolbox
)
elseif(APPLE)
set(FFMPEG_TARGET_OS "darwin")
set(FFMPEG_LDFLAGS "${FFMPEG_LDFLAGS} -arch ${_system_processor} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} -L${CMAKE_OSX_SYSROOT}/usr/lib -lSystem")
@@ -220,16 +241,23 @@ if (VANILLA_BUILD_VENDORED)
set(LIBXML2_WITH_ICONV OFF)
set(LIBXML2_WITH_PROGRAMS OFF)
set(LIBXML2_WITH_TESTS OFF)
if (NOT IOS)
FetchContent_Declare(
libxml2
GIT_REPOSITORY https://gitlab.gnome.org/GNOME/libxml2.git
GIT_TAG v2.13.5
EXCLUDE_FROM_ALL
)
FetchContent_MakeAvailable(SDL2 SDL2_ttf SDL2_image libxml2)
else()
FetchContent_MakeAvailable(SDL2 SDL2_ttf SDL2_image)
endif()
if (APPLE)
if (IOS)
# Compile FFmpeg for arm64
compile_ffmpeg("FFmpeg" "${CMAKE_SYSTEM_NAME}" "${CMAKE_OSX_ARCHITECTURES}")
elseif (APPLE)
# Compile FFmpeg for both x86_64 and arm64
foreach (_arch ${CMAKE_OSX_ARCHITECTURES})
compile_ffmpeg("FFmpeg_${_arch}" "${CMAKE_SYSTEM_NAME}" "${_arch}")
@@ -359,10 +387,105 @@ if (VANILLA_BUILD_USE_POLKIT)
)
endif()
if(APPLE)
if(IOS)
set(VANILLA_PLATFORM_INFO_PLIST_ENTRIES [=[
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
<string>wifi</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIRequiresFullScreen</key>
<true/>]=])
else()
set(VANILLA_PLATFORM_INFO_PLIST_ENTRIES [=[
<key>LSMinimumSystemVersion</key>
<string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string>
<key>NSHighResolutionCapable</key>
<true/>]=])
endif()
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/res/Info.plist.in"
"${CMAKE_CURRENT_BINARY_DIR}/Vanilla.Info.plist.in"
@ONLY
)
endif()
# Declare executable
add_library(vanillagui STATIC ${VANILLA_GUI_SRC})
if (ANDROID)
add_library(vanilla SHARED main.c)
elseif(IOS)
add_executable(vanilla MACOSX_BUNDLE
main.c
)
set_target_properties(vanilla PROPERTIES
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.mattkc.vanilla"
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "${CMAKE_OSX_DEPLOYMENT_TARGET}"
)
set_target_properties(vanilla PROPERTIES
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO"
)
# Compile storyboard
add_custom_command(
TARGET vanilla POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:vanilla>/LaunchScreen.storyboardc"
COMMAND xcrun ibtool --compile "$<TARGET_FILE_DIR:vanilla>/LaunchScreen.storyboardc"
"${CMAKE_CURRENT_SOURCE_DIR}/res/ios/LaunchScreen.storyboard"
--target-device iphone --target-device ipad
--minimum-deployment-target "${CMAKE_OSX_DEPLOYMENT_TARGET}"
VERBATIM
)
# Compile app icon with actool
if(XCODE_VERSION VERSION_GREATER_EQUAL 26.0
AND CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 15.0)
set(_vanilla_icon_input "${CMAKE_CURRENT_SOURCE_DIR}/res/ios/AppIcon.icon")
set(_vanilla_icon_extra_args --include-all-app-icons)
else()
set(_vanilla_icon_input "${CMAKE_CURRENT_SOURCE_DIR}/res/ios/Assets.xcassets")
set(_vanilla_icon_extra_args)
endif()
add_custom_command(
TARGET vanilla POST_BUILD
COMMAND xcrun actool
--compile "$<TARGET_FILE_DIR:vanilla>"
--enable-on-demand-resources NO
--app-icon AppIcon
--platform iphoneos
${_vanilla_icon_extra_args}
--minimum-deployment-target "${CMAKE_OSX_DEPLOYMENT_TARGET}"
--target-device iphone --target-device ipad
--output-partial-info-plist "${CMAKE_CURRENT_BINARY_DIR}/AssetCatalog-Info.plist"
"${_vanilla_icon_input}"
COMMAND /usr/libexec/PlistBuddy -x
-c "Merge ${CMAKE_CURRENT_BINARY_DIR}/AssetCatalog-Info.plist"
"$<TARGET_FILE_DIR:vanilla>/Info.plist"
VERBATIM
)
else()
add_executable(vanilla MACOSX_BUNDLE main.c)
endif()
@@ -377,6 +500,11 @@ if (APPLE)
# Set bundle name to be more user-friendly
set_target_properties(vanilla PROPERTIES
OUTPUT_NAME Vanilla
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_BINARY_DIR}/Vanilla.Info.plist.in"
MACOSX_BUNDLE_GUI_IDENTIFIER "com.mattkc.vanilla"
MACOSX_BUNDLE_BUNDLE_NAME "Vanilla"
MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0"
MACOSX_BUNDLE_BUNDLE_VERSION "1"
)
else()
# Ensure executable is installed
@@ -391,7 +519,6 @@ if (NOT VANILLA_BUILD_VENDORED)
endif()
target_link_libraries(vanillagui PRIVATE
SDL2::SDL2main
${_sdl_lib}
SDL2_ttf
SDL2_image
@@ -401,7 +528,6 @@ target_link_libraries(vanillagui PRIVATE
if (ANDROID)
target_link_libraries(vanillagui PRIVATE
SDL2main
android
GLESv2
log
@@ -409,6 +535,9 @@ if (ANDROID)
)
endif()
# SDL owns the platform entry-point shim used by main.c.
target_link_libraries(vanilla PRIVATE SDL2::SDL2main ${_sdl_lib})
# Find FFmpeg
if (NOT VANILLA_BUILD_VENDORED)
find_package(FFmpeg REQUIRED COMPONENTS avformat avcodec avutil swscale)
@@ -431,7 +560,24 @@ if (LINUX)
endif()
if (APPLE)
target_link_libraries(vanillagui PRIVATE "-framework VideoToolbox" "-framework CoreMedia" iconv)
target_compile_definitions(vanillagui PRIVATE VANILLA_VIDEOTOOLBOX_AVAILABLE)
target_link_libraries(vanillagui PRIVATE
"-framework CoreFoundation"
"-framework CoreMedia"
"-framework CoreVideo"
"-framework Foundation"
"-framework Metal"
"-framework QuartzCore"
"-framework VideoToolbox"
iconv
)
endif()
if (IOS)
target_link_libraries(vanillagui PRIVATE
"-framework ImageIO"
"-framework MobileCoreServices"
)
endif()
if (VANILLA_BUILD_PIPE)
@@ -484,7 +630,12 @@ endif()
# Find libxml2 (used for storing/parsing user config)
if (VANILLA_BUILD_VENDORED)
if (IOS)
target_link_libraries(vanillagui PRIVATE "-lxml2")
target_include_directories(vanillagui PRIVATE "${VANILLA_IOS_SDK_PATH}/usr/include/libxml2")
else()
target_link_libraries(vanillagui PRIVATE LibXml2::LibXml2)
endif()
else()
find_package(LibXML2 REQUIRED)
target_link_libraries(vanillagui PRIVATE ${LibXML2_LIBRARIES})
@@ -506,7 +657,19 @@ target_include_directories(vanillagui PRIVATE
)
# Install assets
if(APPLE)
if(ANDROID)
# Put assets in correct place relative to build
add_custom_command(
TARGET vanilla POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/assets" "${CMAKE_CURRENT_SOURCE_DIR}/../android/app/src/main/assets"
)
elseif(IOS)
# Put assets inside the iOS app bundle
add_custom_command(
TARGET vanilla POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/assets" "$<TARGET_FILE_DIR:vanilla>/assets"
)
elseif(APPLE)
# Put assets in correct place relative to build
add_custom_command(
TARGET vanilla POST_BUILD
+12 -7
View File
@@ -1,4 +1,5 @@
#include <errno.h>
#include <SDL.h>
#include <stdio.h>
#include <string.h>
#include <vanilla.h>
@@ -9,18 +10,22 @@
#include "ui/ui.h"
#include "ui/ui_sdl.h"
#if defined(__APPLE__)
#include <TargetConditionals.h>
#if TARGET_OS_IOS
// SDL_main will be linked incorrectly on iOS unless we include this
#include <SDL.h>
#endif
#endif
#define SCREEN_WIDTH 854
#define SCREEN_HEIGHT 480
#if !defined(ANDROID) && !defined(_WIN32)
#define SDL_main main
#endif
#include "pipemgmt.h"
void display_cli_help(const char **argv);
void display_cli_help(char **argv);
int SDL_main(int argc, const char **argv)
int main(int argc, char **argv)
{
int ret = 1;
@@ -126,7 +131,7 @@ exit_config:
return ret;
}
void display_cli_help(const char **argv) {
void display_cli_help(char **argv) {
vpilog("Usage: %s [options]\n\n", argv[0]);
vpilog("Options:\n");
vpilog(" -w, --window Run Vanilla in a window (overrides config)\n");
+2 -15
View File
@@ -1,12 +1,7 @@
#include "platform.h"
#if defined(ANDROID)
#include <android/log.h>
#elif defined(_WIN32)
#include <windows.h>
#endif
#include <SDL_filesystem.h>
#include <SDL_log.h>
#include <stdio.h>
#include "ui/ui_util.h"
@@ -34,15 +29,7 @@ void vpi_get_data_filename(char *out, size_t out_size, const char *filename, con
void vpilog_va(const char *fmt, va_list va)
{
#if defined(ANDROID)
__android_log_vprint(ANDROID_LOG_ERROR, "VPI", fmt, va);
// #elif defined(_WIN32)
// char buf[4096];
// vsnprintf(buf, sizeof(buf), fmt, va);
// MessageBoxA(0, buf, 0, 0);
#else
vfprintf(stderr, fmt, va);
#endif
SDL_LogMessageV(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, fmt, va);
}
void vpilog(const char *fmt, ...)
+29
View File
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
<key>CFBundleExecutable</key>
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>CFBundleVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
@VANILLA_PLATFORM_INFO_PLIST_ENTRIES@
<key>NSLocalNetworkUsageDescription</key>
<string>Vanilla needs local network access to connect to your Wii U.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Vanilla needs microphone access to stream audio to your Wii U.</string>
</dict>
</plist>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.device.audio-input</key>
<true/>
</dict>
</plist>
@@ -0,0 +1,4 @@
<svg viewBox="0 0 20.6667 15.5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.58333 0C1.24427 0 0 1.2457 0 2.58333V12.9167C0 14.2543 1.24427 15.5 2.58333 15.5H18.0833C19.4224 15.5 20.6667 14.2543 20.6667 12.9167V2.58333C20.6667 1.2457 19.4224 0 18.0833 0H16.5333L12.1417 11.625H8.525L4.13333 0H2.58333Z" fill="white"/>
<path d="M7.75 0L10.3333 7.75L12.9167 0H7.75Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 402 B

+36
View File
@@ -0,0 +1,36 @@
{
"fill": {
"automatic-gradient": "srgb:0.13333,0.79608,1.00000,1.00000"
},
"groups": [
{
"layers": [
{
"image-name": "Vanilla.svg",
"name": "Vanilla",
"position": {
"scale": 34.5,
"translation-in-points": [
0,
0
]
}
}
],
"shadow": {
"kind": "neutral",
"opacity": 0.5
},
"translucency": {
"enabled": true,
"value": 0.5
}
}
],
"supported-platforms": {
"circles": [
"watchOS"
],
"squares": "shared"
}
}
@@ -0,0 +1,23 @@
{
"images" : [
{ "idiom" : "iphone", "size" : "20x20", "scale" : "2x", "filename" : "icon-40.png" },
{ "idiom" : "iphone", "size" : "20x20", "scale" : "3x", "filename" : "icon-60.png" },
{ "idiom" : "iphone", "size" : "29x29", "scale" : "2x", "filename" : "icon-58.png" },
{ "idiom" : "iphone", "size" : "29x29", "scale" : "3x", "filename" : "icon-87.png" },
{ "idiom" : "iphone", "size" : "40x40", "scale" : "2x", "filename" : "icon-80.png" },
{ "idiom" : "iphone", "size" : "40x40", "scale" : "3x", "filename" : "icon-120.png" },
{ "idiom" : "iphone", "size" : "60x60", "scale" : "2x", "filename" : "icon-120.png" },
{ "idiom" : "iphone", "size" : "60x60", "scale" : "3x", "filename" : "icon-180.png" },
{ "idiom" : "ipad", "size" : "20x20", "scale" : "1x", "filename" : "icon-20.png" },
{ "idiom" : "ipad", "size" : "20x20", "scale" : "2x", "filename" : "icon-40.png" },
{ "idiom" : "ipad", "size" : "29x29", "scale" : "1x", "filename" : "icon-29.png" },
{ "idiom" : "ipad", "size" : "29x29", "scale" : "2x", "filename" : "icon-58.png" },
{ "idiom" : "ipad", "size" : "40x40", "scale" : "1x", "filename" : "icon-40.png" },
{ "idiom" : "ipad", "size" : "40x40", "scale" : "2x", "filename" : "icon-80.png" },
{ "idiom" : "ipad", "size" : "76x76", "scale" : "1x", "filename" : "icon-76.png" },
{ "idiom" : "ipad", "size" : "76x76", "scale" : "2x", "filename" : "icon-152.png" },
{ "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x", "filename" : "icon-167.png" },
{ "idiom" : "ios-marketing", "size" : "1024x1024", "scale" : "1x", "filename" : "icon-1024.png" }
],
"info" : { "version" : 1, "author" : "xcode" }
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,3 @@
{
"info" : { "version" : 1, "author" : "xcode" }
}
+33
View File
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="24506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_3" orientation="landscape" appearance="dark"/>
<accessibilityOverrides/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24504"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="h1l-Gk-Fah">
<rect key="frame" x="0.0" y="0.0" width="874" height="402"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<viewLayoutGuide key="safeArea" id="HNf-3x-a1F"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-119" y="373"/>
</scene>
</scenes>
<resources>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>