[Scummvm-git-logs] scummvm master -> 3cfaa9506e3b2a4f395dcd1aab6a40014ccd974c

bluegr noreply at scummvm.org
Sun Jun 15 20:27:00 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
3cfaa9506e CREATE_PROJECT: Add support for SDL3


Commit: 3cfaa9506e3b2a4f395dcd1aab6a40014ccd974c
    https://github.com/scummvm/scummvm/commit/3cfaa9506e3b2a4f395dcd1aab6a40014ccd974c
Author: SupSuper (supsuper at gmail.com)
Date: 2025-06-15T23:26:58+03:00

Commit Message:
CREATE_PROJECT: Add support for SDL3

Changed paths:
    devtools/create_project/cmake.cpp
    devtools/create_project/cmake.h
    devtools/create_project/codeblocks.cpp
    devtools/create_project/create_project.cpp
    devtools/create_project/create_project.h
    devtools/create_project/msbuild.cpp
    devtools/create_project/msvc.cpp
    devtools/create_project/msvc.h
    devtools/create_project/xcode.cpp


diff --git a/devtools/create_project/cmake.cpp b/devtools/create_project/cmake.cpp
index f064ce5d7ef..c178cef2371 100644
--- a/devtools/create_project/cmake.cpp
+++ b/devtools/create_project/cmake.cpp
@@ -33,10 +33,11 @@ CMakeProvider::CMakeProvider(StringList &global_warnings, std::map<std::string,
 	: ProjectProvider(global_warnings, project_warnings, global_errors, version) {
 }
 
-const CMakeProvider::Library *CMakeProvider::getLibraryFromFeature(const char *feature, bool useSDL2) const {
+const CMakeProvider::Library *CMakeProvider::getLibraryFromFeature(const char *feature, SDLVersion useSDL) const {
 	static const Library s_libraries[] = {
 		{ "sdl",        "sdl",               kSDLVersion1,   "FindSDL",      "SDL",      "SDL_INCLUDE_DIR",       "SDL_LIBRARY",         nullptr, nullptr },
 		{ "sdl",        "sdl2",              kSDLVersion2,   nullptr,        "SDL2",     nullptr,                 "SDL2_LIBRARIES",      nullptr, nullptr },
+		{ "sdl",        "sdl3",              kSDLVersion3,   nullptr,        "SDL3",     nullptr,                 "SDL3_LIBRARIES",      nullptr, nullptr },
 		{ "freetype2",  "freetype2",         kSDLVersionAny, "FindFreetype", "Freetype", "FREETYPE_INCLUDE_DIRS", "FREETYPE_LIBRARIES",  nullptr, nullptr },
 		{ "zlib",       "zlib",              kSDLVersionAny, "FindZLIB",     "ZLIB",     "ZLIB_INCLUDE_DIRS",     "ZLIB_LIBRARIES",      nullptr, nullptr },
 		{ "png",        "libpng",            kSDLVersionAny, "FindPNG",      "PNG",      "PNG_INCLUDE_DIRS",      "PNG_LIBRARIES",       nullptr, nullptr },
@@ -46,6 +47,7 @@ const CMakeProvider::Library *CMakeProvider::getLibraryFromFeature(const char *f
 		{ "libcurl",    "libcurl",           kSDLVersionAny, "FindCURL",     "CURL",     "CURL_INCLUDE_DIRS",     "CURL_LIBRARIES",      nullptr, "ws2_32" },
 		{ "sdlnet",     nullptr,             kSDLVersion1,   "FindSDL_net",  "SDL_net",  "SDL_NET_INCLUDE_DIRS",  "SDL_NET_LIBRARIES",   nullptr, nullptr },
 		LibraryProps("sdlnet", "SDL2_net", kSDLVersion2).Libraries("SDL2_net"),
+		LibraryProps("sdlnet", "SDL3_net", kSDLVersion3).Libraries("SDL3_net"),
 		LibraryProps("flac", "flac").Libraries("FLAC"),
 		LibraryProps("mad", "mad").Libraries("mad"),
 		LibraryProps("mikmod", "mikmod").Libraries("mikmod"),
@@ -68,8 +70,7 @@ const CMakeProvider::Library *CMakeProvider::getLibraryFromFeature(const char *f
 
 	for (unsigned int i = 0; i < sizeof(s_libraries) / sizeof(s_libraries[0]); i++) {
 		bool matchingSDL = (s_libraries[i].sdlVersion == kSDLVersionAny)
-		                   || (useSDL2 && s_libraries[i].sdlVersion == kSDLVersion2)
-		                   || (!useSDL2 && s_libraries[i].sdlVersion == kSDLVersion1);
+		                   || (s_libraries[i].sdlVersion == useSDL);
 		if (std::strcmp(feature, s_libraries[i].feature) == 0 && matchingSDL) {
 			return &s_libraries[i];
 		}
@@ -223,7 +224,7 @@ file(APPEND "engines/plugins_table.h" "/* This file is automatically generated b
 }
 
 void CMakeProvider::writeFeatureLibSearch(const BuildSetup &setup, std::ofstream &workspace, const char *feature) const {
-	const Library *library = getLibraryFromFeature(feature, setup.useSDL2);
+	const Library *library = getLibraryFromFeature(feature, setup.useSDL);
 	if (library) {
 		workspace << "find_feature(";
 		workspace << "name " << library->feature;
@@ -332,7 +333,7 @@ void CMakeProvider::createProjectFile(const std::string &name, const std::string
 		writeEnginesLibrariesHandling(setup, project);
 
 		project << "# Libraries\n";
-		const Library *sdlLibrary = getLibraryFromFeature("sdl", setup.useSDL2);
+		const Library *sdlLibrary = getLibraryFromFeature("sdl", setup.useSDL);
 		std::string libraryDirsList;
 		for (const std::string &libraryDir : setup.libraryDirs)
 			libraryDirsList += libraryDir + ' ';
@@ -387,8 +388,10 @@ void CMakeProvider::writeDefines(const BuildSetup &setup, std::ofstream &output)
 	output << "endif()\n";
 
 	output << "add_definitions(-DSDL_BACKEND)\n";
-	if (setup.useSDL2) {
+	if (setup.useSDL == kSDLVersion2) {
 		output << "add_definitions(-DUSE_SDL2)\n";
+	} else if (setup.useSDL == kSDLVersion3) {
+		output << "add_definitions(-DUSE_SDL3)\n";
 	}
 
 	if (getFeatureBuildState("opengl", setup.features)) {
diff --git a/devtools/create_project/cmake.h b/devtools/create_project/cmake.h
index 7bb38bf0b1b..91a5fb69eab 100644
--- a/devtools/create_project/cmake.h
+++ b/devtools/create_project/cmake.h
@@ -56,12 +56,6 @@ protected:
 private:
 	std::stringstream enginesStr;
 
-	enum SDLVersion {
-		kSDLVersionAny,
-		kSDLVersion1,
-		kSDLVersion2
-	};
-
 	/**
 	 * CMake properties for a library required by a feature
 	 */
@@ -85,7 +79,7 @@ private:
 		LibraryProps &WinLibraries(const char *libs) { winLibraries = libs; return *this; }
 	};
 
-	const Library *getLibraryFromFeature(const char *feature, bool useSDL2) const;
+	const Library *getLibraryFromFeature(const char *feature, SDLVersion useSDL) const;
 
 	void writeWarnings(std::ofstream &output) const;
 	void writeDefines(const BuildSetup &setup, std::ofstream &output) const;
diff --git a/devtools/create_project/codeblocks.cpp b/devtools/create_project/codeblocks.cpp
index a5e88d6b364..119417698e2 100644
--- a/devtools/create_project/codeblocks.cpp
+++ b/devtools/create_project/codeblocks.cpp
@@ -55,6 +55,10 @@ void CodeBlocksProvider::createWorkspace(const BuildSetup &setup) {
 StringList getFeatureLibraries(const BuildSetup &setup) {
 	StringList libraries;
 
+	std::string libSDL = "lib";
+	libSDL += setup.getSDLName();
+	libraries.push_back(libSDL);
+
 	for (FeatureList::const_iterator i = setup.features.begin(); i != setup.features.end(); ++i) {
 		if (i->enable && i->library) {
 			std::string libname;
@@ -68,11 +72,7 @@ StringList getFeatureLibraries(const BuildSetup &setup) {
 			} else if (!std::strcmp(i->name, "png")) {
 				libname = "libpng16";
 			} else if (!std::strcmp(i->name, "sdlnet")) {
-				if (setup.useSDL2) {
-					libname = "libSDL2_net";
-				} else {
-					libname = "libSDL_net";
-				}
+				libname = libSDL + "_net";
 				libraries.push_back("iphlpapi");
 			} else {
 				libname = "lib";
@@ -82,12 +82,6 @@ StringList getFeatureLibraries(const BuildSetup &setup) {
 		}
 	}
 
-	if (setup.useSDL2) {
-		libraries.push_back("libSDL2");
-	} else {
-		libraries.push_back("libSDL");
-	}
-
 	// Win32 libraries
 	libraries.push_back("ole32");
 	libraries.push_back("uuid");
diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp
index 4d698b43024..7d2c5b86372 100644
--- a/devtools/create_project/create_project.cpp
+++ b/devtools/create_project/create_project.cpp
@@ -300,7 +300,11 @@ int main(int argc, char *argv[]) {
 		} else if (!std::strcmp(argv[i], "--tests")) {
 			setup.tests = true;
 		} else if (!std::strcmp(argv[i], "--sdl1")) {
-			setup.useSDL2 = false;
+			setup.useSDL = kSDLVersion1;
+		} else if (!std::strcmp(argv[i], "--sdl2")) {
+			setup.useSDL = kSDLVersion2;
+		} else if (!std::strcmp(argv[i], "--sdl3")) {
+			setup.useSDL = kSDLVersion3;
 		} else if (!std::strcmp(argv[i], "--use-canonical-lib-names")) {
 			// Deprecated: Kept here so it doesn't error
 		} else if (!std::strcmp(argv[i], "--use-windows-unicode")) {
@@ -476,11 +480,17 @@ int main(int argc, char *argv[]) {
 	}
 
 	setup.defines.push_back("SDL_BACKEND");
-	if (!setup.useSDL2) {
+	if (setup.useSDL == kSDLVersion1) {
 		cout << "\nBuilding against SDL 1.2\n\n";
-	} else {
-		cout << "\nBuilding against SDL 2.0\n\n";
+	} else if (setup.useSDL == kSDLVersion2) {
+		cout << "\nBuilding against SDL 2\n\n";
 		setup.defines.push_back("USE_SDL2");
+	} else if (setup.useSDL == kSDLVersion3) {
+		cout << "\nBuilding against SDL 3\n\n";
+		setup.defines.push_back("USE_SDL3");
+	} else {
+		std::cerr << "ERROR: Unsupported SDL version\n";
+		return -1;
 	}
 
 	if (setup.useStaticDetection) {
@@ -492,9 +502,13 @@ int main(int argc, char *argv[]) {
 	}
 
 	// HACK: Add IMGUI SDL Renderer support
-	// This needs SDL 2.0.18+
 	if (getFeatureBuildState("imgui", setup.features)) {
-		setup.defines.push_back("USE_IMGUI_SDLRENDERER2");
+		// This needs SDL 2.0.18+
+		if (setup.useSDL == kSDLVersion2) {
+			setup.defines.push_back("USE_IMGUI_SDLRENDERER2");
+		} else if (setup.useSDL == kSDLVersion3) {
+			setup.defines.push_back("USE_IMGUI_SDLRENDERER3");
+		}
 	}
 
 	// List of global warnings and map of project-specific warnings
@@ -803,6 +817,7 @@ void displayHelp(const char *exe) {
 	        " --use-windows-ansi         Use Windows ANSI APIs\n"
 	        "                            (default: false)\n"
 	        " --use-windows-subsystem    Use Windows subsystem instead of Console\n"
+	        "                            (default: false)\n"
 	        " --libs-path path           Specify the path of pre-built libraries instead of using the\n"
 			"                            " LIBS_DEFINE " environment variable\n "
 	        " --vcpkg                    Use vcpkg-provided libraries instead of pre-built libraries\n"
@@ -820,7 +835,9 @@ void displayHelp(const char *exe) {
 	        " --disable-<name>           disable inclusion of the feature \"name\"\n"
 	        "\n"
 	        "SDL settings:\n"
-	        " --sdl1                     link to SDL 1.2, instead of SDL 2.0\n"
+	        " --sdl1                     link to SDL 1.2\n"
+			" --sdl2                     link to SDL 2 (default)\n"
+			" --sdl3                     link to SDL 3\n"
 	        "\n"
 	        " There are the following features available:\n"
 	        "\n";
@@ -1292,8 +1309,8 @@ static void fixupFeatures(ProjectType projectType, BuildSetup &setup) {
 	// Check IMGUI dependencies
 	if (!getFeatureBuildState("opengl", setup.features) ||
 		!getFeatureBuildState("freetype2", setup.features) ||
-		!setup.useSDL2) {
-		std::cerr << "WARNING: imgui requires opengl, freetype2 and sdl2\n";
+		setup.useSDL == kSDLVersion1) {
+		std::cerr << "WARNING: imgui requires opengl, freetype2 and sdl2+\n";
 		setFeatureBuildState("imgui", setup.features, false);
 	}
 	// IMGUI is not available on Xcode
@@ -2715,3 +2732,11 @@ Feature BuildSetup::getFeature(const std::string &feature) const {
 
 	return *itr;
 }
+
+const char *BuildSetup::getSDLName() const {
+	switch (useSDL) {
+	case kSDLVersion2: return "SDL2";
+	case kSDLVersion3: return "SDL3";
+	default:           return "SDL";
+	}
+}
diff --git a/devtools/create_project/create_project.h b/devtools/create_project/create_project.h
index 4a64e3af274..d11f8f85b1a 100644
--- a/devtools/create_project/create_project.h
+++ b/devtools/create_project/create_project.h
@@ -253,6 +253,16 @@ bool setFeatureBuildState(const std::string &name, FeatureList &features, bool e
  */
 bool getFeatureBuildState(const std::string &name, const FeatureList &features);
 
+/**
+ * Specifies the required SDL version of a feature.
+ */
+enum SDLVersion {
+	kSDLVersionAny = 0,
+	kSDLVersion1, ///< SDL 1.2
+	kSDLVersion2, ///< SDL 2
+	kSDLVersion3  ///< SDL 3
+};
+
 /**
  * Structure to describe a build setup.
  *
@@ -284,7 +294,7 @@ struct BuildSetup {
 	bool tests = false;                ///< Generate project files for the tests
 	bool runBuildEvents = false;       ///< Run build events as part of the build (generate revision number and copy engine/theme data & needed files to the build folder
 	bool createInstaller = false;      ///< Create installer after the build
-	bool useSDL2 = true;               ///< Whether to use SDL2 or not.
+	SDLVersion useSDL = kSDLVersion2;  ///< Which version of SDL to use.
 	bool useStaticDetection = true;    ///< Whether to link detection features inside the executable or not.
 	bool useWindowsUnicode = true;     ///< Whether to use Windows Unicode APIs or ANSI APIs.
 	bool useWindowsSubsystem = false;  ///< Whether to use Windows subsystem or Console subsystem (default: Console)
@@ -294,6 +304,7 @@ struct BuildSetup {
 
 	bool featureEnabled(const std::string &feature) const;
 	Feature getFeature(const std::string &feature) const;
+	const char *getSDLName() const;
 };
 
 /**
diff --git a/devtools/create_project/msbuild.cpp b/devtools/create_project/msbuild.cpp
index d37ee4c13ba..514c19a9884 100644
--- a/devtools/create_project/msbuild.cpp
+++ b/devtools/create_project/msbuild.cpp
@@ -356,7 +356,7 @@ void MSBuildProvider::outputGlobalPropFile(const BuildSetup &setup, std::ofstrea
 	if (setup.runBuildEvents)
 		definesList += REVISION_DEFINE ";";
 
-	std::string includeSDL = (setup.useSDL2 ? "SDL2" : "SDL");
+	std::string includeSDL = setup.getSDLName();
 
 	properties << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
 			   << "<Project DefaultTargets=\"Build\" ToolsVersion=\"" << _msvcVersion.project << "\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n"
@@ -433,7 +433,7 @@ void MSBuildProvider::createBuildProp(const BuildSetup &setup, bool isRelease, M
 	for (StringList::const_iterator i = setup.includeDirs.begin(); i != setup.includeDirs.end(); ++i)
 		includeDirsList += convertPathToWin(*i) + ';';
 
-	std::string includeSDL = (setup.useSDL2 ? "SDL2" : "SDL");
+	std::string includeSDL = setup.getSDLName();
 
 	std::string libraryDirsList;
 	for (StringList::const_iterator i = setup.libraryDirs.begin(); i != setup.libraryDirs.end(); ++i)
diff --git a/devtools/create_project/msvc.cpp b/devtools/create_project/msvc.cpp
index de874fe3ffc..79f19c85d26 100644
--- a/devtools/create_project/msvc.cpp
+++ b/devtools/create_project/msvc.cpp
@@ -50,50 +50,48 @@ MSVCProvider::MSVCProvider(StringList &global_warnings, std::map<std::string, St
 std::string MSVCProvider::getLibraryFromFeature(const char *feature, const BuildSetup &setup, bool isRelease) const {
 	static const MSVCLibrary s_libraries[] = {
 		// Libraries
-		{       "sdl", "SDL.lib",                   "SDLd.lib",        "winmm.lib imm32.lib version.lib setupapi.lib"    },
-		{      "sdl2", "SDL2.lib",                  "SDL2d.lib",       "winmm.lib imm32.lib version.lib setupapi.lib"    },
-		{      "zlib", "zlib.lib",                  "zlibd.lib",       nullptr                                           },
-		{       "mad", "mad.lib",                   nullptr,           nullptr                                           },
-		{   "fribidi", "fribidi.lib",               nullptr,           nullptr                                           },
-		{       "ogg", "ogg.lib",                   nullptr,           nullptr                                           },
-		{    "vorbis", "vorbis.lib vorbisfile.lib", nullptr,           nullptr                                           },
-		{    "tremor", "vorbisidec.lib",            nullptr,           nullptr                                           },
-		{      "flac", "FLAC.lib",                  nullptr,           nullptr                                           },
-		{       "png", "libpng16.lib",              "libpng16d.lib",   nullptr                                           },
-		{       "gif", "gif.lib",                   nullptr,           nullptr                                           },
-		{      "faad", "faad.lib",                  nullptr,           nullptr                                           },
-		{    "mikmod", "mikmod.lib",                nullptr,           nullptr                                           },
-		{   "openmpt", "openmpt.lib",               nullptr,           nullptr                                           },
-		{     "mpeg2", "mpeg2.lib",                 nullptr,           nullptr                                           },
-		{ "theoradec", "theora.lib",                nullptr,           nullptr                                           },
-		{       "vpx", "vpx.lib",                   nullptr,           nullptr                                           },
-		{ "freetype2", "freetype.lib",              "freetyped.lib",   nullptr                                           },
-		{      "jpeg", "jpeg.lib",                  nullptr,           nullptr                                           },
-		{"fluidsynth", "fluidsynth.lib",            nullptr,           nullptr                                           },
-		{ "fluidlite", "fluidlite.lib",             nullptr,           nullptr                                           },
-		{   "libcurl", "libcurl.lib",               "libcurl-d.lib",   "ws2_32.lib wldap32.lib crypt32.lib normaliz.lib" },
-		{    "sdlnet", "SDL_net.lib",               nullptr,           "iphlpapi.lib"                                    },
-		{   "sdl2net", "SDL2_net.lib",              "SDL2_netd.lib",   "iphlpapi.lib"                                    },
-		{   "discord", "discord-rpc.lib",           nullptr,           nullptr                                           },
-		{ "retrowave", "RetroWave.lib",             nullptr,           nullptr                                           },
-		{       "a52", "a52.lib",                   nullptr,           nullptr                                           },
-		{       "mpc", "libmpcdec.lib",             "libmpcdec_d.lib", nullptr                                           },
+		{       "sdl", "SDL.lib",                   "SDLd.lib",        kSDLVersion1,   "winmm.lib imm32.lib version.lib setupapi.lib"    },
+		{       "sdl", "SDL2.lib",                  "SDL2d.lib",       kSDLVersion2,   "winmm.lib imm32.lib version.lib setupapi.lib"    },
+		{       "sdl", "SDL3.lib",                  "SDL3d.lib",       kSDLVersion3,   "winmm.lib imm32.lib version.lib setupapi.lib"    },
+		{      "zlib", "zlib.lib",                  "zlibd.lib",       kSDLVersionAny, nullptr                                           },
+		{       "mad", "mad.lib",                   nullptr,           kSDLVersionAny, nullptr                                           },
+		{   "fribidi", "fribidi.lib",               nullptr,           kSDLVersionAny, nullptr                                           },
+		{       "ogg", "ogg.lib",                   nullptr,           kSDLVersionAny, nullptr                                           },
+		{    "vorbis", "vorbis.lib vorbisfile.lib", nullptr,           kSDLVersionAny, nullptr                                           },
+		{    "tremor", "vorbisidec.lib",            nullptr,           kSDLVersionAny, nullptr                                           },
+		{      "flac", "FLAC.lib",                  nullptr,           kSDLVersionAny, nullptr                                           },
+		{       "png", "libpng16.lib",              "libpng16d.lib",   kSDLVersionAny, nullptr                                           },
+		{       "gif", "gif.lib",                   nullptr,           kSDLVersionAny, nullptr                                           },
+		{      "faad", "faad.lib",                  nullptr,           kSDLVersionAny, nullptr                                           },
+		{    "mikmod", "mikmod.lib",                nullptr,           kSDLVersionAny, nullptr                                           },
+		{   "openmpt", "openmpt.lib",               nullptr,           kSDLVersionAny, nullptr                                           },
+		{     "mpeg2", "mpeg2.lib",                 nullptr,           kSDLVersionAny, nullptr                                           },
+		{ "theoradec", "theora.lib",                nullptr,           kSDLVersionAny, nullptr                                           },
+		{       "vpx", "vpx.lib",                   nullptr,           kSDLVersionAny, nullptr                                           },
+		{ "freetype2", "freetype.lib",              "freetyped.lib",   kSDLVersionAny, nullptr                                           },
+		{      "jpeg", "jpeg.lib",                  nullptr,           kSDLVersionAny, nullptr                                           },
+		{"fluidsynth", "fluidsynth.lib",            nullptr,           kSDLVersionAny, nullptr                                           },
+		{ "fluidlite", "fluidlite.lib",             nullptr,           kSDLVersionAny, nullptr                                           },
+		{   "libcurl", "libcurl.lib",               "libcurl-d.lib",   kSDLVersionAny, "ws2_32.lib wldap32.lib crypt32.lib normaliz.lib" },
+		{    "sdlnet", "SDL_net.lib",               nullptr,           kSDLVersion1,   "iphlpapi.lib"                                    },
+		{    "sdlnet", "SDL2_net.lib",              "SDL2_netd.lib",   kSDLVersion2,   "iphlpapi.lib"                                    },
+		{    "sdlnet", "SDL3_net.lib",              "SDL3_netd.lib",   kSDLVersion3,   "iphlpapi.lib"                                    },
+		{   "discord", "discord-rpc.lib",           nullptr,           kSDLVersionAny, nullptr                                           },
+		{ "retrowave", "RetroWave.lib",             nullptr,           kSDLVersionAny, nullptr                                           },
+		{       "a52", "a52.lib",                   nullptr,           kSDLVersionAny, nullptr                                           },
+		{       "mpc", "libmpcdec.lib",             "libmpcdec_d.lib", kSDLVersionAny, nullptr                                           },
 		// Feature flags with library dependencies
-		{   "updates", "WinSparkle.lib",            nullptr,           nullptr                                           },
-		{       "tts", nullptr,                     nullptr,           "sapi.lib"                                        },
-		{    "opengl", nullptr,                     nullptr,           nullptr                                           },
-		{      "enet", nullptr,                     nullptr,           "winmm.lib ws2_32.lib"                            }
+		{   "updates", "WinSparkle.lib",            nullptr,           kSDLVersionAny, nullptr                                           },
+		{       "tts", nullptr,                     nullptr,           kSDLVersionAny, "sapi.lib"                                        },
+		{    "opengl", nullptr,                     nullptr,           kSDLVersionAny, nullptr                                           },
+		{      "enet", nullptr,                     nullptr,           kSDLVersionAny, "winmm.lib ws2_32.lib"                            }
 	};
 
-	// HACK for switching SDL_net to SDL2_net
-	const char *sdl2net = "sdl2net";
-	if (std::strcmp(feature, "sdlnet") == 0 && setup.useSDL2) {
-		feature = sdl2net;
-	}
-
 	const MSVCLibrary *library = nullptr;
 	for (unsigned int i = 0; i < sizeof(s_libraries) / sizeof(s_libraries[0]); i++) {
-		if (std::strcmp(feature, s_libraries[i].feature) == 0) {
+		if (std::strcmp(feature, s_libraries[i].feature) == 0 &&
+			((s_libraries[i].sdl == kSDLVersionAny) ||
+			(s_libraries[i].sdl == setup.useSDL))) {
 			library = &s_libraries[i];
 			break;
 		}
@@ -126,11 +124,8 @@ std::string MSVCProvider::getLibraryFromFeature(const char *feature, const Build
 std::string MSVCProvider::outputLibraryDependencies(const BuildSetup &setup, bool isRelease) const {
 	std::string libs;
 
-	if (setup.useSDL2) {
-		libs += getLibraryFromFeature("sdl2", setup, isRelease);
-	} else {
-		libs += getLibraryFromFeature("sdl", setup, isRelease);
-	}
+	// SDL is always enabled
+	libs += getLibraryFromFeature("sdl", setup, isRelease);
 	libs += " ";
 	for (FeatureList::const_iterator i = setup.features.begin(); i != setup.features.end(); ++i) {
 		if (i->enable) {
@@ -284,7 +279,7 @@ std::string MSVCProvider::getPostBuildEvent(MSVC_Architecture arch, const BuildS
 	          "echo.\n"
 	          "@call "$(SolutionDir)../../devtools/create_project/scripts/postbuild.cmd" "$(SolutionDir)/../.." "$(OutDir)" ";
 
-	cmdLine += (setup.useSDL2) ? "SDL2" : "SDL";
+	cmdLine += setup.getSDLName();
 
 	if (setup.useVcpkg) {
 		cmdLine += " "$(_ZVcpkgCurrentInstalledDir)";
diff --git a/devtools/create_project/msvc.h b/devtools/create_project/msvc.h
index 86ea9c61ba5..d9b4901076a 100644
--- a/devtools/create_project/msvc.h
+++ b/devtools/create_project/msvc.h
@@ -46,6 +46,7 @@ protected:
 		const char *feature; ///< Feature ID.
 		const char *release; ///< Filename of the Release build of the library.
 		const char *debug;   ///< Filename of the Debug build of the library.
+		SDLVersion sdl;      ///< Required SDL version.
 		const char *depends; ///< Win32 libs this library must be linked against.
 	};
 
diff --git a/devtools/create_project/xcode.cpp b/devtools/create_project/xcode.cpp
index 386b19e4266..677a3f1971d 100644
--- a/devtools/create_project/xcode.cpp
+++ b/devtools/create_project/xcode.cpp
@@ -496,6 +496,8 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 	DEF_SYSFRAMEWORK("SystemConfiguration");
 	DEF_SYSTBD("libiconv");
 
+	std::string libSDL = setup.getSDLName();
+
 	// Local libraries
 	if (CONTAINS_DEFINE(setup.defines, "USE_FAAD")) {
 		DEF_LOCALLIB_STATIC("libfaad");
@@ -597,15 +599,19 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 		DEF_LOCALXCFRAMEWORK("mpcdec", projectOutputDirectory);
 	}
 
-	if (setup.useSDL2) {
-		DEF_LOCALLIB_STATIC("libSDL2main");
+	if (setup.useSDL == kSDLVersion3) {
+		DEF_LOCALLIB_STATIC("libSDL3");
+		if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET")) {
+			DEF_LOCALLIB_STATIC("libSDL3_net");
+			DEF_LOCALXCFRAMEWORK("SDL3_net", projectOutputDirectory);
+		}
+	} else if (setup.useSDL == kSDLVersion2) {
 		DEF_LOCALLIB_STATIC("libSDL2");
 		if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET")) {
 			DEF_LOCALLIB_STATIC("libSDL2_net");
 			DEF_LOCALXCFRAMEWORK("SDL2_net", projectOutputDirectory);
 		}
-	} else {
-		DEF_LOCALLIB_STATIC("libSDLmain");
+	} else if (setup.useSDL == kSDLVersion1) {
 		DEF_LOCALLIB_STATIC("libSDL");
 		if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET")) {
 			DEF_LOCALLIB_STATIC("libSDL_net");
@@ -721,11 +727,7 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 		frameworks_iOS.push_back("Security.framework");
 	}
 	if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET")) {
-		if (setup.useSDL2) {
-			frameworks_iOS.push_back(getLibString("SDL2_net", setup.useXCFramework));
-		} else {
-			frameworks_iOS.push_back(getLibString("SDL_net", setup.useXCFramework));
-		}
+		frameworks_iOS.push_back(getLibString(libSDL + "_net", setup.useXCFramework));
 	}
 
 	for (ValueList::iterator framework = frameworks_iOS.begin(); framework != frameworks_iOS.end(); framework++) {
@@ -841,17 +843,9 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 		frameworks_osx.push_back(getLibString("mpcdec", setup.useXCFramework));
 	}
 
-	if (setup.useSDL2) {
-		frameworks_osx.push_back(getLibString("SDL2main", setup.useXCFramework));
-		frameworks_osx.push_back(getLibString("SDL2", setup.useXCFramework));
-		if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET"))
-			frameworks_osx.push_back(getLibString("SDL2_net", setup.useXCFramework));
-	} else {
-		frameworks_osx.push_back(getLibString("SDLmain", setup.useXCFramework));
-		frameworks_osx.push_back(getLibString("SDL", setup.useXCFramework));
-		if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET"))
-			frameworks_osx.push_back(getLibString("SDL_net", setup.useXCFramework));
-	}
+	frameworks_osx.push_back(getLibString(libSDL, setup.useXCFramework));
+	if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET"))
+		frameworks_osx.push_back(getLibString(libSDL + "_net", setup.useXCFramework));
 
 	order = 0;
 	for (ValueList::iterator framework = frameworks_osx.begin(); framework != frameworks_osx.end(); framework++) {
@@ -964,11 +958,7 @@ void XcodeProvider::setupFrameworksBuildPhase(const BuildSetup &setup) {
 		frameworks_tvOS.push_back("Security.framework");
 	}
 	if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET")) {
-		if (setup.useSDL2) {
-			frameworks_tvOS.push_back(getLibString("SDL2_net", setup.useXCFramework));
-		} else {
-			frameworks_tvOS.push_back(getLibString("SDL_net", setup.useXCFramework));
-		}
+		frameworks_tvOS.push_back(getLibString(libSDL + "_net", setup.useXCFramework));
 	}
 
 	for (ValueList::iterator framework = frameworks_tvOS.begin(); framework != frameworks_tvOS.end(); framework++) {
@@ -1304,6 +1294,8 @@ void XcodeProvider::setupBuildConfiguration(const BuildSetup &setup) {
 	projectOutputDirectory = rp;
 #endif
 
+	std::string libSDL = setup.getSDLName();
+
 	/****************************************
 	 * ScummVM - Project Level
 	 ****************************************/
@@ -1419,10 +1411,7 @@ void XcodeProvider::setupBuildConfiguration(const BuildSetup &setup) {
 	if (!setup.useXCFramework) {
 		iPhone_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "/include\"");
 		if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET")) {
-			if (setup.useSDL2)
-				iPhone_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "/include/SDL2\"");
-			else
-				iPhone_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "include/SDL\"");
+			iPhone_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "/include/" + libSDL + "\"");
 		}
 	}
 	ADD_SETTING_LIST(iPhone_Debug, "HEADER_SEARCH_PATHS", iPhone_HeaderSearchPaths, kSettingsAsList | kSettingsQuoteVariable, 5);
@@ -1498,20 +1487,19 @@ void XcodeProvider::setupBuildConfiguration(const BuildSetup &setup) {
 	ValueList scummvmOSX_defines;
 	ADD_DEFINE(scummvmOSX_defines, "\"$(inherited)\"");
 	ADD_DEFINE(scummvmOSX_defines, "SDL_BACKEND");
-	ADD_DEFINE(scummvmOSX_defines, "USE_SDL2");
+	if (setup.useSDL == kSDLVersion2) {
+		ADD_DEFINE(scummvmOSX_defines, "USE_SDL2");
+	} else if (setup.useSDL == kSDLVersion3) {
+		ADD_DEFINE(scummvmOSX_defines, "USE_SDL3");
+	}
 	ADD_DEFINE(scummvmOSX_defines, "MACOSX");
 	ADD_SETTING_LIST(scummvmOSX_Debug, "GCC_PREPROCESSOR_DEFINITIONS", scummvmOSX_defines, kSettingsNoQuote | kSettingsAsList, 5);
 	ADD_SETTING_QUOTE(scummvmOSX_Debug, "GCC_VERSION", "");
 	ValueList scummvmOSX_HeaderPaths;
 	for (StringList::const_iterator i = setup.includeDirs.begin(); i != setup.includeDirs.end(); ++i)
 		scummvmOSX_HeaderPaths.push_back("\"" + *i + "\"");
-	if (setup.useSDL2) {
-		scummvmOSX_HeaderPaths.push_back("/usr/local/include/SDL2");
-		scummvmOSX_HeaderPaths.push_back("/opt/local/include/SDL2");
-	} else {
-		scummvmOSX_HeaderPaths.push_back("/usr/local/include/SDL");
-		scummvmOSX_HeaderPaths.push_back("/opt/local/include/SDL");
-	}
+	scummvmOSX_HeaderPaths.push_back("/usr/local/include/" + libSDL);
+	scummvmOSX_HeaderPaths.push_back("/opt/local/include/" + libSDL);
 	scummvmOSX_HeaderPaths.push_back("/usr/local/include");
 	scummvmOSX_HeaderPaths.push_back("/opt/local/include");
 	scummvmOSX_HeaderPaths.push_back("/usr/local/include/freetype2");
@@ -1584,10 +1572,7 @@ void XcodeProvider::setupBuildConfiguration(const BuildSetup &setup) {
 	tvOS_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "\"");
 	tvOS_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "/include\"");
 	if (CONTAINS_DEFINE(setup.defines, "USE_SDL_NET")) {
-		if (setup.useSDL2)
-			tvOS_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "/include/SDL2\"");
-		else
-			tvOS_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "include/SDL\"");
+		tvOS_HeaderSearchPaths.push_back("\"" + projectOutputDirectory + "/include/" + libSDL + "\"");
 	}
 	ADD_SETTING_LIST(tvOS_Debug, "HEADER_SEARCH_PATHS", tvOS_HeaderSearchPaths, kSettingsAsList | kSettingsQuoteVariable, 5);
 	ADD_SETTING_QUOTE(tvOS_Debug, "INFOPLIST_FILE", "$(SRCROOT)/dists/tvos/Info.plist");




More information about the Scummvm-git-logs mailing list