diff options
| author | John "Lameguy" Wilbert Villamor <lameguy64@gmail.com> | 2022-01-18 08:31:14 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-18 08:31:14 +0800 |
| commit | 05d44488bd5587786f4bd0286fc0f555c79aa46a (patch) | |
| tree | 5740f396d10a9580c3a39ca536544436898ff1b6 /libpsn00b/cmake | |
| parent | 08de895e8582dbc70b639ae5f511ab9ebfb4d68a (diff) | |
| parent | e9475e283a82665fe6c19bebc3318b5084f15a2e (diff) | |
| download | psn00bsdk-05d44488bd5587786f4bd0286fc0f555c79aa46a.tar.gz | |
Merge pull request #44 from spicyjpeg/actions
GitHub Actions CI, psxcd and libc fixes, new examples
Diffstat (limited to 'libpsn00b/cmake')
| -rw-r--r-- | libpsn00b/cmake/flags.cmake | 151 | ||||
| -rw-r--r-- | libpsn00b/cmake/internal_setup.cmake | 23 | ||||
| -rw-r--r-- | libpsn00b/cmake/sdk.cmake | 10 | ||||
| -rw-r--r-- | libpsn00b/cmake/virtual_targets.cmake | 109 |
4 files changed, 172 insertions, 121 deletions
diff --git a/libpsn00b/cmake/flags.cmake b/libpsn00b/cmake/flags.cmake new file mode 100644 index 0000000..249c5b4 --- /dev/null +++ b/libpsn00b/cmake/flags.cmake @@ -0,0 +1,151 @@ +# libpsn00b interface targets +# (C) 2021 spicyjpeg - MPL licensed + +# This script creates several "virtual" targets (psn00bsdk_*) that set include +# 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_shared_lib +# - psn00bsdk_module_lib (same as psn00bsdk_shared_lib) +# +# NOTE: building a static library and linking it as part of a DLL is currently +# *not* supported. + +if(NOT TARGET psn00bsdk_common) # Include guard + +add_library(psn00bsdk_common INTERFACE) + +foreach( + _target IN ITEMS + object_lib + static_exe + dynamic_exe + static_lib + shared_lib + module_lib +) + add_library (psn00bsdk_${_target} INTERFACE) + target_link_libraries(psn00bsdk_${_target} INTERFACE psn00bsdk_common) +endforeach() + +# Options common to all target types: +# - Define PLAYSTATION=1 +# - Optimize for MIPS R3000 +# - Inject zero checks into division operations (will throw breaks) +# - All standard libraries (including libgcc) disabled +# - Put all symbols into separate sections when building +# - C++ features that require runtime support disabled +# - Unused section stripping enabled +target_compile_options( + psn00bsdk_common INTERFACE + # CPU options + -msoft-float + -march=r3000 + -mtune=r3000 + -mabi=32 + -mdivide-breaks + -O2 + # Standard library options + -ffreestanding + -fno-builtin + -nostdlib + # Other options + -fdata-sections + -ffunction-sections + -fsigned-char + -fno-strict-overflow + -fdiagnostics-color=always + $<$<COMPILE_LANGUAGE:CXX>: + # C++ options + -fno-exceptions + -fno-rtti + -fno-unwind-tables + -fno-threadsafe-statics + -fno-use-cxa-atexit + > +) +target_link_options( + psn00bsdk_common INTERFACE + -nostdlib + -Wl,-gc-sections +) +target_compile_definitions( + psn00bsdk_common INTERFACE + PLAYSTATION=1 + $<$<CONFIG:DEBUG>:DEBUG=1> +) + +# Options for executables without support for dynamic linking: +# - Position-independent code disabled +# - GP-relative addressing enabled only for local symbols +# - ABI-compatible calls disabled (incompatible with GP-relative addr) +target_compile_options( + psn00bsdk_static_exe INTERFACE + -G8 + -fno-pic + -mno-abicalls + -mgpopt + -mno-extern-sdata +) +target_link_options( + psn00bsdk_static_exe INTERFACE + -G8 + -static +) + +# Options for executables with support for dynamic linking: +# - Position-independent code disabled +# - GP-relative addressing disabled +# - ABI-compatible calls disabled (must be performed manually) +target_compile_options( + psn00bsdk_dynamic_exe INTERFACE + -G0 + -fno-pic + -mno-abicalls + -mno-gpopt +) +target_link_options( + psn00bsdk_dynamic_exe INTERFACE + -G0 + -static +) + +# Options for static libraries: +# - Position-independent code disabled +# - GP-relative addressing disabled +# - ABI-compatible calls disabled +# - Local stripping enabled +target_compile_options( + psn00bsdk_static_lib INTERFACE + -G0 + -fno-pic + -mno-abicalls + -mno-gpopt + -Wa,--strip-local-absolute +) + +# Options for dynamically-loaded libraries: +# - Position-independent code enabled +# - GP-relative addressing disabled (incompatible with ABI calls) +# - ABI-compatible calls enabled +target_compile_options( + psn00bsdk_shared_lib INTERFACE + -G0 + -fPIC + -mabicalls + -mno-gpopt + -mshared +) +target_link_options( + psn00bsdk_shared_lib INTERFACE + -G0 + -shared +) + +target_link_libraries(psn00bsdk_module_lib INTERFACE psn00bsdk_shared_lib) + +endif() diff --git a/libpsn00b/cmake/internal_setup.cmake b/libpsn00b/cmake/internal_setup.cmake index b0c4591..7d6bfdd 100644 --- a/libpsn00b/cmake/internal_setup.cmake +++ b/libpsn00b/cmake/internal_setup.cmake @@ -7,8 +7,15 @@ cmake_minimum_required(VERSION 3.20) include(GNUInstallDirs) -# IMPORTANT TODO: set a version number -set(PSN00BSDK_VERSION 0.1.0) +# Fetch SDK version information from build.json. +if(NOT DEFINED PSN00BSDK_VERSION) + file(READ ${CMAKE_CURRENT_LIST_DIR}/../build.json _json) + + string(JSON PSN00BSDK_VERSION GET ${_json} version) + string(JSON PSN00BSDK_BUILD_DATE GET ${_json} build_date) + string(JSON PSN00BSDK_GIT_TAG GET ${_json} git_tag) + string(JSON PSN00BSDK_GIT_COMMIT GET ${_json} git_commit) +endif() ## Settings (can be overridden by projects) @@ -22,9 +29,7 @@ set(PSN00BSDK_SYMBOL_MAP_SUFFIX ".map") set(PSN00BSDK_LIBRARIES psxgpu psxgte psxspu psxcd psxsio psxetc psxapi lzp c) include(${CMAKE_CURRENT_LIST_DIR}/libpsn00b.cmake OPTIONAL) -if(NOT TARGET psn00bsdk_common) - include(${CMAKE_CURRENT_LIST_DIR}/virtual_targets.cmake) -endif() +include(${CMAKE_CURRENT_LIST_DIR}/flags.cmake) # Use the toolchain path to find libgcc (used to build libpsn00b). Of course # different installers, packages and distros have different opinions when it @@ -59,14 +64,18 @@ set( find_program(ELF2X elf2x HINTS ${PSN00BSDK_TOOLS}) find_program(ELF2CPE elf2cpe HINTS ${PSN00BSDK_TOOLS}) -find_program(SMXLINK elf2x HINTS ${PSN00BSDK_TOOLS}) +find_program(SMXLINK smxlink HINTS ${PSN00BSDK_TOOLS}) find_program(LZPACK lzpack HINTS ${PSN00BSDK_TOOLS}) find_program(MKPSXISO mkpsxiso HINTS ${PSN00BSDK_TOOLS}) ## Helper functions for executables -set(PSN00BSDK_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/../include) set(PSN00BSDK_LDSCRIPTS ${CMAKE_CURRENT_LIST_DIR}/../ldscripts) +if(IS_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../include) + set(PSN00BSDK_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/../include) +else() + set(PSN00BSDK_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/../../../include/libpsn00b) +endif() # psn00bsdk_add_executable( # <target name> <STATIC|DYNAMIC> diff --git a/libpsn00b/cmake/sdk.cmake b/libpsn00b/cmake/sdk.cmake index ae23a06..d6d9bcd 100644 --- a/libpsn00b/cmake/sdk.cmake +++ b/libpsn00b/cmake/sdk.cmake @@ -4,11 +4,11 @@ cmake_minimum_required(VERSION 3.20) set( - PSN00BSDK_TC $ENV{PSN00BSDK_TC} - CACHE PATH "Path to the GCC toolchain's installation directory" + PSN00BSDK_TC "" + CACHE PATH "Path to the GCC toolchain's installation directory (if not in PATH)" ) set( - PSN00BSDK_TARGET mipsel-unknown-elf + PSN00BSDK_TARGET mipsel-none-elf CACHE STRING "GCC toolchain target triplet" ) @@ -26,7 +26,7 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # toolchain settings to the generated test projects. This dodges missing C++ # standard library errors. set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES PSN00BSDK_TC PSN00BSDK_TARGET) +set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES PSN00BSDK_TC PSN00BSDK_TARGET PSN00BSDK_VERSION) ## Toolchain path setup @@ -56,7 +56,7 @@ cmake_path(GET _bin PARENT_PATH _toolchain) if(NOT IS_DIRECTORY PSN00BSDK_TC) set( PSN00BSDK_TC ${_toolchain} - CACHE PATH "Path to the GCC toolchain's installation directory" + CACHE PATH "Path to the GCC toolchain's installation directory (if not in PATH)" FORCE ) endif() diff --git a/libpsn00b/cmake/virtual_targets.cmake b/libpsn00b/cmake/virtual_targets.cmake deleted file mode 100644 index 9afcebd..0000000 --- a/libpsn00b/cmake/virtual_targets.cmake +++ /dev/null @@ -1,109 +0,0 @@ -# libpsn00b interface targets -# (C) 2021 spicyjpeg - MPL licensed - -# This script creates several "virtual" targets (psn00bsdk_*) that set include -# directories and compiler flags when a target is linked against them. These -# all end up in the autogenerated libpsn00b setup script after installation, -# so this file is only included when building libpsn00b. - -# 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_shared_lib -# - psn00bsdk_module_lib (same as psn00bsdk_shared_lib) - -include(GNUInstallDirs) - -set(PSN00BSDK_VIRTUAL_TARGETS "") - -macro(_add_interface_target name) - add_library(${name} INTERFACE) - list(APPEND PSN00BSDK_VIRTUAL_TARGETS ${name}) - - target_compile_options( - ${name} INTERFACE - ${_aflags} - $<$<COMPILE_LANGUAGE:C,CXX>:${_cflags}> - $<$<COMPILE_LANGUAGE:CXX>:${_cxxflags}> - ) - target_link_options (${name} INTERFACE ${_ldflags}) - target_link_libraries(${name} INTERFACE ${ARGN}) -endmacro() - -macro(_add_alias_target name) - #add_library(${name} ALIAS ${ARGN}) - add_library(${name} INTERFACE) - list(APPEND PSN00BSDK_VIRTUAL_TARGETS ${name}) - - target_link_libraries(${name} INTERFACE ${ARGN}) -endmacro() - -# Options common to all target types: -# - Define PLAYSTATION=1 and set include directories -# - Optimize for MIPS R3000 -# - Inject zero checks into division operations (will throw breaks) -# - All standard libraries (including libgcc) disabled -# - Put all symbols into separate sections when building -# - C++ features that require runtime support disabled -# - Unused section stripping enabled -set(_aflags -msoft-float -march=r3000 -mtune=r3000 -mabi=32) -set(_cflags -mdivide-breaks -O2 -ffreestanding -fno-builtin -nostdlib -fdata-sections -ffunction-sections -fsigned-char -fno-strict-overflow -fdiagnostics-color=always) -set(_cxxflags -fno-exceptions -fno-rtti -fno-unwind-tables -fno-threadsafe-statics -fno-use-cxa-atexit) -set(_ldflags -nostdlib -Wl,-gc-sections) - -_add_interface_target(psn00bsdk_common) -_add_alias_target (psn00bsdk_object_lib psn00bsdk_common) - -target_compile_definitions( - psn00bsdk_common INTERFACE - PLAYSTATION=1 - $<$<CONFIG:DEBUG>:DEBUG=1> -) - -# Options for executables without support for dynamic linking: -# - Position-independent code disabled -# - GP-relative addressing enabled only for local symbols -# - ABI-compatible calls disabled (incompatible with GP-relative addr) -set(_aflags -G8) -set(_cflags -mno-abicalls -mgpopt -mno-extern-sdata) -set(_cxxflags) -set(_ldflags -G8 -static) - -_add_interface_target(psn00bsdk_static_exe psn00bsdk_common) - -# Options for executables with support for dynamic linking: -# - Position-independent code disabled -# - GP-relative addressing disabled -# - ABI-compatible calls disabled (must be performed manually) -set(_aflags -G0) -set(_cflags -mno-abicalls -mno-gpopt) -set(_cxxflags) -set(_ldflags -G0 -static) - -_add_interface_target(psn00bsdk_dynamic_exe psn00bsdk_common) - -# Options for static libraries: -# - GP-relative addressing disabled -# - ABI-compatible calls disabled -# - Local stripping enabled -set(_aflags -G0 -Wa,--strip-local-absolute) -set(_cflags -mno-abicalls -mno-gpopt) -set(_cxxflags) -set(_ldflags) - -_add_interface_target(psn00bsdk_static_lib psn00bsdk_common) - -# Options for dynamically-loaded libraries: -# - Position-independent code enabled -# - GP-relative addressing disabled (incompatible with ABI calls) -# - ABI-compatible calls enabled -set(_aflags -G0) -set(_cflags -mabicalls -mshared -mno-gpopt -fPIC) -set(_cxxflags) -set(_ldflags -G0 -shared) - -_add_interface_target(psn00bsdk_shared_lib psn00bsdk_common) -_add_alias_target (psn00bsdk_module_lib psn00bsdk_shared_lib) |
