release.yml 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. name: 'release'
  2. run-name: 'Create SDL release artifacts for ${{ inputs.commit }}'
  3. on:
  4. workflow_dispatch:
  5. inputs:
  6. commit:
  7. description: 'Commit of SDL'
  8. required: true
  9. jobs:
  10. src:
  11. runs-on: ubuntu-latest
  12. outputs:
  13. project: ${{ steps.releaser.outputs.project }}
  14. version: ${{ steps.releaser.outputs.version }}
  15. src-tar-gz: ${{ steps.releaser.outputs.src-tar-gz }}
  16. src-tar-xz: ${{ steps.releaser.outputs.src-tar-xz }}
  17. src-zip: ${{ steps.releaser.outputs.src-zip }}
  18. steps:
  19. - name: 'Set up Python'
  20. uses: actions/setup-python@v5
  21. with:
  22. python-version: '3.11'
  23. - name: 'Fetch build-release.py'
  24. uses: actions/checkout@v4
  25. with:
  26. sparse-checkout: 'build-scripts/build-release.py'
  27. - name: 'Set up SDL sources'
  28. uses: actions/checkout@v4
  29. with:
  30. path: 'SDL'
  31. fetch-depth: 0
  32. - name: 'Build Source archive'
  33. id: releaser
  34. shell: bash
  35. run: |
  36. python build-scripts/build-release.py \
  37. --actions source \
  38. --commit ${{ inputs.commit }} \
  39. --root "${{ github.workspace }}/SDL" \
  40. --github \
  41. --debug
  42. - name: 'Store source archives'
  43. uses: actions/upload-artifact@v4
  44. with:
  45. name: sources
  46. path: '${{ github.workspace}}/dist'
  47. linux-verify:
  48. needs: [src]
  49. runs-on: ubuntu-latest
  50. steps:
  51. - name: 'Download source archives'
  52. uses: actions/download-artifact@v4
  53. with:
  54. name: sources
  55. path: '${{ github.workspace }}'
  56. - name: 'Unzip ${{ needs.src.outputs.src-zip }}'
  57. id: zip
  58. run: |
  59. mkdir /tmp/zipdir
  60. cd /tmp/zipdir
  61. unzip "${{ github.workspace }}/${{ needs.src.outputs.src-zip }}"
  62. echo "path=/tmp/zipdir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  63. - name: 'Untar ${{ needs.src.outputs.src-tar-gz }}'
  64. id: tar
  65. run: |
  66. mkdir -p /tmp/tardir
  67. tar -C /tmp/tardir -v -x -f "${{ github.workspace }}/${{ needs.src.outputs.src-tar-gz }}"
  68. echo "path=/tmp/tardir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  69. - name: 'Compare contents of ${{ needs.src.outputs.src-zip }} and ${{ needs.src.outputs.src-tar-gz }}'
  70. run: |
  71. diff /tmp/zipdir /tmp/tardir
  72. - name: 'Test versioning'
  73. shell: bash
  74. run: |
  75. ${{ steps.tar.outputs.path }}/build-scripts/test-versioning.sh
  76. - name: 'Install Linux dependencies'
  77. run: |
  78. sudo apt-get update -y
  79. sudo apt-get install -y \
  80. gnome-desktop-testing libasound2-dev libpulse-dev libaudio-dev libjack-dev libsndio-dev \
  81. libusb-1.0-0-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxfixes-dev libxi-dev \
  82. libxss-dev libwayland-dev libxkbcommon-dev libdrm-dev libgbm-dev libgl1-mesa-dev libgles2-mesa-dev \
  83. libegl1-mesa-dev libdbus-1-dev libibus-1.0-dev libudev-dev fcitx-libs-dev
  84. - name: 'CMake (configure + build + tests + examples)'
  85. run: |
  86. cmake -S ${{ steps.tar.outputs.path }} -B /tmp/build -DSDL_TEST_LIBRARY=TRUE -DSDL_TESTS=TRUE -DSDL_EXAMPLES=TRUE
  87. cmake --build /tmp/build --verbose
  88. ctest --test-dir /tmp/build --no-tests=error --output-on-failure
  89. dmg:
  90. needs: [src]
  91. runs-on: macos-latest
  92. outputs:
  93. dmg: ${{ steps.releaser.outputs.dmg }}
  94. steps:
  95. - name: 'Set up Python'
  96. uses: actions/setup-python@v5
  97. with:
  98. python-version: '3.11'
  99. - name: 'Fetch build-release.py'
  100. uses: actions/checkout@v4
  101. with:
  102. sparse-checkout: 'build-scripts/build-release.py'
  103. - name: 'Download source archives'
  104. uses: actions/download-artifact@v4
  105. with:
  106. name: sources
  107. path: '${{ github.workspace }}'
  108. - name: 'Untar ${{ needs.src.outputs.src-tar-gz }}'
  109. id: tar
  110. run: |
  111. mkdir -p "${{ github.workspace }}/tardir"
  112. tar -C "${{ github.workspace }}/tardir" -v -x -f "${{ github.workspace }}/${{ needs.src.outputs.src-tar-gz }}"
  113. echo "path=${{ github.workspace }}/tardir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  114. - name: 'Build SDL3.dmg'
  115. id: releaser
  116. shell: bash
  117. run: |
  118. python build-scripts/build-release.py \
  119. --actions dmg \
  120. --commit ${{ inputs.commit }} \
  121. --root "${{ steps.tar.outputs.path }}" \
  122. --github \
  123. --debug
  124. - name: 'Store DMG image file'
  125. uses: actions/upload-artifact@v4
  126. with:
  127. name: dmg
  128. path: '${{ github.workspace }}/dist'
  129. dmg-verify:
  130. needs: [dmg, src]
  131. runs-on: macos-latest
  132. steps:
  133. - name: 'Download source archives'
  134. uses: actions/download-artifact@v4
  135. with:
  136. name: sources
  137. path: '${{ github.workspace }}'
  138. - name: 'Download ${{ needs.dmg.outputs.dmg }}'
  139. uses: actions/download-artifact@v4
  140. with:
  141. name: dmg
  142. path: '${{ github.workspace }}'
  143. - name: 'Untar ${{ needs.src.outputs.src-tar-gz }}'
  144. id: src
  145. run: |
  146. mkdir -p /tmp/tardir
  147. tar -C /tmp/tardir -v -x -f "${{ github.workspace }}/${{ needs.src.outputs.src-tar-gz }}"
  148. echo "path=/tmp/tardir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  149. - name: 'Mount ${{ needs.dmg.outputs.dmg }}'
  150. id: mount
  151. run: |
  152. hdiutil attach '${{ github.workspace }}/${{ needs.dmg.outputs.dmg }}'
  153. mount_point="/Volumes/${{ needs.src.outputs.project }}"
  154. if [ ! -d "$mount_point/${{ needs.src.outputs.project }}.xcframework" ]; then
  155. echo "Cannot find ${{ needs.src.outputs.project }}.xcframework!"
  156. exit 1
  157. fi
  158. echo "mount_point=$mount_point">>$GITHUB_OUTPUT
  159. - name: 'CMake (configure + build) Darwin'
  160. run: |
  161. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  162. -DTEST_FULL=FALSE \
  163. -DTEST_STATIC=FALSE \
  164. -DTEST_TEST=FALSE \
  165. -DCMAKE_PREFIX_PATH="${{ steps.mount.outputs.mount_point }}" \
  166. -DCMAKE_SYSTEM_NAME=Darwin \
  167. -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \
  168. -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 \
  169. -Werror=dev \
  170. -B build_darwin
  171. cmake --build build_darwin --config Release --verbose
  172. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  173. -DTEST_FULL=FALSE \
  174. -DTEST_STATIC=FALSE \
  175. -DTEST_TEST=FALSE \
  176. -DCMAKE_PREFIX_PATH="${{ steps.mount.outputs.mount_point }}/SDL3.xcframework/macos-arm64_x86_64" \
  177. -DCMAKE_SYSTEM_NAME=Darwin \
  178. -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \
  179. -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 \
  180. -Werror=dev \
  181. -B build_darwin_2
  182. cmake --build build_darwin --config Release --verbose
  183. - name: 'CMake (configure + build) iOS'
  184. run: |
  185. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  186. -DTEST_FULL=FALSE \
  187. -DTEST_STATIC=FALSE \
  188. -DTEST_TEST=FALSE \
  189. -DCMAKE_PREFIX_PATH="${{ steps.mount.outputs.mount_point }}" \
  190. -DCMAKE_SYSTEM_NAME=iOS \
  191. -DCMAKE_OSX_ARCHITECTURES="arm64" \
  192. -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \
  193. -Werror=dev \
  194. -B build_ios
  195. cmake --build build_ios --config Release --verbose
  196. - name: 'CMake (configure + build) tvOS'
  197. run: |
  198. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  199. -DTEST_FULL=FALSE \
  200. -DTEST_STATIC=FALSE \
  201. -DTEST_TEST=FALSE \
  202. -DCMAKE_PREFIX_PATH="${{ steps.mount.outputs.mount_point }}" \
  203. -DCMAKE_SYSTEM_NAME=tvOS \
  204. -DCMAKE_OSX_ARCHITECTURES="arm64" \
  205. -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \
  206. -Werror=dev \
  207. -B build_tvos
  208. cmake --build build_tvos --config Release --verbose
  209. - name: 'CMake (configure + build) iOS simulator'
  210. run: |
  211. sysroot=$(xcodebuild -version -sdk iphonesimulator Path)
  212. echo "sysroot=$sysroot"
  213. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  214. -DTEST_FULL=FALSE \
  215. -DTEST_STATIC=FALSE \
  216. -DTEST_TEST=FALSE \
  217. -DCMAKE_PREFIX_PATH="${{ steps.mount.outputs.mount_point }}" \
  218. -DCMAKE_SYSTEM_NAME=iOS \
  219. -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \
  220. -DCMAKE_OSX_SYSROOT="${sysroot}" \
  221. -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \
  222. -Werror=dev \
  223. -B build_ios_simulator
  224. cmake --build build_ios_simulator --config Release --verbose
  225. - name: 'CMake (configure + build) tvOS simulator'
  226. run: |
  227. sysroot=$(xcodebuild -version -sdk appletvsimulator Path)
  228. echo "sysroot=$sysroot"
  229. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  230. -DTEST_FULL=FALSE \
  231. -DTEST_STATIC=FALSE \
  232. -DTEST_TEST=FALSE \
  233. -DCMAKE_PREFIX_PATH="${{ steps.mount.outputs.mount_point }}" \
  234. -DCMAKE_SYSTEM_NAME=tvOS \
  235. -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \
  236. -DCMAKE_OSX_SYSROOT="${sysroot}" \
  237. -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \
  238. -Werror=dev \
  239. -B build_tvos_simulator
  240. cmake --build build_tvos_simulator --config Release --verbose
  241. msvc:
  242. needs: [src]
  243. runs-on: windows-2019
  244. outputs:
  245. VC-x86: ${{ steps.releaser.outputs.VC-x86 }}
  246. VC-x64: ${{ steps.releaser.outputs.VC-x64 }}
  247. VC-arm64: ${{ steps.releaser.outputs.VC-arm64 }}
  248. VC-devel: ${{ steps.releaser.outputs.VC-devel }}
  249. steps:
  250. - name: 'Set up Python'
  251. uses: actions/setup-python@v5
  252. with:
  253. python-version: '3.11'
  254. - name: 'Fetch build-release.py'
  255. uses: actions/checkout@v4
  256. with:
  257. sparse-checkout: 'build-scripts/build-release.py'
  258. - name: 'Download source archives'
  259. uses: actions/download-artifact@v4
  260. with:
  261. name: sources
  262. path: '${{ github.workspace }}'
  263. - name: 'Unzip ${{ needs.src.outputs.src-zip }}'
  264. id: zip
  265. run: |
  266. New-Item C:\temp -ItemType Directory -ErrorAction SilentlyContinue
  267. cd C:\temp
  268. unzip "${{ github.workspace }}/${{ needs.src.outputs.src-zip }}"
  269. echo "path=C:\temp\${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$Env:GITHUB_OUTPUT
  270. - name: 'Build MSVC binary archives'
  271. id: releaser
  272. run: |
  273. python build-scripts/build-release.py `
  274. --actions msvc `
  275. --commit ${{ inputs.commit }} `
  276. --root "${{ steps.zip.outputs.path }}" `
  277. --github `
  278. --debug
  279. - name: 'Store MSVC archives'
  280. uses: actions/upload-artifact@v4
  281. with:
  282. name: win32
  283. path: '${{ github.workspace }}/dist'
  284. msvc-verify:
  285. needs: [msvc, src]
  286. runs-on: windows-latest
  287. steps:
  288. - name: 'Fetch .github/actions/setup-ninja/action.yml'
  289. uses: actions/checkout@v4
  290. with:
  291. sparse-checkout: '.github/actions/setup-ninja/action.yml'
  292. - name: 'Download source archives'
  293. uses: actions/download-artifact@v4
  294. with:
  295. name: sources
  296. path: '${{ github.workspace }}'
  297. - name: 'Download MSVC binaries'
  298. uses: actions/download-artifact@v4
  299. with:
  300. name: win32
  301. path: '${{ github.workspace }}'
  302. - name: 'Unzip ${{ needs.src.outputs.src-zip }}'
  303. id: src
  304. run: |
  305. mkdir '${{ github.workspace }}/sources'
  306. cd '${{ github.workspace }}/sources'
  307. unzip "${{ github.workspace }}/${{ needs.src.outputs.src-zip }}"
  308. echo "path=${{ github.workspace }}/sources/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$env:GITHUB_OUTPUT
  309. - name: 'Unzip ${{ needs.msvc.outputs.VC-devel }}'
  310. id: bin
  311. run: |
  312. mkdir '${{ github.workspace }}/vc'
  313. cd '${{ github.workspace }}/vc'
  314. unzip "${{ github.workspace }}/${{ needs.msvc.outputs.VC-devel }}"
  315. echo "path=${{ github.workspace }}/vc/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$env:GITHUB_OUTPUT
  316. - name: Set up ninja
  317. uses: ./.github/actions/setup-ninja
  318. - name: 'Configure vcvars x86'
  319. uses: ilammy/msvc-dev-cmd@v1
  320. with:
  321. arch: x64_x86
  322. - name: 'CMake (configure + build + tests) x86'
  323. run: |
  324. cmake -S "${{ steps.src.outputs.path }}/cmake/test" `
  325. -B build_x86 `
  326. -GNinja `
  327. -DCMAKE_BUILD_TYPE=Debug `
  328. -Werror=dev `
  329. -DTEST_FULL=TRUE `
  330. -DTEST_STATIC=FALSE `
  331. -DTEST_SHARED=TRUE `
  332. -DTEST_TEST=TRUE `
  333. -DCMAKE_SUPPRESS_REGENERATION=TRUE `
  334. -DCMAKE_PREFIX_PATH="${{ steps.bin.outputs.path }}"
  335. Start-Sleep -Seconds 2
  336. cmake --build build_x86 --config Release --verbose
  337. ctest --test-dir build_x86 --no-tests=error -C Release --output-on-failure
  338. - name: 'Configure vcvars x64'
  339. uses: ilammy/msvc-dev-cmd@v1
  340. with:
  341. arch: x64
  342. - name: 'CMake (configure + build + tests) x64'
  343. run: |
  344. cmake -S "${{ steps.src.outputs.path }}/cmake/test" `
  345. -B build_x64 `
  346. -GNinja `
  347. -DCMAKE_BUILD_TYPE=Debug `
  348. -Werror=dev `
  349. -DTEST_FULL=TRUE `
  350. -DTEST_STATIC=FALSE `
  351. -DTEST_SHARED=TRUE `
  352. -DTEST_TEST=TRUE `
  353. -DCMAKE_SUPPRESS_REGENERATION=TRUE `
  354. -DCMAKE_PREFIX_PATH="${{ steps.bin.outputs.path }}"
  355. Start-Sleep -Seconds 2
  356. cmake --build build_x64 --config Release --verbose
  357. ctest --test-dir build_x64 --no-tests=error -C Release --output-on-failure
  358. - name: 'Configure vcvars arm64'
  359. uses: ilammy/msvc-dev-cmd@v1
  360. with:
  361. arch: x64_arm64
  362. - name: 'CMake (configure + build) arm64'
  363. run: |
  364. cmake -S "${{ steps.src.outputs.path }}/cmake/test" `
  365. -B build_arm64 `
  366. -GNinja `
  367. -DCMAKE_BUILD_TYPE=Debug `
  368. -Werror=dev `
  369. -DTEST_FULL=TRUE `
  370. -DTEST_STATIC=FALSE `
  371. -DTEST_SHARED=TRUE `
  372. -DTEST_TEST=TRUE `
  373. -DCMAKE_SUPPRESS_REGENERATION=TRUE `
  374. -DCMAKE_PREFIX_PATH="${{ steps.bin.outputs.path }}"
  375. Start-Sleep -Seconds 2
  376. cmake --build build_arm64 --config Release --verbose
  377. - name: 'CMake (configure + build) arm64ec'
  378. run: |
  379. cmake -S "${{ steps.src.outputs.path }}/cmake/test" `
  380. -B build_arm64ec `
  381. -GNinja `
  382. -DCMAKE_BUILD_TYPE=Debug `
  383. -Werror=dev `
  384. -DTEST_FULL=TRUE `
  385. -DTEST_STATIC=FALSE `
  386. -DTEST_SHARED=TRUE `
  387. -DTEST_TEST=TRUE `
  388. -DSDL_DISABLE_AVX=TRUE `
  389. -DSDL_DISABLE_AVX2=TRUE `
  390. -DSDL_DISABLE_AVX512F=TRUE `
  391. -DCMAKE_SUPPRESS_REGENERATION=TRUE `
  392. -DCMAKE_C_FLAGS="/arm64EC" `
  393. -DCMAKE_CXX_FLAGS="/arm64EC" `
  394. -DCMAKE_EXE_LINKER_FLAGS="/MACHINE:ARM64EC" `
  395. -DCMAKE_SHARED_LINKER_FLAGS="/MACHINE:ARM64EC" `
  396. -DCMAKE_STATIC_LINKER_FLAGS="/MACHINE:ARM64EC" `
  397. -DCMAKE_PREFIX_PATH="${{ steps.bin.outputs.path }}"
  398. Start-Sleep -Seconds 2
  399. cmake --build build_arm64ec --config Release --verbose
  400. mingw:
  401. needs: [src]
  402. runs-on: ubuntu-24.04 # FIXME: current ubuntu-latest ships an outdated mingw, replace with ubuntu-latest once 24.04 becomes the new default
  403. outputs:
  404. mingw-devel-tar-gz: ${{ steps.releaser.outputs.mingw-devel-tar-gz }}
  405. mingw-devel-tar-xz: ${{ steps.releaser.outputs.mingw-devel-tar-xz }}
  406. steps:
  407. - name: 'Set up Python'
  408. uses: actions/setup-python@v5
  409. with:
  410. python-version: '3.11'
  411. - name: 'Fetch build-release.py'
  412. uses: actions/checkout@v4
  413. with:
  414. sparse-checkout: 'build-scripts/build-release.py'
  415. - name: 'Install Mingw toolchain'
  416. run: |
  417. sudo apt-get update -y
  418. sudo apt-get install -y gcc-mingw-w64 g++-mingw-w64 ninja-build
  419. - name: 'Download source archives'
  420. uses: actions/download-artifact@v4
  421. with:
  422. name: sources
  423. path: '${{ github.workspace }}'
  424. - name: 'Untar ${{ needs.src.outputs.src-tar-gz }}'
  425. id: tar
  426. run: |
  427. mkdir -p /tmp/tardir
  428. tar -C /tmp/tardir -v -x -f "${{ github.workspace }}/${{ needs.src.outputs.src-tar-gz }}"
  429. echo "path=/tmp/tardir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  430. - name: 'Build MinGW binary archives'
  431. id: releaser
  432. run: |
  433. python build-scripts/build-release.py \
  434. --actions mingw \
  435. --commit ${{ inputs.commit }} \
  436. --root "${{ steps.tar.outputs.path }}" \
  437. --github \
  438. --debug
  439. - name: 'Store MinGW archives'
  440. uses: actions/upload-artifact@v4
  441. with:
  442. name: mingw
  443. path: '${{ github.workspace }}/dist'
  444. mingw-verify:
  445. needs: [mingw, src]
  446. runs-on: ubuntu-latest
  447. steps:
  448. - name: 'Install Mingw toolchain'
  449. run: |
  450. sudo apt-get update -y
  451. sudo apt-get install -y gcc-mingw-w64 g++-mingw-w64 ninja-build
  452. - name: 'Download source archives'
  453. uses: actions/download-artifact@v4
  454. with:
  455. name: sources
  456. path: '${{ github.workspace }}'
  457. - name: 'Download MinGW binaries'
  458. uses: actions/download-artifact@v4
  459. with:
  460. name: mingw
  461. path: '${{ github.workspace }}'
  462. - name: 'Untar ${{ needs.src.outputs.src-tar-gz }}'
  463. id: src
  464. run: |
  465. mkdir -p /tmp/tardir
  466. tar -C /tmp/tardir -v -x -f "${{ github.workspace }}/${{ needs.src.outputs.src-tar-gz }}"
  467. echo "path=/tmp/tardir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  468. - name: 'Untar ${{ needs.mingw.outputs.mingw-devel-tar-gz }}'
  469. id: bin
  470. run: |
  471. mkdir -p /tmp/mingw-tardir
  472. tar -C /tmp/mingw-tardir -v -x -f "${{ github.workspace }}/${{ needs.mingw.outputs.mingw-devel-tar-gz }}"
  473. echo "path=/tmp/mingw-tardir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  474. - name: 'CMake (configure + build) i686'
  475. run: |
  476. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  477. -DCMAKE_BUILD_TYPE="Release" \
  478. -DTEST_FULL=TRUE \
  479. -DTEST_STATIC=FALSE \
  480. -DTEST_TEST=TRUE \
  481. -DCMAKE_PREFIX_PATH="${{ steps.bin.outputs.path }}" \
  482. -DCMAKE_TOOLCHAIN_FILE="${{ steps.src.outputs.path }}/build-scripts/cmake-toolchain-mingw64-i686.cmake" \
  483. -DCMAKE_C_FLAGS="-DSDL_DISABLE_SSE4_2" \
  484. -Werror=dev \
  485. -B build_x86
  486. cmake --build build_x86 --config Release --verbose
  487. - name: 'CMake (configure + build) x86_64'
  488. run: |
  489. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  490. -DCMAKE_BUILD_TYPE="Release" \
  491. -DTEST_FULL=TRUE \
  492. -DTEST_STATIC=false \
  493. -DTEST_TEST=TRUE \
  494. -DCMAKE_PREFIX_PATH="${{ steps.bin.outputs.path }}" \
  495. -DCMAKE_TOOLCHAIN_FILE="${{ steps.src.outputs.path }}/build-scripts/cmake-toolchain-mingw64-x86_64.cmake" \
  496. -DCMAKE_C_FLAGS="-DSDL_DISABLE_SSE4_2" \
  497. -Werror=dev \
  498. -B build_x64
  499. cmake --build build_x64 --config Release --verbose
  500. android:
  501. needs: [src]
  502. runs-on: ubuntu-latest
  503. outputs:
  504. android-aar: ${{ steps.releaser.outputs.android-aar }}
  505. steps:
  506. - name: 'Set up Python'
  507. uses: actions/setup-python@v5
  508. with:
  509. python-version: '3.11'
  510. - name: 'Fetch build-release.py'
  511. uses: actions/checkout@v4
  512. with:
  513. sparse-checkout: 'build-scripts/build-release.py'
  514. - name: 'Setup Android NDK'
  515. uses: nttld/setup-ndk@v1
  516. with:
  517. local-cache: true
  518. ndk-version: r21e
  519. - name: 'Setup Java JDK'
  520. uses: actions/setup-java@v4
  521. with:
  522. distribution: 'temurin'
  523. java-version: '11'
  524. - name: 'Install ninja'
  525. run: |
  526. sudo apt-get update -y
  527. sudo apt-get install -y ninja-build
  528. - name: 'Download source archives'
  529. uses: actions/download-artifact@v4
  530. with:
  531. name: sources
  532. path: '${{ github.workspace }}'
  533. - name: 'Untar ${{ needs.src.outputs.src-tar-gz }}'
  534. id: tar
  535. run: |
  536. mkdir -p /tmp/tardir
  537. tar -C /tmp/tardir -v -x -f "${{ github.workspace }}/${{ needs.src.outputs.src-tar-gz }}"
  538. echo "path=/tmp/tardir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  539. - name: 'Build Android prefab binary archive(s)'
  540. id: releaser
  541. run: |
  542. python build-scripts/build-release.py \
  543. --actions android \
  544. --commit ${{ inputs.commit }} \
  545. --root "${{ steps.tar.outputs.path }}" \
  546. --github \
  547. --debug
  548. - name: 'Store Android archive(s)'
  549. uses: actions/upload-artifact@v4
  550. with:
  551. name: android
  552. path: '${{ github.workspace }}/dist'
  553. android-verify:
  554. needs: [android, src]
  555. runs-on: ubuntu-latest
  556. steps:
  557. - name: 'Set up Python'
  558. uses: actions/setup-python@v5
  559. with:
  560. python-version: '3.11'
  561. - uses: actions/setup-java@v4
  562. with:
  563. distribution: 'temurin'
  564. java-version: '17'
  565. - name: 'Download source archives'
  566. uses: actions/download-artifact@v4
  567. with:
  568. name: sources
  569. path: '${{ github.workspace }}'
  570. - name: 'Download Android .aar archive'
  571. uses: actions/download-artifact@v4
  572. with:
  573. name: android
  574. path: '${{ github.workspace }}'
  575. - name: 'Untar ${{ needs.src.outputs.src-tar-gz }}'
  576. id: src
  577. run: |
  578. mkdir -p /tmp/tardir
  579. tar -C /tmp/tardir -v -x -f "${{ github.workspace }}/${{ needs.src.outputs.src-tar-gz }}"
  580. echo "path=/tmp/tardir/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}" >>$GITHUB_OUTPUT
  581. - name: 'Extract Android SDK from AAR'
  582. id: sdk
  583. run: |
  584. cd /tmp
  585. unzip "${{ github.workspace }}/${{ needs.android.outputs.android-aar }}"
  586. python "${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}.aar" -o /tmp/SDL3-android
  587. echo "prefix=/tmp/SDL3-android" >>$GITHUB_OUTPUT
  588. echo "sdl3-aar=/tmp/${{ needs.src.outputs.project }}-${{ needs.src.outputs.version }}.aar" >>$GITHUB_OUTPUT
  589. - name: 'CMake (configure + build) x86, x64, arm32, arm64'
  590. run: |
  591. android_abis="x86 x86_64 armeabi-v7a arm64-v8a"
  592. for android_abi in ${android_abis}; do
  593. echo "Configuring ${android_abi}..."
  594. cmake -S "${{ steps.src.outputs.path }}/cmake/test" \
  595. -DTEST_FULL=TRUE \
  596. -DTEST_STATIC=FALSE \
  597. -DTEST_TEST=TRUE \
  598. -DCMAKE_PREFIX_PATH="${{ steps.sdk.outputs.prefix }}" \
  599. -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake \
  600. -DANDROID_ABI=${android_abi} \
  601. -DCMAKE_BUILD_TYPE=Release \
  602. -B "${android_abi}"
  603. echo "Building ${android_abi}..."
  604. cmake --build "${android_abi}" --config Release --verbose
  605. done
  606. - name: 'Create gradle project'
  607. id: create-gradle-project
  608. run: |
  609. python ${{ steps.src.outputs.path }}/build-scripts/create-android-project.py \
  610. org.libsdl.testspriteminimal \
  611. ${{ steps.src.outputs.path }}/test/testspriteminimal.c \
  612. ${{ steps.src.outputs.path }}/test/icon.h \
  613. --variant aar \
  614. --output "/tmp/projects"
  615. echo "path=/tmp/projects/org.libsdl.testspriteminimal" >>$GITHUB_OUTPUT
  616. - name: 'Copy SDL3 aar into Gradle project'
  617. run: |
  618. cp "${{ steps.sdk.outputs.sdl3-aar }}" "${{ steps.create-gradle-project.outputs.path }}/app/libs"
  619. echo ""
  620. echo "Project contents:"
  621. echo ""
  622. find "${{ steps.create-gradle-project.outputs.path }}"
  623. - name: 'Build app (Gradle & CMake)'
  624. run: |
  625. cd "${{ steps.create-gradle-project.outputs.path }}"
  626. ./gradlew -i assembleRelease -Pandroid.native.buildOutput=verbose -PBUILD_WITH_CMAKE=1
  627. - name: 'Build app (Gradle & ndk-build)'
  628. run: |
  629. cd "${{ steps.create-gradle-project.outputs.path }}"
  630. ./gradlew -i assembleRelease -Pandroid.native.buildOutput=verbose