From cc65ca92eceb8e1df3a021d6b3875e9391ddffb7 Mon Sep 17 00:00:00 2001 From: 0x2Adr1 <0x2adr1@gmail.com> Date: Mon, 11 Sep 2023 03:01:38 -0700 Subject: [PATCH] SFML 2.6.0, support for ARM macOS M1 and M2 (#2206) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * SFML 2.6.0 * restore 2.5.1 * Windows ARM and Linux X11 * WIP * WIP * Build SFML on every platform * Update xmake.lua * Update xmake.lua * Update xmake.lua * sfml: Use system deps * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua * Update xmake.lua --------- Co-authored-by: Jérôme Leclercq Co-authored-by: ruki --- packages/s/sfml/xmake.lua | 248 ++++++++++++++++++++------------------ 1 file changed, 128 insertions(+), 120 deletions(-) diff --git a/packages/s/sfml/xmake.lua b/packages/s/sfml/xmake.lua index 2a604fe53..78acdc3ef 100644 --- a/packages/s/sfml/xmake.lua +++ b/packages/s/sfml/xmake.lua @@ -1,57 +1,36 @@ package("sfml") - set_homepage("https://www.sfml-dev.org") set_description("Simple and Fast Multimedia Library") + set_license("zlib") - if is_plat("windows", "linux") then - set_urls("https://www.sfml-dev.org/files/SFML-$(version)-sources.zip") - add_urls("https://github.com/SFML/SFML/releases/download/$(version)/SFML-$(version)-sources.zip") - add_versions("2.5.1", "bf1e0643acb92369b24572b703473af60bac82caf5af61e77c063b779471bb7f") - elseif is_plat("macosx") then - if is_arch("x64", "x86_64") then - set_urls("https://www.sfml-dev.org/files/SFML-$(version)-macOS-clang.tar.gz") - add_versions("2.5.1", "6af0f14fbd41dc038a00d7709f26fb66bb7ccdfe6187657ef0ef8cba578dcf14") + add_urls("https://github.com/SFML/SFML/archive/refs/tags/$(version).tar.gz", + "https://github.com/SFML/SFML.git") - add_configs("debug", {builtin = true, description = "Enable debug symbols.", default = false, type = "boolean", readonly = true}) - add_configs("shared", {description = "Build shared library.", default = true, type = "boolean", readonly = true}) - end - elseif is_plat("mingw") then - if is_arch("x64", "x86_64") then - set_urls("https://www.sfml-dev.org/files/SFML-$(version)-windows-gcc-7.3.0-mingw-64-bit.zip") - add_versions("2.5.1", "671e786f1af934c488cb22c634251c8c8bd441c709b4ef7bc6bbe227b2a28560") - elseif is_arch("x86", "i386") then - set_urls("https://www.sfml-dev.org/files/SFML-$(version)-windows-gcc-7.3.0-mingw-32-bit.zip") - add_versions("2.5.1", "92d864c9c9094dc9d91e0006d66784f25ac900a8ee23c3f79db626de46a1d9d8") - end + -- Before 2.6.0 only x86 is supported for Mac + if not is_plat("macosx") or not is_arch("arm.*") then + add_versions("2.5.1", "438c91a917cc8aa19e82c6f59f8714da353c488584a007d401efac8368e1c785") end - if is_plat("linux") then - add_syslinks("pthread") - end + add_versions("2.6.0", "0c3f84898ea1db07dc46fa92e85038d8c449e3c8653fe09997383173de96bc06") add_configs("graphics", {description = "Use the graphics module", default = true, type = "boolean"}) add_configs("window", {description = "Use the window module", default = true, type = "boolean"}) add_configs("audio", {description = "Use the audio module", default = true, type = "boolean"}) add_configs("network", {description = "Use the network module", default = true, type = "boolean"}) if is_plat("windows", "mingw") then - add_configs("main", {description = "Link to the sfml-main library", default = true, type = "boolean"}) + add_configs("main", {description = "Link to the sfml-main library", default = true, type = "boolean"}) end if is_plat("macosx") then add_extsources("brew::sfml/sfml-all") end - on_component = on_component or function() end on_component("graphics", function (package, component) local e = package:config("shared") and "" or "-s" if package:debug() then e = e .. "-d" end component:add("links", "sfml-graphics" .. e) - if package:is_plat("windows", "mingw") and not package:config("shared") then - component:add("links", "freetype") - component:add("syslinks", "opengl32", "gdi32", "user32", "advapi32") - end component:add("deps", "window", "system") component:add("extsources", "brew::sfml/sfml-graphics") end) @@ -62,11 +41,21 @@ package("sfml") e = e .. "-d" end component:add("links", "sfml-window" .. e) - if package:is_plat("windows", "mingw") and not package:config("shared") then - component:add("syslinks", "opengl32", "gdi32", "user32", "advapi32") - end component:add("deps", "system") component:add("extsources", "brew::sfml/sfml-window") + if not package:config("shared") then + if package:is_plat("windows", "mingw") then + component:add("syslinks", "opengl32", "gdi32", "advapi32") + elseif package:is_plat("linux") then + component:add("syslinks", "dl") + elseif package:is_plat("bsd") then + component:add("syslinks", "usbhid") + elseif package:is_plat("macosx") then + component:add("frameworks", "Foundation", "AppKit", "IOKit", "Carbon") + elseif package:is_plat("iphoneos") then + component:add("frameworks", "Foundation", "UIKit", "CoreGraphics", "QuartzCore", "CoreMotion") + end + end end) on_component("audio", function (package, component) @@ -75,11 +64,11 @@ package("sfml") e = e .. "-d" end component:add("links", "sfml-audio" .. e) - if package:is_plat("windows", "mingw") and not package:config("shared") then - component:add("links", "openal32", "flac", "vorbisenc", "vorbisfile", "vorbis", "ogg") - end component:add("deps", "system") component:add("extsources", "brew::sfml/sfml-audio") + if not package:config("shared") and package:is_plat("windows", "mingw") then + component:add("links", "openal32", "flac", "vorbisenc", "vorbisfile", "vorbis", "ogg") + end end) on_component("network", function (package, component) @@ -88,12 +77,12 @@ package("sfml") e = e .. "-d" end component:add("links", "sfml-network" .. e) - if package:is_plat("windows", "mingw") and not package:config("shared") then - component:add("syslinks", "ws2_32") - end component:add("deps", "system") component:add("extsources", "brew::sfml/sfml-network") component:add("extsources", "apt::sfml-network") + if not package:config("shared") and package:is_plat("windows", "mingw") then + component:add("syslinks", "ws2_32") + end end) on_component("system", function (package, component) @@ -109,6 +98,15 @@ package("sfml") component:add("deps", "main") end component:add("extsources", "brew::sfml/sfml-system") + if not package:config("shared") then + if package:is_plat("windows", "mingw") then + component:add("syslinks", "winmm") + elseif package:is_plat("linux") then + component:add("syslinks", "rt", "pthread") + elseif package:is_plat("bsd", "macosx") then + component:add("syslinks", "pthread") + end + end end) on_component("main", function (package, component) @@ -122,7 +120,7 @@ package("sfml") end) on_load("windows", "linux", "macosx", "mingw", function (package) - if package:is_plat("windows", "linux") then + if package:is_plat("windows", "linux", "macosx") then package:add("deps", "cmake") end @@ -130,107 +128,119 @@ package("sfml") package:add("defines", "SFML_STATIC") end - -- enable components when xmake >=2.7.3 - if package.components then - if package:is_plat("linux") then - if package:config("window") or package:config("graphics") then - package:add("deps", "libx11", "libxext", "libxrandr", "libxrender", "freetype", "eudev") - package:add("deps", "opengl", "glx", {optional = true}) - end - end - if package:config("audio") then - package:add("deps", "libogg", "libflac", "libvorbis", "openal-soft") - end - package:add("components", "system") - for _, component in ipairs({"graphics", "window", "audio", "network"}) do - if package:config(component) then - package:add("components", component) - end - end - if package:is_plat("windows", "mingw") and package:config("main") then - package:add("components", "main") - end - else - local e = package:config("shared") and "" or "-s" - if package:debug() then - e = e .. "-d" - end - local a = "sfml-" - local main_module = a .. "main" - if package:debug() then - main_module = main_module .. "-d" - end + if package:config("graphics") then + package:add("deps", "freetype") + end - if package:config("graphics") then - package:add("links", a .. "graphics" .. e) - if package:is_plat("windows", "mingw") and not package:config("shared") then - package:add("links", "freetype") - end - end + if package:is_plat("linux") then if package:config("window") or package:config("graphics") then - package:add("links", a .. "window" .. e) - if package:is_plat("windows", "mingw") and not package:config("shared") then - package:add("syslinks", "opengl32", "gdi32", "user32", "advapi32") - end - if package:is_plat("linux") then - package:add("deps", "libx11", "libxext", "libxrandr", "libxrender", "freetype", "eudev") - package:add("deps", "opengl", "glx", {optional = true}) - end - end - if package:config("audio") then - package:add("links", a .. "audio" .. e) - if package:is_plat("windows", "mingw") and not package:config("shared") then - package:add("links", "openal32", "flac", "vorbisenc", "vorbisfile", "vorbis", "ogg") - elseif package:is_plat("linux") then - package:add("deps", "libogg", "libflac", "libvorbis", "openal-soft") - end - end - if package:config("network") then - package:add("links", a .. "network" .. e) - if package:is_plat("windows", "mingw") and not package:config("shared") then - package:add("syslinks", "ws2_32") - end + package:add("deps", "libx11", "libxcursor", "libxrandr", "libxrender", "libxfixes", "libxext", "eudev") + package:add("deps", "opengl", "glx", {optional = true}) end - if package:is_plat("windows", "mingw") and package:config("main") then - package:add("links", main_module) - end - package:add("links", a .. "system" .. e) - if package:is_plat("windows", "mingw") then - package:add("syslinks", "winmm") + end + + if package:config("audio") then + package:add("deps", "libogg", "libflac", "libvorbis", "openal-soft") + end + + package:add("components", "system") + for _, component in ipairs({"graphics", "window", "audio", "network"}) do + if package:config(component) then + package:add("components", component) end end + + if package:is_plat("windows", "mingw") and package:config("main") then + package:add("components", "main") + end end) - on_install("windows", "linux", function (package) + on_install("windows", "linux", "macosx", "mingw", function (package) local configs = {"-DSFML_BUILD_DOC=OFF", "-DSFML_BUILD_EXAMPLES=OFF"} table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release")) if package:config("shared") then table.insert(configs, "-DBUILD_SHARED_LIBS=ON") + -- Fix missing system libs + if package:config("audio") then + if package:is_plat("windows", "mingw") then + local file = io.open("src/SFML/Audio/CMakeLists.txt", "a") + file:print("target_link_libraries(OpenAL INTERFACE winmm)") + file:close() + end + end + if package:config("graphics") then + local freetype = package:dep("freetype") + if freetype then + local fetchinfo = freetype:fetch() + if fetchinfo then + if not freetype:config("shared") then + local libfiles = {} + for _, dep in ipairs(freetype:librarydeps()) do + local depinfo = dep:fetch() + if depinfo then + table.join2(libfiles, depinfo.libfiles) + end + end + if #libfiles > 0 then + local libraries = {} + for _, libfile in ipairs(libfiles) do + table.insert(libraries, (libfile:gsub("\\", "/"))) + end + local file = io.open("src/SFML/Graphics/CMakeLists.txt", "a") + file:print("target_link_libraries(Freetype INTERFACE " .. table.concat(libraries, " ") .. ")") + file:close() + end + end + end + end + end + if package:config("window") and package:is_plat("linux") then + local libfiles = {} + for _, name in ipairs({"libx11", "libxcursor", "libxrandr", "libxrender", "libxfixes", "libxext"}) do + local dep = package:dep(name) + if dep then + local fetchinfo = dep:fetch() + if fetchinfo then + table.join2(libfiles, fetchinfo.libfiles) + print(fetchinfo.libfiles) + end + end + end + if #libfiles > 0 then + libfiles = table.reverse_unique(libfiles) + local libraries = {} + for _, libfile in ipairs(libfiles) do + table.insert(libraries, (libfile:gsub("\\", "/"))) + end + local file = io.open("src/SFML/Window/CMakeLists.txt", "a") + file:print("target_link_libraries(sfml-window PRIVATE " .. table.concat(libraries, " ") .. ")") + file:close() + end + end else table.insert(configs, "-DBUILD_SHARED_LIBS=OFF") if package:is_plat("windows") and package:config("vs_runtime"):startswith("MT") then table.insert(configs, "-DSFML_USE_STATIC_STD_LIBS=ON") end end - local packagedeps - if package:is_plat("linux") and package:config("shared") then - io.replace("src/SFML/Graphics/CMakeLists.txt", "target_link_libraries(sfml-graphics PRIVATE X11)", - "target_link_libraries(sfml-graphics PRIVATE X11 Xext Xrender)", {plain = true}) - packagedeps = {"libxext", "libxrender"} - end table.insert(configs, "-DSFML_BUILD_AUDIO=" .. (package:config("audio") and "ON" or "OFF")) table.insert(configs, "-DSFML_BUILD_GRAPHICS=" .. (package:config("graphics") and "ON" or "OFF")) table.insert(configs, "-DSFML_BUILD_WINDOW=" .. (package:config("window") and "ON" or "OFF")) table.insert(configs, "-DSFML_BUILD_NETWORK=" .. (package:config("network") and "ON" or "OFF")) - import("package.tools.cmake").install(package, configs, {packagedeps = packagedeps}) - end) - - on_install("macosx", "mingw", function (package) - os.cp("lib", package:installdir()) - os.cp("include", package:installdir()) - if package:is_plat("mingw") then - os.cp("bin/*", package:installdir("lib"), {rootdir = "bin"}) + table.insert(configs, "-DWARNINGS_AS_ERRORS=OFF") + table.insert(configs, "-DSFML_USE_SYSTEM_DEPS=TRUE") + local packagedeps + if package:config("audio") then + packagedeps = packagedeps or {} + table.insert(packagedeps, "openal-soft") end + if package:config("graphics") then + packagedeps = packagedeps or {} + table.insert(packagedeps, "freetype") + table.insert(packagedeps, "zlib") + end + + import("package.tools.cmake").install(package, configs, {packagedeps = packagedeps}) end) on_test(function (package) @@ -282,5 +292,3 @@ package("sfml") ]]}, {includes = "SFML/Network.hpp"})) end end) -package_end() -