From 5692805fd0bb1aa70cd6965de83068db60743b34 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 22:39:59 +0800 Subject: add components tests --- tests/projects/package/components/xmake.lua | 201 ++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 tests/projects/package/components/xmake.lua (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua new file mode 100644 index 000000000..17b8b4d04 --- /dev/null +++ b/tests/projects/package/components/xmake.lua @@ -0,0 +1,201 @@ +add_rules("mode.debug", "mode.release") + +add_requires("sfml") + +target("graphics") + set_kind("static") + add_files("src/graphics.cpp") + add_packages("sfml", {public = true}) + +target("network") + set_kind("static") + add_files("src/network.cpp") + add_packages("sfml", {public = true}) + +target("test") + set_kind("binary") + add_files("src/main.cpp") + add_deps("graphics", "network") + +package("sfml") + + set_homepage("https://www.sfml-dev.org") + set_description("Simple and Fast Multimedia Library") + + 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_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 + end + + if is_plat("linux") then + add_syslinks("pthread") + end + + 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"}) + end + + on_load("windows", "linux", "macosx", "mingw", function (package) + if package:is_plat("windows", "linux") then + package:add("deps", "cmake") + end + + if not package:config("shared") then + package:add("defines", "SFML_STATIC") + end + + local e = "" + local a = "sfml-" + if not package:config("shared") then + e = "-s" + end + if package:debug() then + e = e .. "-d" + end + local main_module = a .. "main" + if package:debug() then + main_module = main_module .. "-d" + 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: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 + 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 + end) + + on_install("windows", "linux", 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") + 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"}) + end + end) + + on_test(function (package) + assert(package:check_cxxsnippets({test = [[ + void test(int args, char** argv) { + sf::Clock c; + c.restart(); + } + ]]}, {includes = "SFML/System.hpp"})) + if package:config("graphics") then + assert(package:check_cxxsnippets({test = [[ + void test(int args, char** argv) { + sf::Text text; + text.setString("Hello world"); + } + ]]}, {includes = "SFML/Graphics.hpp"})) + end + if package:config("window") or package:config("graphics") then + assert(package:check_cxxsnippets({test = [[ + void test(int args, char** argv) { + sf::Window window(sf::VideoMode(1280, 720), "Title"); + + sf::Event event; + window.pollEvent(event); + } + ]]}, {includes = "SFML/Window.hpp"})) + end + if package:config("audio") then + assert(package:check_cxxsnippets({test = [[ + void test(int args, char** argv) { + sf::Music music; + music.openFromFile("music.ogg"); + music.play(); + } + ]]}, {includes = "SFML/Audio.hpp"})) + end + if package:config("network") then + assert(package:check_cxxsnippets({test = [[ + void test(int args, char** argv) { + sf::UdpSocket socket; + socket.bind(54000); + + char data[100]; + std::size_t received; + sf::IpAddress sender; + unsigned short port; + socket.receive(data, 100, received, sender, port); + } + ]]}, {includes = "SFML/Network.hpp"})) + end + end) +package_end() -- cgit v1.3.1 From 0bc0bf1e0d114d1050eefde177cc3fca23777010 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 22:43:28 +0800 Subject: improve sfml tests --- tests/projects/package/components/test.lua | 12 ---- tests/projects/package/components/xmake.lua | 92 +++++++++++++++++------------ 2 files changed, 53 insertions(+), 51 deletions(-) delete mode 100644 tests/projects/package/components/test.lua (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/test.lua b/tests/projects/package/components/test.lua deleted file mode 100644 index 4964fecaa..000000000 --- a/tests/projects/package/components/test.lua +++ /dev/null @@ -1,12 +0,0 @@ -function main(t) - - -- freebsd ci is slower - if is_host("bsd") then - return - end - - -- only for x86/x64, because it will take too long time on ci with arm/mips - if os.subarch():startswith("x") or os.subarch() == "i386" then - t:build() - end -end diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 17b8b4d04..85ff819c8 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -56,65 +56,79 @@ package("sfml") add_configs("main", {description = "Link to the sfml-main library", default = true, type = "boolean"}) end - on_load("windows", "linux", "macosx", "mingw", function (package) - if package:is_plat("windows", "linux") then - package:add("deps", "cmake") + add_components("graphics", function (package, component) + local e = package:config("shared") and "" or "-s" + 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 + end) - if not package:config("shared") then - package:add("defines", "SFML_STATIC") + add_components("window", function (package, component) + local e = package:config("shared") and "" or "-s" + 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 + end) - local e = "" - local a = "sfml-" - if not package:config("shared") then - e = "-s" + add_components("audio", function (package, component) + local e = package:config("shared") and "" or "-s" + 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 - if package:debug() then - e = e .. "-d" + end) + + add_components("network", function (package, component) + local e = package:config("shared") and "" or "-s" + component:add("links", "sfml-network" .. e) + if package:is_plat("windows", "mingw") and not package:config("shared") then + component:add("syslinks", "ws2_32") end - local main_module = a .. "main" - if package:debug() then - main_module = main_module .. "-d" + end) + + add_components("system", function (package, component) + local e = package:config("shared") and "" or "-s" + component:add("links", "sfml-system" .. e) + if package:is_plat("windows", "mingw") then + component:add("syslinks", "winmm") end + 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") + if is_plat("windows", "mingw") then + add_components("main", function (package, component) + if package:is_plat("windows", "mingw") then + local main_module = "sfml-main" + if package:debug() then + main_module = main_module .. "-d" + end + component:add("links", main_module) end + end) + end + + on_load("windows", "linux", "macosx", "mingw", function (package) + if package:is_plat("windows", "linux") then + package:add("deps", "cmake") end + + if not package:config("shared") then + package:add("defines", "SFML_STATIC") + end + 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 + if 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 - 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 end) on_install("windows", "linux", function (package) -- cgit v1.3.1 From fe51bda379eb2f82f8c9d5c799bbca1a53862618 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 22:51:59 +0800 Subject: improve components api --- tests/projects/package/components/xmake.lua | 45 ++++++++++++++++------------- 1 file changed, 25 insertions(+), 20 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 85ff819c8..7851638c5 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -56,7 +56,7 @@ package("sfml") add_configs("main", {description = "Link to the sfml-main library", default = true, type = "boolean"}) end - add_components("graphics", function (package, component) + on_components("graphics", function (package, component) local e = package:config("shared") and "" or "-s" component:add("links", "sfml-graphics" .. e) if package:is_plat("windows", "mingw") and not package:config("shared") then @@ -65,7 +65,7 @@ package("sfml") end end) - add_components("window", function (package, component) + on_components("window", function (package, component) local e = package:config("shared") and "" or "-s" component:add("links", "sfml-window" .. e) if package:is_plat("windows", "mingw") and not package:config("shared") then @@ -73,7 +73,7 @@ package("sfml") end end) - add_components("audio", function (package, component) + on_component("audio", function (package, component) local e = package:config("shared") and "" or "-s" component:add("links", "sfml-audio" .. e) if package:is_plat("windows", "mingw") and not package:config("shared") then @@ -81,7 +81,7 @@ package("sfml") end end) - add_components("network", function (package, component) + on_component("network", function (package, component) local e = package:config("shared") and "" or "-s" component:add("links", "sfml-network" .. e) if package:is_plat("windows", "mingw") and not package:config("shared") then @@ -89,7 +89,7 @@ package("sfml") end end) - add_components("system", function (package, component) + on_component("system", function (package, component) local e = package:config("shared") and "" or "-s" component:add("links", "sfml-system" .. e) if package:is_plat("windows", "mingw") then @@ -97,17 +97,15 @@ package("sfml") end end) - if is_plat("windows", "mingw") then - add_components("main", function (package, component) - if package:is_plat("windows", "mingw") then - local main_module = "sfml-main" - if package:debug() then - main_module = main_module .. "-d" - end - component:add("links", main_module) + on_component("main", function (package, component) + if package:is_plat("windows", "mingw") then + local main_module = "sfml-main" + if package:debug() then + main_module = main_module .. "-d" end - end) - end + component:add("links", main_module) + end + end) on_load("windows", "linux", "macosx", "mingw", function (package) if package:is_plat("windows", "linux") then @@ -118,17 +116,24 @@ package("sfml") package:add("defines", "SFML_STATIC") end - if package:config("window") or package:config("graphics") then - if package:is_plat("linux") 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 - if package:is_plat("linux") then + if package:config("audio") then package:add("deps", "libogg", "libflac", "libvorbis", "openal-soft") end end + 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 + package:add("components", "system") end) on_install("windows", "linux", function (package) -- cgit v1.3.1 From 3cf635758acdcdafcc7199adc6e05d8747c5910a Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 22:54:12 +0800 Subject: add component stub --- tests/projects/package/components/xmake.lua | 4 +- xmake/core/package/component.lua | 92 +++++++++++++++++++++++++++++ xmake/core/package/package.lua | 2 +- 3 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 xmake/core/package/component.lua (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 7851638c5..1b0d39c2d 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -56,7 +56,7 @@ package("sfml") add_configs("main", {description = "Link to the sfml-main library", default = true, type = "boolean"}) end - on_components("graphics", function (package, component) + on_component("graphics", function (package, component) local e = package:config("shared") and "" or "-s" component:add("links", "sfml-graphics" .. e) if package:is_plat("windows", "mingw") and not package:config("shared") then @@ -65,7 +65,7 @@ package("sfml") end end) - on_components("window", function (package, component) + on_component("window", function (package, component) local e = package:config("shared") and "" or "-s" component:add("links", "sfml-window" .. e) if package:is_plat("windows", "mingw") and not package:config("shared") then diff --git a/xmake/core/package/component.lua b/xmake/core/package/component.lua new file mode 100644 index 000000000..d9f9b78dd --- /dev/null +++ b/xmake/core/package/component.lua @@ -0,0 +1,92 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author ruki +-- @file component.lua +-- + +-- define module +local component = component or {} +local _instance = _instance or {} + +-- load modules +local os = require("base/os") +local io = require("base/io") +local path = require("base/path") +local utils = require("base/utils") +local table = require("base/table") +local option = require("base/option") +local hashset = require("base/hashset") +local scopeinfo = require("base/scopeinfo") +local interpreter = require("base/interpreter") +local memcache = require("cache/memcache") +local config = require("project/config") + +-- new an instance +function _instance.new(name, info, opt) + opt = opt or {} + local instance = table.inherit(_instance) + instance._NAME = name + instance._INFO = info + return instance +end + +-- get the component name +function _instance:name() + return self._NAME +end + +-- get the type: component +function _instance:type() + return "component" +end + +-- get the component configuration +function _instance:get(name) + return self._INFO:get(name) +end + +-- set the value to the component info +function _instance:set(name, ...) + self._INFO:apival_set(name, ...) +end + +-- add the value to the component info +function _instance:add(name, ...) + self._INFO:apival_add(name, ...) +end + +-- get the extra configuration +function _instance:extraconf(name, item, key) + local conf = self._INFO:extraconf(name, item, key) + if conf == nil and self:base() then + conf = self:base():extraconf(name, item, key) + end + return conf +end + +-- set the extra configuration +function _instance:extraconf_set(name, item, key, value) + return self._INFO:extraconf_set(name, item, key, value) +end + +-- new component +function component.new(name, info, opt) + return _instance.new(name, info, opt) +end + +-- return module +return component diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 5d521f7a4..e8df7b553 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -9,7 +9,7 @@ -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific package governing permissions and +-- See the License for the specific language governing permissions and -- limitations under the License. -- -- Copyright (C) 2015-present, TBOOX Open Source Group. -- cgit v1.3.1 From 88f80d548d179e020a70f462f0aeba5111714937 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 23:12:17 +0800 Subject: improve tests --- tests/projects/package/components/xmake.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 1b0d39c2d..6fbb68630 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -5,12 +5,12 @@ add_requires("sfml") target("graphics") set_kind("static") add_files("src/graphics.cpp") - add_packages("sfml", {public = true}) + add_packages("sfml", {components = "graphics", public = true}) target("network") set_kind("static") add_files("src/network.cpp") - add_packages("sfml", {public = true}) + add_packages("sfml", {components = "network", public = true}) target("test") set_kind("binary") -- cgit v1.3.1 From 6d8ba20054dca9198f8ac71d5792bf76bcf86c4c Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 00:54:25 +0800 Subject: improve tests --- tests/projects/package/components/xmake.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 6fbb68630..fc6ef7827 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -125,7 +125,7 @@ package("sfml") package:add("deps", "libogg", "libflac", "libvorbis", "openal-soft") end end - for _, component in ipairs("graphics", "window", "audio", "network") do + for _, component in ipairs({"graphics", "window", "audio", "network"}) do if package:config(component) then package:add("components", component) end -- cgit v1.3.1 From 3ea5c8babb63ad6cd3442c31762a7815df2e1a1b Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 00:58:31 +0800 Subject: improve tests --- tests/projects/package/components/xmake.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index fc6ef7827..888ee11c8 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -5,12 +5,12 @@ add_requires("sfml") target("graphics") set_kind("static") add_files("src/graphics.cpp") - add_packages("sfml", {components = "graphics", public = true}) + add_packages("sfml", {components = {"graphics", "system"}, public = true}) target("network") set_kind("static") add_files("src/network.cpp") - add_packages("sfml", {components = "network", public = true}) + add_packages("sfml", {components = {"network", "system"}, public = true}) target("test") set_kind("binary") -- cgit v1.3.1 From 4b1fea104fcf5e7aa0d180e06e2a548468534e7f Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 22:30:32 +0800 Subject: improve to register packages --- tests/projects/package/components/xmake.lua | 2 +- .../private/action/require/impl/register_packages.lua | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 888ee11c8..a8d955fb8 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -5,7 +5,7 @@ add_requires("sfml") target("graphics") set_kind("static") add_files("src/graphics.cpp") - add_packages("sfml", {components = {"graphics", "system"}, public = true}) + add_packages("sfml", {components = {"graphics", "window", "system"}, public = true}) target("network") set_kind("static") diff --git a/xmake/modules/private/action/require/impl/register_packages.lua b/xmake/modules/private/action/require/impl/register_packages.lua index 1bedc2969..59d9093e5 100644 --- a/xmake/modules/private/action/require/impl/register_packages.lua +++ b/xmake/modules/private/action/require/impl/register_packages.lua @@ -34,7 +34,7 @@ end -- libs: includedirs, links, linkdirs ... function _register_required_package_libs(instance, required_package, is_deps) if instance:is_library() then - local fetchinfo = instance:fetch() + local fetchinfo = table.clone(instance:fetch()) if fetchinfo then fetchinfo.name = nil if is_deps then @@ -50,7 +50,24 @@ function _register_required_package_libs(instance, required_package, is_deps) fetchinfo.static = nil fetchinfo.shared = nil end + + -- merge into the root values + local components = fetchinfo.components + fetchinfo.components = nil required_package:add(fetchinfo) + + -- merge into the components values + local required_components = required_package:get("components") + if required_components then + local components_base = required_components.__base or {} + for k, v in pairs(fetchinfo) do + local values = table.wrap(components_base[k]) + components_base[k] = table.unwrap(table.unique(table.join(values, v))) + end + required_components.__base = components_base + else + required_package:set("components", components) + end end end end -- cgit v1.3.1 From f55de1eb50c29fc58bbaef1bc387035a8deabe6e Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 22:36:19 +0800 Subject: support default components --- tests/projects/package/components/xmake.lua | 8 ++++---- xmake/core/project/package.lua | 15 ++++++++++++++ xmake/core/project/target.lua | 23 ++++++++++++++-------- .../action/require/impl/register_packages.lua | 14 +++++++++++++ 4 files changed, 48 insertions(+), 12 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index a8d955fb8..a6b7dffff 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -5,12 +5,12 @@ add_requires("sfml") target("graphics") set_kind("static") add_files("src/graphics.cpp") - add_packages("sfml", {components = {"graphics", "window", "system"}, public = true}) + add_packages("sfml", {components = {"graphics", "window"}, public = true}) target("network") set_kind("static") add_files("src/network.cpp") - add_packages("sfml", {components = {"network", "system"}, public = true}) + add_packages("sfml", {components = {"network"}, public = true}) target("test") set_kind("binary") @@ -131,9 +131,9 @@ package("sfml") end end if package:is_plat("windows", "mingw") and package:config("main") then - package:add("components", "main") + package:add("components", "main", {default = true}) end - package:add("components", "system") + package:add("components", "system", {default = true}) end) on_install("windows", "linux", function (package) diff --git a/xmake/core/project/package.lua b/xmake/core/project/package.lua index 4917e7c20..d1464fa4d 100644 --- a/xmake/core/project/package.lua +++ b/xmake/core/project/package.lua @@ -115,6 +115,21 @@ function _instance:libraryfiles() return self:get("libfiles") end +-- get components +function _instance:components() + return self:get("components") +end + +-- get components list with link order +function _instance:components_list() + return self:get("__components_list") +end + +-- get default components +function _instance:components_default() + return self:get("__components_default") +end + -- get the extra info from the given name function _instance:extra(name) local extrainfo = self:extrainfo() diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 4e6c21a56..418ff31cc 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -418,16 +418,23 @@ function _instance:get_from_pkgs(name, opt) -- get values from package components -- e.g. `add_packages("sfml", {components = {"graphics", "window"}})` if configinfo and configinfo.components then + local components_enabled = hashset.from(table.wrap(configinfo.components)) + for _, comp in ipairs(table.wrap(pkg:components_default())) do + components_enabled:insert(comp) + end + components_enabled:insert("__base") -- if we can't find the values from the component, we need to fall back to __base to find them. -- it contains some common values of all components - local components = table.wrap(pkg:get("components")) - for _, component_name in ipairs(table.join(configinfo.components, "__base")) do - local info = components[component_name] - if info then - table.join2(values, info[name]) - else - local components_str = table.concat(table.wrap(configinfo.components), ", ") - utils.warning("unknown component(%s) in add_packages(%s, {components = {%s}})", component_name, pkg:name(), components_str) + local components = table.wrap(pkg:components()) + for _, component_name in ipairs(table.join(pkg:components_list(), "__base")) do + if components_enabled:has(component_name) then + local info = components[component_name] + if info then + table.join2(values, info[name]) + else + local components_str = table.concat(table.wrap(configinfo.components), ", ") + utils.warning("unknown component(%s) in add_packages(%s, {components = {%s}})", component_name, pkg:name(), components_str) + end end end -- get values instead of the builtin configs if exists extra package config diff --git a/xmake/modules/private/action/require/impl/register_packages.lua b/xmake/modules/private/action/require/impl/register_packages.lua index 0ac1b833a..a6247cc9a 100644 --- a/xmake/modules/private/action/require/impl/register_packages.lua +++ b/xmake/modules/private/action/require/impl/register_packages.lua @@ -56,6 +56,20 @@ function _register_required_package_libs(instance, required_package, is_deps) fetchinfo.components = nil required_package:add(fetchinfo) + -- save components list + if components then + required_package:set("__components_list", instance:get("components")) + local components_default = {} + for _, comp in ipairs(instance:get("components")) do + if instance:extraconf("components", comp, "default") then + table.insert(components_default, comp) + end + end + if #components_default > 0 then + required_package:set("__components_default", components_default) + end + end + -- merge into the components values local required_components = required_package:get("components") if required_components then -- cgit v1.3.1 From b72444bdd60a6ce90cd899743b0b304dc3159f11 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 22:37:25 +0800 Subject: use private components --- tests/projects/package/components/xmake.lua | 4 ++-- xmake/core/project/package.lua | 6 +++--- xmake/core/project/target.lua | 2 +- .../modules/private/action/require/impl/register_packages.lua | 10 +++++----- xmake/modules/private/action/require/info.lua | 10 +++++++++- 5 files changed, 20 insertions(+), 12 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index a6b7dffff..3689985df 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -131,9 +131,9 @@ package("sfml") end end if package:is_plat("windows", "mingw") and package:config("main") then - package:add("components", "main", {default = true}) + package:add("components", "main", {private = true}) end - package:add("components", "system", {default = true}) + package:add("components", "system", {private = true}) end) on_install("windows", "linux", function (package) diff --git a/xmake/core/project/package.lua b/xmake/core/project/package.lua index d1464fa4d..af372455b 100644 --- a/xmake/core/project/package.lua +++ b/xmake/core/project/package.lua @@ -125,9 +125,9 @@ function _instance:components_list() return self:get("__components_list") end --- get default components -function _instance:components_default() - return self:get("__components_default") +-- get private components +function _instance:components_private() + return self:get("__components_private") end -- get the extra info from the given name diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 418ff31cc..28a63e9fa 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -419,7 +419,7 @@ function _instance:get_from_pkgs(name, opt) -- e.g. `add_packages("sfml", {components = {"graphics", "window"}})` if configinfo and configinfo.components then local components_enabled = hashset.from(table.wrap(configinfo.components)) - for _, comp in ipairs(table.wrap(pkg:components_default())) do + for _, comp in ipairs(table.wrap(pkg:components_private())) do components_enabled:insert(comp) end components_enabled:insert("__base") diff --git a/xmake/modules/private/action/require/impl/register_packages.lua b/xmake/modules/private/action/require/impl/register_packages.lua index a6247cc9a..2ff643d61 100644 --- a/xmake/modules/private/action/require/impl/register_packages.lua +++ b/xmake/modules/private/action/require/impl/register_packages.lua @@ -59,14 +59,14 @@ function _register_required_package_libs(instance, required_package, is_deps) -- save components list if components then required_package:set("__components_list", instance:get("components")) - local components_default = {} + local components_private = {} for _, comp in ipairs(instance:get("components")) do - if instance:extraconf("components", comp, "default") then - table.insert(components_default, comp) + if instance:extraconf("components", comp, "private") then + table.insert(components_private, comp) end end - if #components_default > 0 then - required_package:set("__components_default", components_default) + if #components_private > 0 then + required_package:set("__components_private", components_private) end end diff --git a/xmake/modules/private/action/require/info.lua b/xmake/modules/private/action/require/info.lua index 3bc8123e5..31a91c891 100644 --- a/xmake/modules/private/action/require/info.lua +++ b/xmake/modules/private/action/require/info.lua @@ -249,7 +249,15 @@ function main(requires_raw) -- show components local components = instance:get("components") if components then - cprint(" -> ${color.dump.string_quote}components${clear}: %s", table.concat(table.wrap(components), ", ")) + cprint(" -> ${color.dump.string_quote}components${clear}: ") + for _, comp in ipairs(components) do + cprintf(" -> ${cyan}%s${clear}: ", comp) + if instance:extraconf("components", comp, "private") then + print("(private)") + else + print("(public)") + end + end end -- show references -- cgit v1.3.1 From 595749f6deeb1b637c1d0a13cc3c89ce74724a39 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 23:43:54 +0800 Subject: support components deps --- tests/projects/package/components/xmake.lua | 18 +++++-- xmake/core/package/package.lua | 39 ++++++++++++++ xmake/core/project/package.lua | 60 ++++++++++++++++------ xmake/core/project/target.lua | 9 ++-- .../action/require/impl/register_packages.lua | 14 ++--- xmake/modules/private/action/require/info.lua | 7 +-- 6 files changed, 110 insertions(+), 37 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 3689985df..41850fd7c 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -5,12 +5,12 @@ add_requires("sfml") target("graphics") set_kind("static") add_files("src/graphics.cpp") - add_packages("sfml", {components = {"graphics", "window"}, public = true}) + add_packages("sfml", {components = "graphics", public = true}) target("network") set_kind("static") add_files("src/network.cpp") - add_packages("sfml", {components = {"network"}, public = true}) + add_packages("sfml", {components = "network", public = true}) target("test") set_kind("binary") @@ -125,15 +125,23 @@ package("sfml") package:add("deps", "libogg", "libflac", "libvorbis", "openal-soft") end end + package:add("components", "system") for _, component in ipairs({"graphics", "window", "audio", "network"}) do if package:config(component) then - package:add("components", component) + local deps = {} + table.insert(deps, "system") + if component == "graphics" then + table.insert(deps, "window") + end + if package:is_plat("windows", "mingw") and package:config("main") then + table.insert(deps, "main") + end + package:add("components", component, {deps = deps}) end end if package:is_plat("windows", "mingw") and package:config("main") then - package:add("components", "main", {private = true}) + package:add("components", "main") end - package:add("components", "system", {private = true}) end) on_install("windows", "linux", function (package) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 81b66b945..376906a8e 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1811,6 +1811,45 @@ function _instance:components() return components end +-- get package dependencies of components +function _instance:components_deps() + local components_deps = self._COMPONENTS_DEPS + if not components_deps then + components_deps = {} + for _, name in ipairs(table.wrap(self:get("components"))) do + components_deps[name] = self:extraconf("components", name, "deps") + end + self._COMPONENTS_DEPS = component_deps + end + return components_deps +end + +-- get package components list with dependencies order +function _instance:components_orderlist() + local components_orderlist = self._COMPONENTS_ORDERLIST + if not components_orderlist then + components_orderlist = {} + for _, name in ipairs(table.wrap(self:get("components"))) do + table.insert(components_orderlist, name) + table.join2(components_orderlist, self:_sort_componentdeps(name)) + end + components_orderlist = table.reverse_unique(components_orderlist) + self._COMPONENTS_ORDERLIST = components_orderlist + end + return components_orderlist +end + +-- sort component deps +function _instance:_sort_componentdeps(name) + local orderdeps = {} + local plaindeps = self:components_deps() and self:components_deps()[name] + for _, dep in ipairs(table.wrap(plaindeps)) do + table.insert(orderdeps, dep) + table.join2(orderdeps, self:_sort_componentdeps(dep)) + end + return orderdeps +end + -- generate lto configs function _instance:_generate_lto_configs(sourcekind) diff --git a/xmake/core/project/package.lua b/xmake/core/project/package.lua index af372455b..5db816e29 100644 --- a/xmake/core/project/package.lua +++ b/xmake/core/project/package.lua @@ -23,16 +23,17 @@ local package = {} local _instance = _instance or {} -- load modules -local io = require("base/io") -local os = require("base/os") -local path = require("base/path") -local table = require("base/table") -local utils = require("base/utils") -local semver = require("base/semver") -local rule = require("project/rule") -local config = require("project/config") -local sandbox = require("sandbox/sandbox") -local localcache = require("cache/localcache") +local io = require("base/io") +local os = require("base/os") +local path = require("base/path") +local table = require("base/table") +local utils = require("base/utils") +local semver = require("base/semver") +local rule = require("project/rule") +local config = require("project/config") +local sandbox = require("sandbox/sandbox") +local localcache = require("cache/localcache") +local instance_deps = require("base/private/instance_deps") -- save the requires info to the cache function _instance:save() @@ -50,6 +51,7 @@ function _instance:clear() end end end + self._COMPONENT_DEPS = nil end -- dump this package @@ -121,13 +123,30 @@ function _instance:components() end -- get components list with link order -function _instance:components_list() - return self:get("__components_list") +function _instance:components_orderlist() + return self:get("__components_orderlist") end --- get private components -function _instance:components_private() - return self:get("__components_private") +-- get the dependencies of components +function _instance:components_deps() + return self:get("__components_deps") +end + +-- get order dependencies of the given component +function _instance:component_orderdeps(name) + local component_orderdeps = self._COMPONENT_ORDERDEPS + if not component_orderdeps then + component_orderdeps = {} + self._COMPONENT_ORDERDEPS = component_orderdeps + end + + -- expand dependencies + local orderdeps = component_orderdeps[name] + if not orderdeps then + orderdeps = table.reverse_unique(self:_sort_componentdeps(name)) + component_orderdeps[name] = orderdeps + end + return orderdeps end -- get the extra info from the given name @@ -226,6 +245,17 @@ function _instance:rules() return rules end +-- sort component deps +function _instance:_sort_componentdeps(name) + local orderdeps = {} + local plaindeps = self:components_deps() and self:components_deps()[name] + for _, dep in ipairs(table.wrap(plaindeps)) do + table.insert(orderdeps, dep) + table.join2(orderdeps, self:_sort_componentdeps(dep)) + end + return orderdeps +end + -- get cache function package._cache() return localcache.cache("package") diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 28a63e9fa..7eb0a2d94 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -418,15 +418,18 @@ function _instance:get_from_pkgs(name, opt) -- get values from package components -- e.g. `add_packages("sfml", {components = {"graphics", "window"}})` if configinfo and configinfo.components then - local components_enabled = hashset.from(table.wrap(configinfo.components)) - for _, comp in ipairs(table.wrap(pkg:components_private())) do + local components_enabled = hashset.new() + for _, comp in ipairs(table.wrap(configinfo.components)) do components_enabled:insert(comp) + for _, dep in ipairs(table.wrap(pkg:component_orderdeps(comp))) do + components_enabled:insert(dep) + end end components_enabled:insert("__base") -- if we can't find the values from the component, we need to fall back to __base to find them. -- it contains some common values of all components local components = table.wrap(pkg:components()) - for _, component_name in ipairs(table.join(pkg:components_list(), "__base")) do + for _, component_name in ipairs(table.join(pkg:components_orderlist(), "__base")) do if components_enabled:has(component_name) then local info = components[component_name] if info then diff --git a/xmake/modules/private/action/require/impl/register_packages.lua b/xmake/modules/private/action/require/impl/register_packages.lua index 2ff643d61..4b92b75d8 100644 --- a/xmake/modules/private/action/require/impl/register_packages.lua +++ b/xmake/modules/private/action/require/impl/register_packages.lua @@ -56,18 +56,10 @@ function _register_required_package_libs(instance, required_package, is_deps) fetchinfo.components = nil required_package:add(fetchinfo) - -- save components list + -- save components list and dependencies if components then - required_package:set("__components_list", instance:get("components")) - local components_private = {} - for _, comp in ipairs(instance:get("components")) do - if instance:extraconf("components", comp, "private") then - table.insert(components_private, comp) - end - end - if #components_private > 0 then - required_package:set("__components_private", components_private) - end + required_package:set("__components_deps", instance:components_deps()) + required_package:set("__components_orderlist", instance:components_orderlist()) end -- merge into the components values diff --git a/xmake/modules/private/action/require/info.lua b/xmake/modules/private/action/require/info.lua index 31a91c891..270316ac9 100644 --- a/xmake/modules/private/action/require/info.lua +++ b/xmake/modules/private/action/require/info.lua @@ -252,10 +252,11 @@ function main(requires_raw) cprint(" -> ${color.dump.string_quote}components${clear}: ") for _, comp in ipairs(components) do cprintf(" -> ${cyan}%s${clear}: ", comp) - if instance:extraconf("components", comp, "private") then - print("(private)") + local plaindeps = instance:extraconf("components", comp, "deps") + if plaindeps then + print("%s", table.concat(table.wrap(plaindeps), ", ")) else - print("(public)") + print("") end end end -- cgit v1.3.1 From a89822b7530c98914109cecc770dfef15e707e23 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 20 Oct 2022 00:42:19 +0800 Subject: add extsources for components --- tests/projects/package/components/xmake.lua | 10 ++++++++++ xmake/core/package/package.lua | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 41850fd7c..eb18d7bb0 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -56,6 +56,10 @@ package("sfml") add_configs("main", {description = "Link to the sfml-main library", default = true, type = "boolean"}) end + if is_plat("macosx") then + add_extsources("brew::sfml") + end + on_component("graphics", function (package, component) local e = package:config("shared") and "" or "-s" component:add("links", "sfml-graphics" .. e) @@ -63,6 +67,7 @@ package("sfml") component:add("links", "freetype") component:add("syslinks", "opengl32", "gdi32", "user32", "advapi32") end + component:add("extsources", "brew::sfml/sfml-graphics") end) on_component("window", function (package, component) @@ -71,6 +76,7 @@ package("sfml") if package:is_plat("windows", "mingw") and not package:config("shared") then component:add("syslinks", "opengl32", "gdi32", "user32", "advapi32") end + component:add("extsources", "brew::sfml/sfml-window") end) on_component("audio", function (package, component) @@ -79,6 +85,7 @@ package("sfml") if package:is_plat("windows", "mingw") and not package:config("shared") then component:add("links", "openal32", "flac", "vorbisenc", "vorbisfile", "vorbis", "ogg") end + component:add("extsources", "brew::sfml/sfml-audio") end) on_component("network", function (package, component) @@ -87,6 +94,8 @@ package("sfml") if package:is_plat("windows", "mingw") and not package:config("shared") then component:add("syslinks", "ws2_32") end + component:add("extsources", "brew::sfml/sfml-network") + component:add("extsources", "apt::sfml-network") end) on_component("system", function (package, component) @@ -95,6 +104,7 @@ package("sfml") if package:is_plat("windows", "mingw") then component:add("syslinks", "winmm") end + component:add("extsources", "brew::sfml/sfml-system") end) on_component("main", function (package, component) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 945701a4f..0ccdf42b0 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1512,7 +1512,16 @@ function _instance:_fetch_library(opt) end table.insert(fetchnames, self:name()) for _, fetchname in ipairs(fetchnames) do - fetchinfo = self:find_package(fetchname, opt) + local components_extsources = {} + for name, comp in pairs(self:components()) do + for _, extsource in ipairs(table.wrap(comp:get("extsources"))) do + if fetchname:split("::")[1] == extsource:split("::")[1] then + components_extsources[name] = extsource + break + end + end + end + fetchinfo = self:find_package(fetchname, table.join(opt, {components_extsources = components_extsources})) if fetchinfo then break end @@ -1558,6 +1567,7 @@ function _instance:find_package(name, opt) arch = self:arch(), configs = table.join(self:configs(), opt.configs), components = self:components_orderlist(), + components_extsources = opt.components_extsources, buildhash = self:buildhash(), -- for xmake package or 3rd package manager, e.g. go:: .. cachekey = opt.cachekey or "fetch_package_system", external = opt.external, -- cgit v1.3.1 From 7f7cd68284676f7969d99e2e7d54b91275ef5569 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 20 Oct 2022 00:49:17 +0800 Subject: find components from brew --- tests/projects/package/components/xmake.lua | 2 +- xmake/core/package/package.lua | 5 +- .../modules/package/manager/brew/find_package.lua | 59 +++++++++++++++++----- 3 files changed, 50 insertions(+), 16 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index eb18d7bb0..fb3758df2 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -57,7 +57,7 @@ package("sfml") end if is_plat("macosx") then - add_extsources("brew::sfml") + add_extsources("brew::sfml/sfml-all") end on_component("graphics", function (package, component) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 0ccdf42b0..fb52da8fd 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1515,8 +1515,9 @@ function _instance:_fetch_library(opt) local components_extsources = {} for name, comp in pairs(self:components()) do for _, extsource in ipairs(table.wrap(comp:get("extsources"))) do - if fetchname:split("::")[1] == extsource:split("::")[1] then - components_extsources[name] = extsource + local extsource_info = extsource:split("::") + if fetchname:split("::")[1] == extsource_info[1] then + components_extsources[name] = extsource_info[2] break end end diff --git a/xmake/modules/package/manager/brew/find_package.lua b/xmake/modules/package/manager/brew/find_package.lua index 9706bfd8e..4c0061bb8 100644 --- a/xmake/modules/package/manager/brew/find_package.lua +++ b/xmake/modules/package/manager/brew/find_package.lua @@ -47,19 +47,10 @@ function _brew_pkg_rootdir() return brew_pkg_rootdir or nil end --- find package from the brew package manager --- --- @param name the package name, e.g. zlib, pcre/libpcre16 --- @param opt the options, e.g. {verbose = true, version = "1.12.x") --- -function main(name, opt) - - -- find the prefix directory of brew - local brew_pkg_rootdir = _brew_pkg_rootdir() - if not brew_pkg_rootdir then - return - end - brew_pkg_rootdir = path.join(brew_pkg_rootdir, opt.plat == "macosx" and "Cellar" or "opt") +-- find package from pkg-config +function _find_package_from_pkgconfig(name, opt) + opt = opt or {} + local brew_pkg_rootdir = opt.brew_pkg_rootdir -- parse name, e.g. pcre/libpcre16 local nameinfo = name:split('/') @@ -92,9 +83,51 @@ function main(name, opt) end end end + return result +end + +-- find package from the brew package manager +-- +-- @param name the package name, e.g. zlib, pcre/libpcre16 +-- @param opt the options, e.g. {verbose = true, version = "1.12.x") +-- +function main(name, opt) + + -- find the prefix directory of brew + opt = opt or {} + local brew_pkg_rootdir = _brew_pkg_rootdir() + if not brew_pkg_rootdir then + return + end + brew_pkg_rootdir = path.join(brew_pkg_rootdir, opt.plat == "macosx" and "Cellar" or "opt") + + -- find package from pkg-config + local result = _find_package_from_pkgconfig(name, + table.join(opt, {brew_pkg_rootdir = brew_pkg_rootdir})) + + -- find components + local components + local components_extsources = opt.components_extsources + for _, comp in ipairs(opt.components) do + local extsource = components_extsources and components_extsources[comp] + if extsource then + local component_result = _find_package_from_pkgconfig(extsource, + table.join(opt, {brew_pkg_rootdir = brew_pkg_rootdir})) + if component_result then + components = components or {} + components[comp] = component_result + end + end + end + if components then + result = result or {} + result.components = components + components.__base = {} + end -- find package from xxx/lib, xxx/include if not result then + local nameinfo = name:split('/') local pkgdir = find_path("lib", path.join(brew_pkg_rootdir, nameinfo[1], "*")) if pkgdir then local links = {} -- cgit v1.3.1 From 317f886c305b6b51f3ad0199b26b8f8a160e4a21 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 20 Oct 2022 22:35:40 +0800 Subject: improve component deps --- tests/projects/package/components/xmake.lua | 19 +++++++++---------- xmake/core/package/package.lua | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index fb3758df2..085d2360e 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -1,6 +1,6 @@ add_rules("mode.debug", "mode.release") -add_requires("sfml") +add_requires("sfml", {system = false}) target("graphics") set_kind("static") @@ -67,6 +67,7 @@ package("sfml") 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) @@ -76,6 +77,7 @@ package("sfml") 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") end) @@ -85,6 +87,7 @@ package("sfml") 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") end) @@ -94,6 +97,7 @@ package("sfml") 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") end) @@ -104,6 +108,9 @@ package("sfml") if package:is_plat("windows", "mingw") then component:add("syslinks", "winmm") end + if package:is_plat("windows", "mingw") and package:config("main") then + component:add("deps", "main") + end component:add("extsources", "brew::sfml/sfml-system") end) @@ -138,15 +145,7 @@ package("sfml") package:add("components", "system") for _, component in ipairs({"graphics", "window", "audio", "network"}) do if package:config(component) then - local deps = {} - table.insert(deps, "system") - if component == "graphics" then - table.insert(deps, "window") - end - if package:is_plat("windows", "mingw") and package:config("main") then - table.insert(deps, "main") - end - package:add("components", component, {deps = deps}) + package:add("components", component) end end if package:is_plat("windows", "mingw") and package:config("main") then diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index fb52da8fd..c52e14c7f 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1828,7 +1828,7 @@ function _instance:components_deps() if not components_deps then components_deps = {} for _, name in ipairs(table.wrap(self:get("components"))) do - components_deps[name] = self:extraconf("components", name, "deps") + components_deps[name] = self:extraconf("components", name, "deps") or self:component(name):get("deps") end self._COMPONENTS_DEPS = component_deps end -- cgit v1.3.1 From f873fb08773931668b2abe77f4f29b35f2ec0edb Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 20 Oct 2022 22:36:13 +0800 Subject: improve test --- tests/projects/package/components/xmake.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/projects/package/components/xmake.lua') diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua index 085d2360e..6cb7aebd8 100644 --- a/tests/projects/package/components/xmake.lua +++ b/tests/projects/package/components/xmake.lua @@ -1,6 +1,6 @@ add_rules("mode.debug", "mode.release") -add_requires("sfml", {system = false}) +add_requires("sfml") target("graphics") set_kind("static") -- cgit v1.3.1