aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/cmake/flags.cmake
diff options
context:
space:
mode:
authorJohn "Lameguy" Wilbert Villamor <lameguy64@gmail.com>2022-01-18 08:31:14 +0800
committerGitHub <noreply@github.com>2022-01-18 08:31:14 +0800
commit05d44488bd5587786f4bd0286fc0f555c79aa46a (patch)
tree5740f396d10a9580c3a39ca536544436898ff1b6 /libpsn00b/cmake/flags.cmake
parent08de895e8582dbc70b639ae5f511ab9ebfb4d68a (diff)
parente9475e283a82665fe6c19bebc3318b5084f15a2e (diff)
downloadpsn00bsdk-05d44488bd5587786f4bd0286fc0f555c79aa46a.tar.gz
Merge pull request #44 from spicyjpeg/actions
GitHub Actions CI, psxcd and libc fixes, new examples
Diffstat (limited to 'libpsn00b/cmake/flags.cmake')
-rw-r--r--libpsn00b/cmake/flags.cmake151
1 files changed, 151 insertions, 0 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()