From 7702ef2258d357559f10ee433e961646b59bf6d8 Mon Sep 17 00:00:00 2001 From: spicyjpeg Date: Wed, 29 May 2024 21:16:24 +0200 Subject: [PATCH] Fix up build scripts, add GitHub Actions CI --- .github/scripts/buildRelease.sh | 51 +++++++++ .github/scripts/buildToolchain.sh | 110 ++++++++++++++++++++ .github/workflows/build.yml | 60 +++++++++++ CMakeLists.txt | 165 ++++++++++-------------------- assets/textures/background.png | Bin 636 -> 1114 bytes cd.json => cdrom.json | 8 +- cmake/setup.cmake | 38 +++++++ resourcestiny.json | 112 ++++++++++++++++++++ tools/buildCDImage.py | 4 +- tools/common/assets.py | 6 +- 10 files changed, 438 insertions(+), 116 deletions(-) create mode 100755 .github/scripts/buildRelease.sh create mode 100755 .github/scripts/buildToolchain.sh create mode 100644 .github/workflows/build.yml rename cd.json => cdrom.json (94%) create mode 100644 resourcestiny.json diff --git a/.github/scripts/buildRelease.sh b/.github/scripts/buildRelease.sh new file mode 100755 index 0000000..33faf8c --- /dev/null +++ b/.github/scripts/buildRelease.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +ROOT_DIR="$(pwd)" +PROJECT_DIR="$ROOT_DIR/cart-tool" +OPENBIOS_DIR="$ROOT_DIR/nugget/openbios" +TOOLCHAIN_DIR="$ROOT_DIR/gcc-mipsel-none-elf" + +## Build project + +cmake --preset release -DTOOLCHAIN_PATH="$TOOLCHAIN_DIR" "$PROJECT_DIR" \ + || exit 1 +cmake --build "$PROJECT_DIR/build" \ + || exit 1 + +RELEASE_NAME="$( + ls "$PROJECT_DIR/build" | + grep -E -o '^cart-tool-[0-9]+\.[0-9]+\.[0-9]+' | + head -n 1 +)" + +mkdir -p "$ROOT_DIR/$RELEASE_NAME" +cd "$ROOT_DIR/$RELEASE_NAME" +cp \ + "$PROJECT_DIR/build/$RELEASE_NAME.chd" \ + "$PROJECT_DIR/build/$RELEASE_NAME.iso" \ + "$PROJECT_DIR/build/$RELEASE_NAME.psexe" \ + "$PROJECT_DIR/build/readme.txt" \ + . + +## Build BIOS ROM + +cd "$OPENBIOS_DIR" + +make \ + BUILD=Release \ + PREFIX="$TOOLCHAIN_DIR/bin/mipsel-none-elf" \ + FORMAT=elf32-littlemips \ + FASTBOOT=true \ + EMBED_PSEXE="$PROJECT_DIR/build/${RELEASE_NAME}-tiny.psexe" \ + || exit 2 + +cd "$ROOT_DIR/$RELEASE_NAME" +cp "$OPENBIOS_DIR/openbios.bin" "${RELEASE_NAME}-bios.bin" + +## Package release + +zip -9 -r "$ROOT_DIR/$RELEASE_NAME.zip" . \ + || exit 3 + +#cd "$ROOT_DIR" +#rm -rf "$RELEASE_NAME" diff --git a/.github/scripts/buildToolchain.sh b/.github/scripts/buildToolchain.sh new file mode 100755 index 0000000..2963aa6 --- /dev/null +++ b/.github/scripts/buildToolchain.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +ROOT_DIR="$(pwd)" +BINUTILS_VERSION="2.41" +GCC_VERSION="13.2.0" +NUM_JOBS="4" + +if [ $# -eq 2 ]; then + PACKAGE_NAME="$1" + TARGET_NAME="$2" + BUILD_OPTIONS="" +elif [ $# -eq 3 ]; then + PACKAGE_NAME="$1" + TARGET_NAME="$2" + BUILD_OPTIONS="--build=x86_64-linux-gnu --host=$3" +else + echo "Usage: $0 [host triplet]" + exit 0 +fi + +## Download binutils and GCC + +if [ ! -d binutils-$BINUTILS_VERSION ]; then + wget "https://ftpmirror.gnu.org/gnu/binutils/binutils-$BINUTILS_VERSION.tar.xz" \ + || exit 1 + tar Jxf binutils-$BINUTILS_VERSION.tar.xz \ + || exit 1 + + rm -f binutils-$BINUTILS_VERSION.tar.xz +fi + +if [ ! -d gcc-$GCC_VERSION ]; then + wget "https://ftpmirror.gnu.org/gnu/gcc/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.xz" \ + || exit 1 + tar Jxf gcc-$GCC_VERSION.tar.xz \ + || exit 1 + + cd gcc-$GCC_VERSION + contrib/download_prerequisites \ + || exit 1 + + cd .. + rm -f gcc-$GCC_VERSION.tar.xz +fi + +## Build binutils + +mkdir -p binutils-build +cd binutils-build + +../binutils-$BINUTILS_VERSION/configure \ + --prefix="$ROOT_DIR/$PACKAGE_NAME" \ + $BUILD_OPTIONS \ + --target=$TARGET_NAME \ + --with-float=soft \ + --disable-docs \ + --disable-nls \ + --disable-werror \ + || exit 2 +make -j $NUM_JOBS \ + || exit 2 +make install-strip \ + || exit 2 + +cd .. +rm -rf binutils-build + +## Build GCC + +mkdir -p gcc-build +cd gcc-build + +../gcc-$GCC_VERSION/configure \ + --prefix="$ROOT_DIR/$PACKAGE_NAME" \ + $BUILD_OPTIONS \ + --target=$TARGET_NAME \ + --with-float=soft \ + --disable-docs \ + --disable-nls \ + --disable-werror \ + --disable-libada \ + --disable-libssp \ + --disable-libquadmath \ + --disable-threads \ + --disable-libgomp \ + --disable-libstdcxx-pch \ + --disable-hosted-libstdcxx \ + --enable-languages=c,c++ \ + --without-isl \ + --without-headers \ + --with-gnu-as \ + --with-gnu-ld \ + || exit 3 +make -j $NUM_JOBS \ + || exit 3 +make install-strip \ + || exit 3 + +cd .. +rm -rf gcc-build + +## Package toolchain + +#cd $PACKAGE_NAME + +#zip -9 -r ../$PACKAGE_NAME-$GCC_VERSION.zip . \ +# || exit 4 + +#cd .. +#rm -rf $PACKAGE_NAME diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..b394342 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,60 @@ +# The GCC toolchain is stored in the GitHub Actions cache after being built. To +# minimize build times, the toolchain build step is skipped if there is a cached +# copy of the toolchain that has not expired. + +name: Build +on: [ push, pull_request ] + +jobs: + build: + name: Run build + runs-on: ubuntu-latest + + steps: + - name: Initialize toolchain cache + id: cache + uses: actions/cache@v3 + with: + key: toolchain + path: gcc-mipsel-none-elf + + - name: Fetch repo contents + uses: actions/checkout@v4 + with: + path: cart-tool + + - name: Fetch OpenBIOS repo contents + uses: actions/checkout@v4 + with: + repository: pcsx-redux/nugget + path: nugget + submodules: recursive + + - name: Install prerequisites + run: | + sudo apt-get update -y + sudo apt-get install -y --no-install-recommends ninja-build mame-tools + sudo pip3 install -r cart-tool/tools/requirements.txt + + - name: Build GCC toolchain + if: ${{ steps.cache.outputs.cache-hit != 'true' }} + run: | + cart-tool/.github/scripts/buildToolchain.sh gcc-mipsel-none-elf mipsel-none-elf + + - name: Build project + run: | + cart-tool/.github/scripts/buildRelease.sh + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: build + if-no-files-found: error + path: cart-tool-*/** + + - name: Publish release + if: ${{ github.ref_type == 'tag' }} + uses: softprops/action-gh-release@v1 + with: + fail_on_unmatched_files: true + files: cart-tool-*.zip diff --git a/CMakeLists.txt b/CMakeLists.txt index ff68450..8f85db1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,12 +4,28 @@ cmake_minimum_required(VERSION 3.25) set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/cmake/toolchain.cmake") project( - cart_tool + cart-tool LANGUAGES C CXX ASM VERSION 0.4.3 DESCRIPTION "Konami System 573 security cartridge tool" ) +set( + RELEASE_INFO "${PROJECT_NAME} ${PROJECT_VERSION} - (C) 2022-2024 spicyjpeg" + CACHE STRING "Executable description and version string (optional)" +) +set( + RELEASE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}" + CACHE STRING "CD-ROM image and release package file name" +) + +string(TOUPPER "${RELEASE_NAME}" _cdVolumeName) +string(REGEX REPLACE "[^0-9A-Z_]" "_" _cdVolumeName "${_cdVolumeName}") +set( + CD_VOLUME_NAME "${_cdVolumeName}" + CACHE STRING "CD-ROM image volume label" +) + find_package(Python3 REQUIRED COMPONENTS Interpreter) find_program( CHDMAN_PATH chdman @@ -20,22 +36,6 @@ find_program( DOC "Path to MAME chdman tool (optional)" ) -string(TOUPPER "${PROJECT_NAME}" _name) -string(REPLACE "." "_" _version "${PROJECT_VERSION}") - -set( - RELEASE_INFO "${PROJECT_NAME} ${PROJECT_VERSION} - (C) 2022-2024 spicyjpeg" - CACHE STRING "Executable description and version string (optional)" -) -set( - RELEASE_NAME "${PROJECT_NAME}_${PROJECT_VERSION}" - CACHE STRING "CD-ROM image and release package file name" -) -set( - CD_VOLUME_NAME "${_name}_${_version}" - CACHE STRING "CD-ROM image volume label" -) - ## Files common to all executables add_library( @@ -171,14 +171,6 @@ target_compile_definitions( > ) -addExecutable( - boot 80010000 0 - src/boot/crt0.s - src/boot/main.cpp - src/common/util.cpp -) -target_link_libraries(boot PRIVATE bootFlags) - function(addLauncher address stackTop) addExecutable( launcher${address} ${address} ${stackTop} @@ -199,84 +191,60 @@ endfunction() addLauncher(801fd000 801ffff0) addLauncher(803fd000 803ffff0) -## Default resource archive +## Boot stub and resource archive -function(addBinaryFile target name sizeName path) - set(_file "${PROJECT_BINARY_DIR}/includes/${target}_${name}.s") - cmake_path(ABSOLUTE_PATH path OUTPUT_VARIABLE _path) +function(addBootStub name resourceName) + configure_file(${resourceName}.json ${resourceName}.json ESCAPE_QUOTES) - file( - CONFIGURE - OUTPUT "${_file}" - CONTENT [[ -.section .rodata.${name}, "a" -.balign 8 - -.global ${name} -.type ${name}, @object -.size ${name}, (${name}_end - ${name}) - -${name}: - .incbin "${_path}" -${name}_end: - -.section .rodata.${sizeName}, "a" -.balign 4 - -.global ${sizeName} -.type ${sizeName}, @object -.size ${sizeName}, 4 - -${sizeName}: - .int (${name}_end - ${name}) -]] - ESCAPE_QUOTES - NEWLINE_STYLE LF + add_custom_command( + COMMAND + "${Python3_EXECUTABLE}" + "${PROJECT_SOURCE_DIR}/tools/buildResourceArchive.py" + ${resourceName}.json + ${resourceName}.zip + OUTPUT ${resourceName}.zip + DEPENDS + ${resourceName}.json + assets/app.palette.json + assets/app.strings.json + main.psexe + launcher801fd000.psexe + launcher803fd000.psexe + COMMENT "Building ${name} resource archive" + VERBATIM ) - target_sources(${target} PRIVATE "${_file}") - set_source_files_properties("${_file}" PROPERTIES OBJECT_DEPENDS "${_path}") + addExecutable( + ${name} 80010000 0 + src/boot/crt0.s + src/boot/main.cpp + src/common/util.cpp + ) + addBinaryFile( + ${name} _resourceArchive _resourceArchiveLength + "${PROJECT_BINARY_DIR}/${resourceName}.zip" + ) + target_link_libraries(${name} PRIVATE bootFlags) endfunction() -configure_file(resources.json resources.json ESCAPE_QUOTES) - -add_custom_command( - COMMAND - "${Python3_EXECUTABLE}" - "${PROJECT_SOURCE_DIR}/tools/buildResourceArchive.py" - resources.json - resources.zip - OUTPUT resources.zip - DEPENDS - resources.json - assets/app.palette.json - assets/app.strings.json - main.psexe - launcher801fd000.psexe - launcher803fd000.psexe - COMMENT "Building resource archive" - VERBATIM -) -addBinaryFile( - boot _resourceArchive _resourceArchiveLength - "${PROJECT_BINARY_DIR}/resources.zip" -) +addBootStub("${RELEASE_NAME}" resources) +addBootStub("${RELEASE_NAME}-tiny" resourcestiny) ## CD-ROM image -configure_file(cd.json cd.json ESCAPE_QUOTES) +configure_file(cdrom.json cdrom.json ESCAPE_QUOTES) configure_file(assets/cdreadme.txt readme.txt NEWLINE_STYLE CRLF) add_custom_command( COMMAND "${Python3_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/tools/buildCDImage.py" - cd.json + cdrom.json "${RELEASE_NAME}.iso" OUTPUT "${RELEASE_NAME}.iso" DEPENDS - cd.json - boot.psexe + cdrom.json + "${RELEASE_NAME}" COMMENT "Building CD-ROM image" VERBATIM ) @@ -293,28 +261,7 @@ if(EXISTS "${CHDMAN_PATH}") VERBATIM ) - list(APPEND packageFiles "${RELEASE_NAME}.chd") + add_custom_target(cdrom ALL DEPENDS "${RELEASE_NAME}.chd") +else() + add_custom_target(cdrom ALL DEPENDS "${RELEASE_NAME}.iso") endif() - -## Release package - -list( - APPEND packageFiles - readme.txt - boot.psexe - "${RELEASE_NAME}.iso" -) - -add_custom_command( - COMMAND - "${CMAKE_COMMAND}" -E tar cf - "${RELEASE_NAME}.zip" - --format=zip - ${packageFiles} - OUTPUT "${RELEASE_NAME}.zip" - DEPENDS ${packageFiles} - COMMENT "Packaging built files" - VERBATIM -) - -add_custom_target(package ALL DEPENDS "${RELEASE_NAME}.zip") diff --git a/assets/textures/background.png b/assets/textures/background.png index c14dc4066a74c643eed8f94da1bc0d3571c794a0..c6a8ba173e0045f3d1428aa10a36db0ec5ec08ac 100644 GIT binary patch delta 1094 zcmV-M1iAbC1lkCYBYy-TNkldl`hOlrCJni+}Mp&mvZ^E1eGz(eAL; zZrj#PB{}E3DbSBW#G57B9itH{Tg0#d`glCf<-ZUj1RYjlw;uju?lQ|X7N;SnOI$`MCeN`p_as(PzVbGBXBBlNA9=|bTk^>hY>dZ(6sB-0n_^?C^*mSw^2vUAQDqqW98yMJ%{Fz9?s8kQ)0g*WfN{YQr4 z;4M7iAnq#J0BzeAlDS(rbq)rNEHVRG(j&AEj^V7{ytTHNELqpi&7cluJ;#F>AO?sH z#kg}9^=#5#6L0i0uOC2nzEbA?!=(tUgBTzNhyh}N7$63S0pi90F+dCu12kHThdY*K z>2U8U4u6Xd<3SKi@CV1lT*>fqNCg`|mXL8aAMIC4MYEN5;q=z2mgfVM2#x29);fgg zzX0?Gn%&Q!I+O?#y}&uWg{9EVvs|y&s}N#cSIW4ZbGxBmuh+WAsz;^JvMD-vTcqq+ zM>XzI)dn-n%1hE(AJtIHM(9AskWWU@T5GK-Jb%J@Ej?A6EEpeUlHKN3O8{j$Bj{_c zwWb4<_z$%b-en8=z&4NPgYCmIjG|YiEE_T5UDl$Hzn{-n#F~;=oN&9{5}!p99Wy22 zUDD};mjd2{DB*P@Y9i+xm?M&tJHtUKrIgyX?aldjZq3B=`3!%5zu%!V z*MEBOemG<`H*__k&KJ&_SI&^-x3Q>a4a5 z!sv8%CR>NDeuKjg)7D%@sWR%phwm z_G|p)q0{S~^h!))%tUlc5;6R|IV@J5GJokJHeKvB2_Q@&Y*<4kW!C-XqECjBHpc9X z{Q^tBB7M45K&ApzC5}^(KHVxHGq(A4UE!G~0!47sF9!#$y8qF-0y57~ERLC0M`v6^ zaa~t9&q%Qb$3InV z{hX*10D_r>@m3-!rsLFMF-xDN9v?5R_Ni(IF+kiHAO?s5Vt__!e=sEmQy=t?egFUf M07*qoM6N<$f)bJro&W#< delta 612 zcmcb`@rPxCay^r?r;B4q#jUrqwKq2#2)Jdk2X^+jC{6VEx8F%=;=~hEMbF%M$*^~V zx#n}>xqP*%>a*XdJ+0mox1Oo?x-bg^lRyIlivj~9hXaQL!>9G1e);CyHoKM2dw7EU zf<+oGDObNN%bXGe`O5ddleo{DpR3&{)0TL9{<_!Gx|dybj=g?*a-mH9l1X;LJ@bnLve$0C z7q_vyFxjE*_4R^imhP6>g)H@RXBsW}DRXI$>m!d)PxaebPwpiyi&(@Vb^M}gy`-#N z3a5w5v{S3ry?*-O(fh#cwNrlW*;MsaFZ)7JSg!nZ_5b@{?Y(i= zyN!!1{YvlDxAeWZv@6y8;$!xz?5c>oD^J+ z)5VW9IQ`yy<1DjA>>{Nf*EelXX tuple[ndarray, ndarray]: # Pad the palette to 16 or 256 colors. padAmount: int = (16 if (numColors <= 16) else 256) - numColors if padAmount: - clut = numpy.c_[ clut, numpy.zeros(padAmount, "