diff options
| author | spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> | 2022-02-07 01:06:33 +0100 |
|---|---|---|
| committer | spicyjpeg <88942473+spicyjpeg@users.noreply.github.com> | 2022-02-07 02:35:02 +0100 |
| commit | 40b7d95e9b16252d1aebb0706f3bba885f6e67cf (patch) | |
| tree | ec7604008134f312c403f895661c4c4d6caa96b6 | |
| parent | 57cda18641d16ba4e4fec52b5514e48db8ee4593 (diff) | |
| download | psn00bsdk-40b7d95e9b16252d1aebb0706f3bba885f6e67cf.tar.gz | |
Add LIBPSN00B_GENERATOR option, fix .incbin alignment
| -rw-r--r-- | .github/workflows/build.yml | 20 | ||||
| -rw-r--r-- | CMakeLists.txt | 33 | ||||
| -rw-r--r-- | CMakePresets.json | 11 | ||||
| -rw-r--r-- | doc/dev_notes.md | 21 | ||||
| -rw-r--r-- | doc/installation.md | 14 | ||||
| -rw-r--r-- | examples/README.md | 4 | ||||
| -rw-r--r-- | examples/demos/n00bdemo/data.s.template | 8 | ||||
| -rw-r--r-- | examples/graphics/billboard/tim.s.template | 1 | ||||
| -rw-r--r-- | examples/graphics/render2tex/texture.s.template | 1 | ||||
| -rw-r--r-- | examples/graphics/rgb24/tim.s.template | 1 | ||||
| -rw-r--r-- | examples/graphics/tilesasm/data.s.template | 1 | ||||
| -rw-r--r-- | examples/system/childexec/child_exe.s.template | 1 | ||||
| -rw-r--r-- | libpsn00b/cmake/flags.cmake | 11 |
13 files changed, 93 insertions, 34 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a72f5d3..a2a5510 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,9 +83,11 @@ jobs: # No surprises here either. The GitHub Actions VMs even come with most of the # dependencies required to build PSn00bSDK preinstalled. + # NOTE: the workaround to allow the toolchain cache to be loaded (see below) + # doesn't seem to work on Windows Server 2022 currently. build-sdk-windows: name: Build PSn00bSDK on Windows - runs-on: windows-latest + runs-on: windows-2019 needs: build-gcc steps: @@ -111,12 +113,8 @@ jobs: - name: Fetch repo contents uses: actions/checkout@v2 with: - path: sdk - - - name: Update repo submodules - run: | - cd sdk - git submodule update --init --recursive + path: sdk + submodules: recursive - name: Build and package PSn00bSDK run: | @@ -159,12 +157,8 @@ jobs: - name: Fetch repo contents uses: actions/checkout@v2 with: - path: sdk - - - name: Update repo submodules - run: | - cd sdk - git submodule update --init --recursive + path: sdk + submodules: recursive - name: Build and package PSn00bSDK run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index 2079fd1..1eca26e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ # PSn00bSDK main build script -# (C) 2021 spicyjpeg - MPL licensed +# (C) 2021-2022 spicyjpeg - MPL licensed # NOTE: CMake doesn't support using multiple toolchains in a single project, # so we can't use add_subdirectory() to build both the libraries and tools. A @@ -39,6 +39,10 @@ set( CACHE BOOL "Skip building SDK examples (not required for installation)" ) set( + LIBPSN00B_GENERATOR ${CMAKE_GENERATOR} + CACHE STRING "CMake generator to use for building libpsn00b and examples" +) +set( PSN00BSDK_GIT_TAG "" CACHE STRING "Git tag or branch name (used by CI)" ) @@ -47,6 +51,24 @@ set( CACHE STRING "Git commit hash (used by CI)" ) +# Attempt to automatically select a suitable CMake generator to build libpsn00b +# and the examples. Only Ninja and makefile-based generators can be used, as +# other generators (VS and Xcode) do not allow custom toolchains to be used. +if(NOT LIBPSN00B_GENERATOR MATCHES ".*(Make|Makefiles|Ninja)( Multi-Config)?$") + find_program(_ninja ninja NO_CACHE) + + if(_ninja STREQUAL "_ninja-NOTFOUND") + message(FATAL_ERROR "LIBPSN00B_GENERATOR must be set to a CMake generator which supports custom toolchains (Ninja or make). The current default generator (${CMAKE_GENERATOR}) will be used to build tools.") + else() + set( + LIBPSN00B_GENERATOR Ninja + CACHE STRING "CMake generator to use for building libpsn00b and examples" + FORCE + ) + message(WARNING "The current default generator (${CMAKE_GENERATOR}) will be used to build tools but does not support custom toolchains. Ninja will be used instead for building libpsn00b and examples.") + endif() +endif() + string(TIMESTAMP PSN00BSDK_BUILD_DATE UTC) # Forward some important variables to mkpsxiso and to the subprojects (they are @@ -81,7 +103,8 @@ set( # Ensure PSn00bSDK isn't being built using the toolchain file from PSn00bSDK # itself (or from another version of it). if(CMAKE_TOOLCHAIN_FILE MATCHES ".*libpsn00b[/\\]cmake[/\\]sdk\.cmake$") - message(FATAL_ERROR "CMAKE_TOOLCHAIN_FILE is set to the toolchain file of an existing PSn00bSDK installation. It must be unset or overridden by passing '-DCMAKE_TOOLCHAIN_FILE=\"\"' to CMake.") + unset(CMAKE_TOOLCHAIN_FILE CACHE) + message(WARNING "CMAKE_TOOLCHAIN_FILE is currently set to the toolchain file of an existing PSn00bSDK installation. It will be ignored.") endif() ## Subprojects @@ -93,18 +116,22 @@ endif() ExternalProject_Add( tools SOURCE_DIR ${PROJECT_SOURCE_DIR}/tools + BINARY_DIR tools-build CMAKE_CACHE_ARGS ${_sdk_args} INSTALL_DIR install_tree ) ExternalProject_Add( mkpsxiso SOURCE_DIR ${PROJECT_SOURCE_DIR}/tools/mkpsxiso + BINARY_DIR mkpsxiso-build CMAKE_CACHE_ARGS ${_sdk_args} INSTALL_DIR install_tree ) ExternalProject_Add( libpsn00b SOURCE_DIR ${PROJECT_SOURCE_DIR}/libpsn00b + BINARY_DIR libpsn00b-build + CMAKE_GENERATOR ${LIBPSN00B_GENERATOR} CMAKE_CACHE_ARGS ${_sdk_args} INSTALL_DIR install_tree #DEPENDS tools @@ -112,6 +139,8 @@ ExternalProject_Add( ExternalProject_Add( examples SOURCE_DIR ${PROJECT_SOURCE_DIR}/examples + BINARY_DIR examples-build + CMAKE_GENERATOR ${LIBPSN00B_GENERATOR} CMAKE_CACHE_ARGS ${_examples_args} INSTALL_DIR examples DEPENDS libpsn00b tools mkpsxiso diff --git a/CMakePresets.json b/CMakePresets.json index d71c1ae..b103270 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -11,14 +11,16 @@ "displayName": "Default configuration", "description": "Use this preset when building the SDK for local installation.", "generator": "Ninja", - "binaryDir": "${sourceDir}/build" + "binaryDir": "${sourceDir}/build", + "warnings": { + "dev": false + } }, { "name": "package", "displayName": "Installer package", "description": "Use this preset to build installer packages via CPack.", - "generator": "Ninja", - "binaryDir": "${sourceDir}/build", + "inherits": "default", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "SKIP_EXAMPLES": "ON", @@ -29,11 +31,12 @@ "name": "ci", "displayName": "CI build", "description": "This preset is used by GitHub Actions to build PSn00bSDK.", - "generator": "Ninja", + "inherits": "default", "binaryDir": "${sourceDir}/../build", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", "BUNDLE_TOOLCHAIN": "ON", + "LIBPSN00B_GENERATOR": "Ninja", "PSN00BSDK_TARGET": "$env{GCC_TARGET}", "PSN00BSDK_GIT_TAG": "$env{GITHUB_REF_NAME}", "PSN00BSDK_GIT_COMMIT": "$env{GITHUB_SHA}" diff --git a/doc/dev_notes.md b/doc/dev_notes.md index 4873a59..a96d6ef 100644 --- a/doc/dev_notes.md +++ b/doc/dev_notes.md @@ -164,7 +164,24 @@ _- spicyjpeg_ toolchain script has options that can be set via custom variables (like `PSN00BSDK_TC` and `PSN00BSDK_TARGET` in PSn00bSDK), you'll have to set `CMAKE_TRY_COMPILE_PLATFORM_VARIABLES` to a list of variable names to be - exported to generated dummy projects. + exported to generated dummy projects. Additionally you may need to set + `CMAKE_TRY_COMPILE_TARGET_TYPE` to `STATIC_LIBRARY` to prevent CMake from + invoking the linker. + +- When `project()` is called, CMake uses the value of `CMAKE_SYSTEM_NAME` to + determine default values for several variables and properties. Most of these + defaults are undocumented: e.g. setting the system name to `Generic` (as + suggested by the docs for bare metal targets) will result in CMake assuming + that the target platform does not support dynamic linking, so you'll have to + turn it back on by setting the `TARGET_SUPPORTS_SHARED_LIBS` global property + *after* invoking `project()`. + +- It is not possible to use custom toolchains (through toolchain files or by + setting `CMAKE_*_COMPILER` manually) with any of the Xcode or VS generators, + as their respective build systems handle compiler selection internally rather + than relying on variables passed by CMake. Ninja or `make` is thus always + required to build PSn00bSDK and any projects made with it, even if the + host-side tools are built using Xcode or MSVC. - There is no way to use multiple toolchains (PS1 + host) in a single project, even if you use `add_subdirectory()` to execute multiple project files @@ -263,4 +280,4 @@ _- spicyjpeg_ space. ----------------------------------------- -_Last updated on 2022-01-30 by spicyjpeg_ +_Last updated on 2022-02-06 by spicyjpeg_ diff --git a/doc/installation.md b/doc/installation.md index 1646653..c766fd9 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -1,6 +1,14 @@ # Getting started with PSn00bSDK +**IMPORTANT**: due to a bug in `libflac` (used by `mkpsxiso`), building using +MinGW on Windows is currently broken. You'll have to install Visual Studio and +pass `-G "Visual Studio <version>"` to CMake when configuring PSn00bSDK to use +MSVC instead. Due to MSBuild limitations *you'll still need to install Ninja* +in order to build the SDK, as MSBuild is not compatible with custom toolchains. +This guide will be updated with detailed MSVC build instructions in the near +future. + ## Building and installing The instructions below are for Windows and Linux. Building on macOS hasn't been @@ -79,8 +87,8 @@ and installed properly. **NOTE**: Ninja is used by default to build the SDK. If you can't get it to work or don't have it installed, pass `-G "Unix Makefiles"` (or - `-G "MSYS Makefiles"` on Windows) to the first command to build using `make` - instead. + `-G "MinGW Makefiles"` on Windows) to the first command to build using + `make` instead. 6. Install the SDK to the path you chose (add `sudo` or run it from a command prompt with admin privileges if necessary): @@ -150,4 +158,4 @@ The toolchain script defines a few CMake macros to create PS1 executables, DLLs and CD images. See the [reference](cmake_reference.md) for details. ----------------------------------------- -_Last updated on 2021-12-29 by spicyjpeg_ +_Last updated on 2022-02-06 by spicyjpeg_ diff --git a/examples/README.md b/examples/README.md index 60ccd21..8b84e5e 100644 --- a/examples/README.md +++ b/examples/README.md @@ -76,7 +76,7 @@ are for rebuilding the examples *after* the SDK has been installed. Add `-DPSN00BSDK_TARGET=mipsel-unknown-elf` to the first command if your toolchain targets `mipsel-unknown-elf` rather than `mipsel-none-elf`. If you can't get Ninja to work or don't have it installed, you can also replace - `-G "Ninja"` with `-G "Unix Makefiles"` (`-G "MSYS Makefiles"` on Windows) + `-G "Ninja"` with `-G "Unix Makefiles"` (`-G "MinGW Makefiles"` on Windows) to build using `make` instead. This should create a `build` directory whose structure mirrors the one of @@ -84,4 +84,4 @@ are for rebuilding the examples *after* the SDK has been installed. CD images for each example. ----------------------------------------- -_Last updated on 2022-01-21 by spicyjpeg_ +_Last updated on 2022-02-06 by spicyjpeg_ diff --git a/examples/demos/n00bdemo/data.s.template b/examples/demos/n00bdemo/data.s.template index 9fbef2e..f659163 100644 --- a/examples/demos/n00bdemo/data.s.template +++ b/examples/demos/n00bdemo/data.s.template @@ -3,29 +3,35 @@ .global _lz_resources .type _lz_resources, @object _lz_resources: + .balign 4 .incbin "${PROJECT_BINARY_DIR}/data.lzp" #.global smd_mtekdisk #.type smd_mtekdisk, @object #smd_mtekdisk: +# .balign 4 # .incbin "data/mtekdisk.smd" #.global smd_mtektext #.type smd_mtektext, @object #smd_mtektext: +# .balign 4 # .incbin "data/mtektext.smd" #.global smd_star #.type smd_star, @object #smd_star: +# .balign 4 # .incbin "data/star.smd" #.global smd_psn00b #.type smd_psn00b, @object #smd_psn00b: +# .balign 4 # .incbin "data/psn00blogo.smd" #.global smd_scarletlogo #.type smd_scarletlogo, @object #smd_scarletlogo: -# .incbin "data/scarletlogo.smd"
\ No newline at end of file +# .balign 4 +# .incbin "data/scarletlogo.smd" diff --git a/examples/graphics/billboard/tim.s.template b/examples/graphics/billboard/tim.s.template index fbe7522..d9309bc 100644 --- a/examples/graphics/billboard/tim.s.template +++ b/examples/graphics/billboard/tim.s.template @@ -3,4 +3,5 @@ .global tim_image .type tim_image, @object tim_image: + .balign 4 # Required to correctly parse and load the image .incbin "${PROJECT_SOURCE_DIR}/texture64.tim" diff --git a/examples/graphics/render2tex/texture.s.template b/examples/graphics/render2tex/texture.s.template index 8b09ad8..48248b2 100644 --- a/examples/graphics/render2tex/texture.s.template +++ b/examples/graphics/render2tex/texture.s.template @@ -5,4 +5,5 @@ .global tim_blendpattern .type tim_blendpattern, @object tim_blendpattern: + .balign 4 # Required to correctly parse and load the image .incbin "${PROJECT_SOURCE_DIR}/blendpattern-16c.tim" diff --git a/examples/graphics/rgb24/tim.s.template b/examples/graphics/rgb24/tim.s.template index 9fb1fb6..205a081 100644 --- a/examples/graphics/rgb24/tim.s.template +++ b/examples/graphics/rgb24/tim.s.template @@ -3,4 +3,5 @@ .global tim_image .type tim_image, @object tim_image: + .balign 4 # Required to correctly parse and load the image .incbin "${PROJECT_SOURCE_DIR}/bunpattern.tim" diff --git a/examples/graphics/tilesasm/data.s.template b/examples/graphics/tilesasm/data.s.template index 1c4b01e..bec0b84 100644 --- a/examples/graphics/tilesasm/data.s.template +++ b/examples/graphics/tilesasm/data.s.template @@ -31,4 +31,5 @@ # declared in the C code # tim_tileset: + .balign 4 # Required to correctly parse and load the image .incbin "${PROJECT_SOURCE_DIR}/tiles_256.tim" diff --git a/examples/system/childexec/child_exe.s.template b/examples/system/childexec/child_exe.s.template index f76bb3d..31e7c49 100644 --- a/examples/system/childexec/child_exe.s.template +++ b/examples/system/childexec/child_exe.s.template @@ -3,4 +3,5 @@ .global child_exe # Insert spoopypasta .type child_exe, @object child_exe: + .balign 4 .incbin "${PROJECT_BINARY_DIR}/child.exe" diff --git a/libpsn00b/cmake/flags.cmake b/libpsn00b/cmake/flags.cmake index 249c5b4..e31773f 100644 --- a/libpsn00b/cmake/flags.cmake +++ b/libpsn00b/cmake/flags.cmake @@ -5,10 +5,10 @@ # directories and compiler flags when a target is linked against them. The # following targets are currently defined: # - psn00bsdk_common -# - psn00bsdk_object_lib (same as psn00bsdk_common) # - psn00bsdk_static_exe # - psn00bsdk_dynamic_exe # - psn00bsdk_static_lib +# - psn00bsdk_object_lib (same as psn00bsdk_static_lib) # - psn00bsdk_shared_lib # - psn00bsdk_module_lib (same as psn00bsdk_shared_lib) # @@ -21,12 +21,7 @@ add_library(psn00bsdk_common INTERFACE) foreach( _target IN ITEMS - object_lib - static_exe - dynamic_exe - static_lib - shared_lib - module_lib + static_exe dynamic_exe static_lib object_lib shared_lib module_lib ) add_library (psn00bsdk_${_target} INTERFACE) target_link_libraries(psn00bsdk_${_target} INTERFACE psn00bsdk_common) @@ -128,6 +123,8 @@ target_compile_options( -Wa,--strip-local-absolute ) +target_link_libraries(psn00bsdk_object_lib INTERFACE psn00bsdk_static_lib) + # Options for dynamically-loaded libraries: # - Position-independent code enabled # - GP-relative addressing disabled (incompatible with ABI calls) |
