diff --git a/CMakeLists.txt b/CMakeLists.txt index 84f5f03..94f3367 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,11 @@ cmake_minimum_required(VERSION 3.24) +option(ENABLE_VITA "Enable Vita SDK integration" OFF) +if(ENABLE_VITA) + if(NOT DEFINED ENV{VITASDK}) + message(FATAL_ERROR "VITASDK environment variable must be set when ENABLE_VITA is ON") + endif() + set(CMAKE_TOOLCHAIN_FILE "$ENV{VITASDK}/share/vita.toolchain.cmake" CACHE FILEPATH "Vita SDK toolchain" FORCE) +endif() if(CMAKE_GENERATOR MATCHES "Ninja") if(DEFINED CMAKE_GENERATOR_PLATFORM) set(CMAKE_GENERATOR_PLATFORM "" CACHE STRING "" FORCE) @@ -50,6 +57,11 @@ if(ENABLE_CLANG_TIDY) message(WARNING "clang-tidy requested but not found on the PATH; disabling lint step") endif() endif() +if(ENABLE_VITA) + include("$ENV{VITASDK}/share/vita.cmake" REQUIRED) + set(VITA_APP_NAME "SDL3App") + set(VITA_TITLEID "ABCD00001") +endif() option(BUILD_SDL3_APP "Build the SDL3 Vulkan demo" ON) set(SDL_VERSION "SDL3" CACHE STRING "SDL version to use: SDL3 or sdl") set_property(CACHE SDL_VERSION PROPERTY STRINGS "SDL3" "sdl") diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json index 889fff9..25ea023 100644 --- a/CMakeUserPresets.json +++ b/CMakeUserPresets.json @@ -3,6 +3,18 @@ "vendor": { "conan": {} }, + "configurePresets": [ + { + "name": "vita-release", + "inherits": ["conan-release"], + "cacheVariables": { + "ENABLE_VITA": "ON" + }, + "environment": { + "VITASDK": "/home/rewrich/vita-toolchain" + } + } + ], "include": [ "build/build/Release/generators/CMakePresets.json" ] diff --git a/conanfile.py b/conanfile.py index 8f8b182..f9e9d6a 100644 --- a/conanfile.py +++ b/conanfile.py @@ -18,6 +18,16 @@ class SDL3CppConan(ConanFile): def layout(self): cmake_layout(self) + def generate(self): + from conan.tools.cmake import CMakeToolchain + tc = CMakeToolchain(self) + if self.settings.os == "Vita": + import os + vitasdk = os.environ.get("VITASDK") + if vitasdk: + tc.toolchain_file = f"{vitasdk}/share/vita.toolchain.cmake" + tc.generate() + def requirements(self): self.requires("lua/5.4.8") self.requires("sdl/3.2.20") diff --git a/profiles/vita b/profiles/vita new file mode 100644 index 0000000..1ebe45a --- /dev/null +++ b/profiles/vita @@ -0,0 +1,13 @@ +[settings] +os=Vita +arch=armv7 +compiler=gcc +compiler.version=9 +compiler.libcxx=libstdc++11 +build_type=Release + +[tool_requires] +# Vita SDK isn't in Conan; handle separately + +[conf] +tools.cmake.cmaketoolchain:generator=Ninja \ No newline at end of file diff --git a/scripts/dev_commands.py b/scripts/dev_commands.py index 4f9db99..748e0cd 100644 --- a/scripts/dev_commands.py +++ b/scripts/dev_commands.py @@ -180,6 +180,13 @@ def dependencies(args: argparse.Namespace) -> None: def configure(args: argparse.Namespace) -> None: """Configure a CMake project based on the chosen generator and options.""" + if args.preset: + cmake_args = ["cmake", "--preset", args.preset] + cmake_extra_args = _strip_leading_double_dash(args.cmake_args) + if cmake_extra_args: + cmake_args.extend(cmake_extra_args) + run_argvs([cmake_args], args.dry_run) + return generator = args.generator or DEFAULT_GENERATOR build_dir = _as_build_dir( args.build_dir, GENERATOR_DEFAULT_DIR.get(generator, "build") @@ -499,6 +506,11 @@ def gui(args: argparse.Namespace) -> None: layout = QFormLayout(self) + self.preset_combo = QComboBox() + self.preset_combo.addItems(["default", "vita-release"]) + self.preset_combo.setCurrentText("default") + layout.addRow("Preset:", self.preset_combo) + self.generator_combo = QComboBox() self.generator_combo.addItems(["ninja", "ninja-msvc", "vs"]) self.generator_combo.setCurrentText(DEFAULT_GENERATOR) @@ -592,6 +604,7 @@ def gui(args: argparse.Namespace) -> None: self.current_game = None # Build settings + self.preset = "default" self.generator = DEFAULT_GENERATOR self.build_type = "Release" self.target = "sdl3_app" @@ -1115,15 +1128,17 @@ def gui(args: argparse.Namespace) -> None: def show_settings(self): """Show build settings dialog""" dialog = BuildSettingsDialog(self) + dialog.preset_combo.setCurrentText(self.preset) dialog.generator_combo.setCurrentText(self.generator) dialog.build_type_combo.setCurrentText(self.build_type) dialog.target_combo.setCurrentText(self.target) if dialog.exec() == QDialog.DialogCode.Accepted: + self.preset = dialog.preset_combo.currentText() self.generator = dialog.generator_combo.currentText() self.build_type = dialog.build_type_combo.currentText() self.target = dialog.target_combo.currentText() - self.log(f"Settings updated: Generator={self.generator}, Build Type={self.build_type}, Target={self.target}") + self.log(f"Settings updated: Preset={self.preset}, Generator={self.generator}, Build Type={self.build_type}, Target={self.target}") def show_new_project_dialog(self): """Show new project creation dialog""" @@ -1609,20 +1624,28 @@ return {{ def run_dependencies(self): """Run conan dependencies installation""" cmd = [sys.executable, __file__, "dependencies"] + if self.preset == "vita-release": + cmd.extend(["--conan-install-args", "--profile", "profiles/vita"]) self.run_command(cmd) def run_configure(self): """Run CMake configuration""" - cmd = [ - sys.executable, __file__, "configure", - "--generator", self.generator, - "--build-type", self.build_type - ] + cmd = [sys.executable, __file__, "configure"] + if self.preset != "default": + cmd.extend(["--preset", self.preset]) + else: + cmd.extend([ + "--generator", self.generator, + "--build-type", self.build_type + ]) self.run_command(cmd) def run_build(self): """Run build command""" - build_dir = GENERATOR_DEFAULT_DIR.get(self.generator, DEFAULT_BUILD_DIR) + if self.preset != "default": + build_dir = f"build-{self.preset.split('-')[0]}" # e.g., build-vita + else: + build_dir = GENERATOR_DEFAULT_DIR.get(self.generator, DEFAULT_BUILD_DIR) cmd = [ sys.executable, __file__, "build", "--build-dir", build_dir, @@ -1662,6 +1685,10 @@ def main() -> int: ) deps.set_defaults(func=dependencies) conf = subparsers.add_parser("configure", help="configure CMake project") + conf.add_argument( + "--preset", + help="use a CMake preset instead of manual configuration", + ) conf.add_argument( "--generator", choices=["vs", "ninja", "ninja-msvc"],