Skip to content

Commit 9acb3ef

Browse files
committed
feat: add ios build script and workflow
1 parent 4469449 commit 9acb3ef

6 files changed

Lines changed: 315 additions & 29 deletions

File tree

.github/workflows/ios-build.yml

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
name: iOS Build
2+
on: [push, pull_request]
3+
4+
jobs:
5+
build:
6+
runs-on: macos-14
7+
permissions:
8+
actions: write
9+
steps:
10+
- uses: actions/checkout@v4
11+
12+
- name: Install build dependencies
13+
run: brew install cmake autoconf automake libtool pkg-config
14+
15+
- name: Build Allegro for iOS
16+
env:
17+
ALLEGRO_IOS_PREFIX: ${{ github.workspace }}/allegro-ios-install
18+
run: |
19+
# Create installation directory
20+
mkdir -p ${ALLEGRO_IOS_PREFIX}
21+
22+
# Clone Allegro source
23+
if [ ! -d "allegro5" ]; then
24+
git clone --depth 1 --branch 5.2 https://github.com/liballeg/allegro5.git
25+
fi
26+
cd allegro5
27+
28+
# Build Allegro for iOS
29+
mkdir -p build-ios
30+
cd build-ios
31+
32+
cmake .. \
33+
-DCMAKE_SYSTEM_NAME=iOS \
34+
-DCMAKE_OSX_ARCHITECTURES=arm64 \
35+
-DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 \
36+
-DCMAKE_INSTALL_PREFIX=${ALLEGRO_IOS_PREFIX} \
37+
-DCMAKE_BUILD_TYPE=Release \
38+
-DWANT_EXAMPLES=OFF \
39+
-DWANT_DOCS=OFF \
40+
-DWANT_TESTS=OFF \
41+
-DWANT_DEMO=OFF \
42+
-DWANT_TOOLS=OFF \
43+
-DWANT_OPENGL=OFF \
44+
-DWANT_OPENGLES=ON \
45+
-DWANT_NATIVE_IMAGE_LOADER=OFF \
46+
-DWANT_ALSA=OFF \
47+
-DWANT_OSS=OFF \
48+
-DWANT_PULSEAUDIO=OFF \
49+
-DWANT_JACK=OFF \
50+
-DWANT_OPENSL=OFF \
51+
-DWANT_DSOUND=OFF \
52+
-DWANT_WASAPI=OFF \
53+
-DWANT_X11=OFF \
54+
-DWANT_XCURSOR=OFF \
55+
-DWANT_XFONT=OFF \
56+
-DWANT_XRANDR=OFF \
57+
-DWANT_XSYNC=OFF \
58+
-DWANT_XINERAMA=OFF \
59+
-DWANT_XPM=OFF \
60+
-DWANT_XSHM=OFF \
61+
-DWANT_DIRECTFB=OFF \
62+
-G Xcode
63+
64+
# Build using xcodebuild
65+
xcodebuild -project allegro.xcodeproj \
66+
-scheme allegro \
67+
-configuration Release \
68+
-sdk iphoneos \
69+
-arch arm64 \
70+
CODE_SIGN_IDENTITY="" \
71+
CODE_SIGNING_REQUIRED=NO \
72+
CODE_SIGNING_ALLOWED=NO \
73+
-derivedDataPath build
74+
75+
# Install using cmake
76+
cmake --install . --config Release || {
77+
echo "cmake install failed, manually copying files..."
78+
mkdir -p ${ALLEGRO_IOS_PREFIX}/lib ${ALLEGRO_IOS_PREFIX}/include
79+
# Find and copy static libraries from the build directory
80+
find build -name "*.a" -type f -exec cp {} ${ALLEGRO_IOS_PREFIX}/lib/ \;
81+
# Copy headers
82+
if [ -d "../include" ]; then
83+
cp -r ../include ${ALLEGRO_IOS_PREFIX}/
84+
fi
85+
}
86+
87+
echo "Allegro iOS build completed. Libraries in ${ALLEGRO_IOS_PREFIX}/lib"
88+
ls -la ${ALLEGRO_IOS_PREFIX}/lib/ || true
89+
90+
- name: Build
91+
env:
92+
ALLEGRO_IOS_PREFIX: ${{ github.workspace }}/allegro-ios-install
93+
run: ./scripts/build-ios.sh
94+
95+
- name: Zip dist folder
96+
run: |
97+
cd dist
98+
zip -r dist.zip .
99+
100+
- name: Delete Old Artifacts
101+
uses: actions/github-script@v7
102+
id: artifact
103+
with:
104+
script: |
105+
const res = await github.rest.actions.listArtifactsForRepo({
106+
owner: context.repo.owner,
107+
repo: context.repo.repo,
108+
})
109+
110+
res.data.artifacts
111+
.filter(({ name }) => name === 'dunedynasty-${{ github.ref_name }}-ios')
112+
.forEach(({ id }) => {
113+
github.rest.actions.deleteArtifact({
114+
owner: context.repo.owner,
115+
repo: context.repo.repo,
116+
artifact_id: id,
117+
})
118+
})
119+
120+
- name: Upload Artifact
121+
uses: actions/upload-artifact@v4
122+
with:
123+
name: dunedynasty-${{ github.ref_name }}-ios
124+
path: dist/dist.zip
125+

CMakeLists.txt

Lines changed: 132 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -44,25 +44,103 @@ include(FindPkgConfig)
4444
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
4545

4646
set(ALLEGRO_VERSION 5)
47-
pkg_check_modules(ALLEGRO5 allegro-${ALLEGRO_VERSION})
48-
if(NOT ALLEGRO5_FOUND)
49-
set(ALLEGRO_VERSION 5.0)
50-
pkg_check_modules(ALLEGRO5 REQUIRED allegro-${ALLEGRO_VERSION})
51-
endif(NOT ALLEGRO5_FOUND)
52-
53-
pkg_check_modules(ALLEGRO5_AUDIO REQUIRED allegro_audio-${ALLEGRO_VERSION})
54-
pkg_check_modules(ALLEGRO5_IMAGE REQUIRED allegro_image-${ALLEGRO_VERSION})
55-
pkg_check_modules(ALLEGRO5_MEMFILE REQUIRED allegro_memfile-${ALLEGRO_VERSION})
56-
pkg_check_modules(ALLEGRO5_PRIMITIVES REQUIRED allegro_primitives-${ALLEGRO_VERSION})
57-
if(APPLE)
58-
pkg_check_modules(ALLEGRO5_MAIN REQUIRED allegro_main-${ALLEGRO_VERSION})
59-
endif(APPLE)
60-
include_directories(SYSTEM ${ALLEGRO5_INCLUDE_DIRS})
47+
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
48+
# For iOS, pkg-config finds macOS libraries which can't be linked
49+
# Prevent pkg-config from being used to avoid finding macOS libraries
50+
set(PKG_CONFIG_EXECUTABLE "")
51+
52+
# Look for iOS-built Allegro in the expected location
53+
set(ALLEGRO_IOS_PREFIX "$ENV{ALLEGRO_IOS_PREFIX}" CACHE PATH "Path to iOS-built Allegro installation")
54+
if(NOT ALLEGRO_IOS_PREFIX)
55+
set(ALLEGRO_IOS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/../allegro-ios-install")
56+
endif()
57+
58+
# Find iOS-built Allegro libraries
59+
find_library(ALLEGRO5_LIBRARY
60+
NAMES allegro allegro-5.2 allegro-5.0
61+
PATHS ${ALLEGRO_IOS_PREFIX}/lib
62+
NO_DEFAULT_PATH
63+
)
64+
find_library(ALLEGRO5_AUDIO_LIBRARY
65+
NAMES allegro_audio allegro_audio-5.2 allegro_audio-5.0
66+
PATHS ${ALLEGRO_IOS_PREFIX}/lib
67+
NO_DEFAULT_PATH
68+
)
69+
find_library(ALLEGRO5_IMAGE_LIBRARY
70+
NAMES allegro_image allegro_image-5.2 allegro_image-5.0
71+
PATHS ${ALLEGRO_IOS_PREFIX}/lib
72+
NO_DEFAULT_PATH
73+
)
74+
find_library(ALLEGRO5_MEMFILE_LIBRARY
75+
NAMES allegro_memfile allegro_memfile-5.2 allegro_memfile-5.0
76+
PATHS ${ALLEGRO_IOS_PREFIX}/lib
77+
NO_DEFAULT_PATH
78+
)
79+
find_library(ALLEGRO5_PRIMITIVES_LIBRARY
80+
NAMES allegro_primitives allegro_primitives-5.2 allegro_primitives-5.0
81+
PATHS ${ALLEGRO_IOS_PREFIX}/lib
82+
NO_DEFAULT_PATH
83+
)
84+
find_library(ALLEGRO5_MAIN_LIBRARY
85+
NAMES allegro_main allegro_main-5.2 allegro_main-5.0
86+
PATHS ${ALLEGRO_IOS_PREFIX}/lib
87+
NO_DEFAULT_PATH
88+
)
89+
90+
if(ALLEGRO5_LIBRARY AND ALLEGRO5_AUDIO_LIBRARY AND ALLEGRO5_IMAGE_LIBRARY AND ALLEGRO5_MEMFILE_LIBRARY AND ALLEGRO5_PRIMITIVES_LIBRARY)
91+
set(ALLEGRO5_FOUND TRUE)
92+
set(ALLEGRO5_LIBRARIES ${ALLEGRO5_LIBRARY})
93+
set(ALLEGRO5_AUDIO_LIBRARIES ${ALLEGRO5_AUDIO_LIBRARY})
94+
set(ALLEGRO5_IMAGE_LIBRARIES ${ALLEGRO5_IMAGE_LIBRARY})
95+
set(ALLEGRO5_MEMFILE_LIBRARIES ${ALLEGRO5_MEMFILE_LIBRARY})
96+
set(ALLEGRO5_PRIMITIVES_LIBRARIES ${ALLEGRO5_PRIMITIVES_LIBRARY})
97+
if(ALLEGRO5_MAIN_LIBRARY)
98+
set(ALLEGRO5_MAIN_LIBRARIES ${ALLEGRO5_MAIN_LIBRARY})
99+
endif()
100+
101+
# Set include directories
102+
find_path(ALLEGRO5_INCLUDE_DIRS
103+
NAMES allegro5/allegro.h
104+
PATHS ${ALLEGRO_IOS_PREFIX}/include
105+
NO_DEFAULT_PATH
106+
)
107+
if(ALLEGRO5_INCLUDE_DIRS)
108+
include_directories(SYSTEM ${ALLEGRO5_INCLUDE_DIRS})
109+
else()
110+
message(FATAL_ERROR "Allegro headers not found in ${ALLEGRO_IOS_PREFIX}/include")
111+
endif()
112+
else()
113+
message(FATAL_ERROR "Allegro libraries not found for iOS in ${ALLEGRO_IOS_PREFIX}/lib.\n"
114+
"Please build Allegro for iOS first. See the GitHub workflow for build steps.")
115+
endif()
116+
else()
117+
pkg_check_modules(ALLEGRO5 allegro-${ALLEGRO_VERSION})
118+
if(NOT ALLEGRO5_FOUND)
119+
set(ALLEGRO_VERSION 5.0)
120+
pkg_check_modules(ALLEGRO5 REQUIRED allegro-${ALLEGRO_VERSION})
121+
endif(NOT ALLEGRO5_FOUND)
122+
123+
pkg_check_modules(ALLEGRO5_AUDIO REQUIRED allegro_audio-${ALLEGRO_VERSION})
124+
pkg_check_modules(ALLEGRO5_IMAGE REQUIRED allegro_image-${ALLEGRO_VERSION})
125+
pkg_check_modules(ALLEGRO5_MEMFILE REQUIRED allegro_memfile-${ALLEGRO_VERSION})
126+
pkg_check_modules(ALLEGRO5_PRIMITIVES REQUIRED allegro_primitives-${ALLEGRO_VERSION})
127+
if(APPLE)
128+
pkg_check_modules(ALLEGRO5_MAIN REQUIRED allegro_main-${ALLEGRO_VERSION})
129+
endif(APPLE)
130+
include_directories(SYSTEM ${ALLEGRO5_INCLUDE_DIRS})
131+
endif()
61132

62133
if(PANDORA)
63134
find_package(OpenGLES)
64135
include_directories(SYSTEM ${OPENGLES_INCLUDE_DIR})
65136
set(OPENGL_LIBRARIES ${OPENGLES_LIBRARIES})
137+
elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS")
138+
# iOS uses OpenGL ES, but Allegro handles graphics internally
139+
# Link against OpenGLES framework
140+
find_library(OPENGLES_LIBRARY OpenGLES)
141+
if(OPENGLES_LIBRARY)
142+
set(OPENGL_LIBRARIES ${OPENGLES_LIBRARY})
143+
endif(OPENGLES_LIBRARY)
66144
else(PANDORA)
67145
find_package(OpenGL)
68146
include_directories(SYSTEM ${OPENGL_INCLUDE_DIR})
@@ -82,8 +160,21 @@ if(WIN32)
82160
list(APPEND OPTIONAL_LIBRARIES winmm)
83161
elseif(APPLE)
84162
find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox)
85-
find_library(AUDIOUNIT_LIBRARY AudioUnit)
86-
list(APPEND OPTIONAL_LIBRARIES ${AUDIOTOOLBOX_LIBRARY} ${AUDIOUNIT_LIBRARY})
163+
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
164+
# On iOS, AudioUnit is part of AudioToolbox, no need to link separately
165+
if(AUDIOTOOLBOX_LIBRARY)
166+
list(APPEND OPTIONAL_LIBRARIES ${AUDIOTOOLBOX_LIBRARY})
167+
endif(AUDIOTOOLBOX_LIBRARY)
168+
else()
169+
# macOS: link both AudioToolbox and AudioUnit
170+
find_library(AUDIOUNIT_LIBRARY AudioUnit)
171+
if(AUDIOTOOLBOX_LIBRARY)
172+
list(APPEND OPTIONAL_LIBRARIES ${AUDIOTOOLBOX_LIBRARY})
173+
endif(AUDIOTOOLBOX_LIBRARY)
174+
if(AUDIOUNIT_LIBRARY)
175+
list(APPEND OPTIONAL_LIBRARIES ${AUDIOUNIT_LIBRARY})
176+
endif(AUDIOUNIT_LIBRARY)
177+
endif()
87178
elseif(WITH_ALSA_MIDI)
88179
pkg_check_modules(ALSA alsa)
89180
if(ALSA_FOUND)
@@ -143,16 +234,31 @@ include_directories("include" "${PROJECT_BINARY_DIR}/include")
143234
add_executable(dunedynasty WIN32
144235
${DUNEDYNASTY_SRC_FILES} ${CMAKE_SOURCE_DIR}/src/icon/icon.rc)
145236

146-
target_link_libraries(dunedynasty
147-
${OPTIONAL_LIBRARIES}
148-
${ALLEGRO5_AUDIO_LDFLAGS}
149-
${ALLEGRO5_IMAGE_LDFLAGS}
150-
${ALLEGRO5_MEMFILE_LDFLAGS}
151-
${ALLEGRO5_PRIMITIVES_LDFLAGS}
152-
${ALLEGRO5_MAIN_LDFLAGS}
153-
${ALLEGRO5_LDFLAGS}
154-
${OPENGL_LIBRARIES}
155-
)
237+
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
238+
# For iOS, use the directly found libraries
239+
target_link_libraries(dunedynasty
240+
${OPTIONAL_LIBRARIES}
241+
${ALLEGRO5_LIBRARIES}
242+
${ALLEGRO5_AUDIO_LIBRARIES}
243+
${ALLEGRO5_IMAGE_LIBRARIES}
244+
${ALLEGRO5_MEMFILE_LIBRARIES}
245+
${ALLEGRO5_PRIMITIVES_LIBRARIES}
246+
${ALLEGRO5_MAIN_LIBRARIES}
247+
${OPENGL_LIBRARIES}
248+
)
249+
else()
250+
# For other platforms, use pkg-config LDFLAGS
251+
target_link_libraries(dunedynasty
252+
${OPTIONAL_LIBRARIES}
253+
${ALLEGRO5_AUDIO_LDFLAGS}
254+
${ALLEGRO5_IMAGE_LDFLAGS}
255+
${ALLEGRO5_MEMFILE_LDFLAGS}
256+
${ALLEGRO5_PRIMITIVES_LDFLAGS}
257+
${ALLEGRO5_MAIN_LDFLAGS}
258+
${ALLEGRO5_LDFLAGS}
259+
${OPENGL_LIBRARIES}
260+
)
261+
endif()
156262

157263
if(CMAKE_MACOSX_BUNDLE)
158264
set_target_properties(dunedynasty PROPERTIES

cmake/FileList.cmake

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ set(DUNEDYNASTY_SRC_FILES
4141
src/mods/skirmish.c
4242
src/net/client.c
4343
src/net/message.c
44-
src/net/net_enet.c
4544
src/net/server.c
4645
src/newui/actionpanel.c
4746
src/newui/chatbox.c
@@ -121,7 +120,7 @@ set(DUNEDYNASTY_SRC_FILES
121120
if(WIN32)
122121
set(DUNEDYNASTY_SRC_FILES
123122
${DUNEDYNASTY_SRC_FILES} src/audio/midi_win32.c)
124-
elseif(APPLE)
123+
elseif(APPLE AND NOT CMAKE_SYSTEM_NAME STREQUAL "iOS")
125124
set(DUNEDYNASTY_SRC_FILES
126125
${DUNEDYNASTY_SRC_FILES} src/audio/midi_osx.c)
127126
elseif(WITH_ALSA_MIDI)
@@ -150,6 +149,11 @@ if(WITH_AUD)
150149
${DUNEDYNASTY_SRC_FILES} src/audio/audlib/audlib_a5.c)
151150
endif(WITH_AUD)
152151

152+
if(WITH_ENET)
153+
set(DUNEDYNASTY_SRC_FILES
154+
${DUNEDYNASTY_SRC_FILES} src/net/net_enet.c)
155+
endif(WITH_ENET)
156+
153157
if(WIN32)
154158
set(DUNEDYNASTY_SRC_FILES
155159
${DUNEDYNASTY_SRC_FILES} src/crashlog/errorlog_win32.c)

include/buildcfg.h.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#cmakedefine WITH_ACODEC
1010
#cmakedefine WITH_AUD
11+
#cmakedefine WITH_ENET
1112
#cmakedefine WITH_FLUIDSYNTH
1213
#cmakedefine WITH_MAD
1314

scripts/build-ios.sh

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#!/bin/bash -e
2+
3+
echo "Cleaning up build..."
4+
./scripts/cleanup-build.sh
5+
6+
echo "Performing iOS build..."
7+
# iOS build requires Xcode and iOS SDK
8+
# Note: Dependencies (Allegro, FluidSynth, etc.) may need to be built separately for iOS
9+
# or provided as pre-built frameworks. This script provides the basic structure.
10+
11+
# Unset PKG_CONFIG_PATH to prevent finding macOS libraries via pkg-config
12+
# For iOS, Allegro and other dependencies need to be built separately or provided as frameworks
13+
unset PKG_CONFIG_PATH
14+
15+
# Set iOS as the target platform
16+
# Using Xcode generator for iOS builds
17+
# ALLEGRO_IOS_PREFIX should be set by the workflow to point to the iOS-built Allegro installation
18+
cmake -DCMAKE_BUILD_TYPE=Release \
19+
-DCMAKE_SYSTEM_NAME=iOS \
20+
-DCMAKE_OSX_ARCHITECTURES=arm64 \
21+
-DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 \
22+
-DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO \
23+
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="" \
24+
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=NO \
25+
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO \
26+
-DWITH_ENET=OFF \
27+
-DWITH_FLUIDSYNTH=OFF \
28+
-DWITH_MAD=OFF \
29+
-DWITH_ACODEC=OFF \
30+
${ALLEGRO_IOS_PREFIX:+-DALLEGRO_IOS_PREFIX="$ALLEGRO_IOS_PREFIX"} \
31+
-G Xcode .
32+
33+
# Build using xcodebuild
34+
# Build for iOS device (arm64)
35+
xcodebuild -project dunedynasty.xcodeproj \
36+
-scheme dunedynasty \
37+
-configuration Release \
38+
-sdk iphoneos \
39+
-arch arm64 \
40+
CODE_SIGN_IDENTITY="" \
41+
CODE_SIGNING_REQUIRED=NO \
42+
CODE_SIGNING_ALLOWED=NO \
43+
-derivedDataPath build
44+
45+
echo "iOS build completed. Output should be in dist/ or build/"

0 commit comments

Comments
 (0)