release.yml 30 KB

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