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/src/graphics.cpp | 8 + tests/projects/package/components/src/main.cpp | 14 ++ tests/projects/package/components/src/network.cpp | 14 ++ tests/projects/package/components/test.lua | 12 ++ tests/projects/package/components/xmake.lua | 201 +++++++++++++++++++++ 5 files changed, 249 insertions(+) create mode 100755 tests/projects/package/components/src/graphics.cpp create mode 100644 tests/projects/package/components/src/main.cpp create mode 100755 tests/projects/package/components/src/network.cpp create mode 100644 tests/projects/package/components/test.lua create mode 100644 tests/projects/package/components/xmake.lua diff --git a/tests/projects/package/components/src/graphics.cpp b/tests/projects/package/components/src/graphics.cpp new file mode 100755 index 000000000..bc081a517 --- /dev/null +++ b/tests/projects/package/components/src/graphics.cpp @@ -0,0 +1,8 @@ +#include + +extern "C" { +void graphics() { + sf::Text text; + text.setString("Hello world"); +} +} diff --git a/tests/projects/package/components/src/main.cpp b/tests/projects/package/components/src/main.cpp new file mode 100644 index 000000000..bf0ad1553 --- /dev/null +++ b/tests/projects/package/components/src/main.cpp @@ -0,0 +1,14 @@ +#include +#include + +extern "C" { +void network(); +void graphics(); +} + +int main(int argc, char** argv) { + network(); + graphics(); + return 0; +} + diff --git a/tests/projects/package/components/src/network.cpp b/tests/projects/package/components/src/network.cpp new file mode 100755 index 000000000..503fd5e31 --- /dev/null +++ b/tests/projects/package/components/src/network.cpp @@ -0,0 +1,14 @@ +#include + +extern "C" { +void network() { + 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); +} +} diff --git a/tests/projects/package/components/test.lua b/tests/projects/package/components/test.lua new file mode 100644 index 000000000..4964fecaa --- /dev/null +++ b/tests/projects/package/components/test.lua @@ -0,0 +1,12 @@ +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 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 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(-) 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 fcf701fe3d96f8c24d5bf708a8b0b229c6977bd5 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 22:52:20 +0800 Subject: add component api --- xmake/core/package/package.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 131784172..5d521f7a4 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -2074,6 +2074,7 @@ function package.apis() , "package.add_imports" , "package.add_configs" , "package.add_extsources" + , "package.add_components" } , script = { @@ -2083,6 +2084,7 @@ function package.apis() , "package.on_download" , "package.on_install" , "package.on_test" + , "package.on_component" } , keyvalues = { -- 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 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 a481c634dcc591198fb4d64a2f376a8da795e23c Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 22:55:54 +0800 Subject: get components --- xmake/core/package/component.lua | 16 +++++++++++----- xmake/core/package/package.lua | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/xmake/core/package/component.lua b/xmake/core/package/component.lua index d9f9b78dd..c37742662 100644 --- a/xmake/core/package/component.lua +++ b/xmake/core/package/component.lua @@ -36,11 +36,12 @@ local memcache = require("cache/memcache") local config = require("project/config") -- new an instance -function _instance.new(name, info, opt) +function _instance.new(name, opt) opt = opt or {} local instance = table.inherit(_instance) - instance._NAME = name - instance._INFO = info + instance._NAME = name + instance._INFO = nil -- TODO + instance._PACKAGE = opt.package return instance end @@ -54,6 +55,11 @@ function _instance:type() return "component" end +-- get the it's package +function _instance:package() + return self._PACKAGE +end + -- get the component configuration function _instance:get(name) return self._INFO:get(name) @@ -84,8 +90,8 @@ function _instance:extraconf_set(name, item, key, value) end -- new component -function component.new(name, info, opt) - return _instance.new(name, info, opt) +function component.new(name, opt) + return _instance.new(name, opt) end -- return module diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index e8df7b553..35b2d649c 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -41,6 +41,7 @@ local config = require("project/config") local policy = require("project/policy") local platform = require("platform/platform") local platform_menu = require("platform/menu") +local component = require("package/component") local language = require("language/language") local language_menu = require("language/menu") local sandbox = require("sandbox/sandbox") @@ -1754,6 +1755,24 @@ function _instance:resourcedir(name) end end +-- get the given package component +function _instance:component(name) + return self:components()[name] +end + +-- get package components +function _instance:components() + local components = self._COMPONENTS + if not components then + components = {} + for _, name in ipairs(table.wrap(self:get("components"))) do + components[name] = component.new(name, {package = self}) + end + self._COMPONENTS = components + end + return components +end + -- generate lto configs function _instance:_generate_lto_configs(sourcekind) -- cgit v1.3.1 From cd0b3f31b288a0676099218677b03456e266fd9f Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 23:00:15 +0800 Subject: load components --- xmake/core/package/component.lua | 28 +++++++++++++++++++++++++--- xmake/core/package/package.lua | 25 ++++++------------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/xmake/core/package/component.lua b/xmake/core/package/component.lua index c37742662..6ebaf4a41 100644 --- a/xmake/core/package/component.lua +++ b/xmake/core/package/component.lua @@ -32,15 +32,14 @@ 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") +local language = require("language/language") -- new an instance function _instance.new(name, opt) opt = opt or {} local instance = table.inherit(_instance) instance._NAME = name - instance._INFO = nil -- TODO + instance._INFO = scopeinfo.new("component", {}, {interpreter = component._interpreter()}) instance._PACKAGE = opt.package return instance end @@ -89,6 +88,29 @@ function _instance:extraconf_set(name, item, key, value) return self._INFO:extraconf_set(name, item, key, value) end +-- the interpreter +function component._interpreter() + local interp = component._INTERPRETER + if not interp then + interp = interpreter.new() + interp:api_define(component.apis()) + interp:api_define(language.apis()) + component._INTERPRETER = interp + end + return interp +end + +-- get component apis +function component.apis() + return { + values = { + -- component.add_xxx + "component.add_extsources" + } + } +end + + -- new component function component.new(name, opt) return _instance.new(name, opt) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 35b2d649c..7bc658d63 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1992,26 +1992,13 @@ end -- the interpreter function package._interpreter() - - -- the interpreter has been initialized? return it directly - if package._INTERPRETER then - return package._INTERPRETER + local interp = package._INTERPRETER + if not interp then + interp = interpreter.new() + interp:api_define(package.apis()) + interp:api_define(language.apis()) + package._INTERPRETER = interp end - - -- init interpreter - local interp = interpreter.new() - assert(interp) - - -- define apis - interp:api_define(package.apis()) - - -- define apis for language - interp:api_define(language.apis()) - - -- save interpreter - package._INTERPRETER = interp - - -- ok? return interp end -- cgit v1.3.1 From 2e160359e659e9760f9c2c2c9a5ea8537dcd56c8 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 17 Oct 2022 23:04:46 +0800 Subject: load components --- xmake/core/package/component.lua | 30 +++++++++++++++++++++- .../private/action/require/impl/package.lua | 5 ++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/xmake/core/package/component.lua b/xmake/core/package/component.lua index 6ebaf4a41..780fa06f5 100644 --- a/xmake/core/package/component.lua +++ b/xmake/core/package/component.lua @@ -33,6 +33,7 @@ local hashset = require("base/hashset") local scopeinfo = require("base/scopeinfo") local interpreter = require("base/interpreter") local language = require("language/language") +local sandbox = require("sandbox/sandbox") -- new an instance function _instance.new(name, opt) @@ -88,6 +89,34 @@ function _instance:extraconf_set(name, item, key, value) return self._INFO:extraconf_set(name, item, key, value) end +-- get on_component script +function _instance:_on_component() + local script = self:package():get("component") + local result = nil + if type(script) == "function" then + result = script + elseif type(script) == "table" then + result = script[self:name()] + result = result or script["__generic__"] + end + return result +end + +-- load this component +function _instance:_load() + local loaded = self._LOADED + if not loaded then + local script = self:_on_component() + if script then + local ok, errors = sandbox.load(script, self:package(), self) + if not ok then + os.raise("load component(%s) failed, %s", self:name(), errors or "unknown errors") + end + end + self._LOADED = true + end +end + -- the interpreter function component._interpreter() local interp = component._INTERPRETER @@ -110,7 +139,6 @@ function component.apis() } end - -- new component function component.new(name, opt) return _instance.new(name, opt) diff --git a/xmake/modules/private/action/require/impl/package.lua b/xmake/modules/private/action/require/impl/package.lua index 0608a3960..450096c1b 100644 --- a/xmake/modules/private/action/require/impl/package.lua +++ b/xmake/modules/private/action/require/impl/package.lua @@ -832,6 +832,11 @@ function _load_package(packagename, requireinfo, opt) on_load(package) end + -- load all components + for _, component in pairs(package:components()) do + component:_load() + end + -- load environments from the manifest to enable the environments of on_install() package:envs_load() -- 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(-) 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 24035843ac61249e110758f1e5ab9ea40b08cbfd Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 00:42:20 +0800 Subject: save componments to manifest --- xmake/core/package/package.lua | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 7bc658d63..e78034421 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -295,6 +295,19 @@ function _instance:artifacts_set(artifacts_info) package:set(k, v) end end + if manifest.components then + local vars = manifest.components.vars + if vars then + for component_name, component_vars in pairs(vars) do + local comp = package:component(component_name) + if comp then + for k, v in pairs(component_vars) do + comp:set(k, v) + end + end + end + end + end if manifest.envs then local envs = self:_rawenvs() for k, v in pairs(manifest.envs) do @@ -780,19 +793,34 @@ function _instance:manifest_save() end end - -- save variables - local vars = {} + -- save global variables and component variables + local vars + local components local apis = language.apis() for _, apiname in ipairs(table.join(apis.values, apis.paths)) do if apiname:startswith("package.add_") or apiname:startswith("package.set_") then local name = apiname:sub(13) local value = self:get(name) if value ~= nil then + vars = vars or {} vars[name] = value end + for _, component_name in ipairs(self:get("components")) do + local comp = self:component(component_name) + if comp then + local component_value = comp:get(name) + if component_value ~= nil then + components = components or {} + components.vars = components.vars or {} + components.vars[component_name] = components.vars[component_name] or {} + components.vars[component_name][name] = component_value + end + end + end end end manifest.vars = vars + manifest.components = components -- save repository local repo = self:repo() -- cgit v1.3.1 From 91cb3829a4153cacd1abc96e292cfe34c6c492e7 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 00:45:55 +0800 Subject: improve to find_package --- xmake/core/package/package.lua | 1 + .../modules/package/manager/xmake/find_package.lua | 74 +++++++++++++--------- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index e78034421..74e85debb 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1548,6 +1548,7 @@ function _instance:find_package(name, opt) plat = self:plat(), arch = self:arch(), configs = table.join(self:configs(), opt.configs), + components = self:get("components"), buildhash = self:buildhash(), -- for xmake package or 3rd package manager, e.g. go:: .. cachekey = opt.cachekey or "fetch_package_system", external = opt.external, diff --git a/xmake/modules/package/manager/xmake/find_package.lua b/xmake/modules/package/manager/xmake/find_package.lua index 8ba890591..e184a5685 100644 --- a/xmake/modules/package/manager/xmake/find_package.lua +++ b/xmake/modules/package/manager/xmake/find_package.lua @@ -28,37 +28,11 @@ import("core.language.language") import("lib.detect.find_file") import("lib.detect.find_library") --- find package from the repository (maybe only include and no links) -function _find_package_from_repo(name, opt) - - -- check options - if not opt.require_version or not opt.buildhash then - return - end - - -- find the manifest file of package, e.g. ~/.xmake/packages/z/zlib/1.1.12/ed41d5327fad3fc06fe376b4a94f62ef/manifest.txt - local packagedirs = {} - if opt.installdir then - table.insert(packagedirs, opt.installdir) - else - table.insert(packagedirs, path.join(package.installdir(), name:lower():sub(1, 1), name:lower(), opt.require_version, opt.buildhash)) - end - local manifest_file = find_file("manifest.txt", packagedirs) - if not manifest_file then - return - end - - -- load manifest info - local manifest = io.load(manifest_file) - if not manifest then - return - end - - -- get manifest variables - local vars = manifest.vars or {} - - -- get install directory of this package - local installdir = path.directory(manifest_file) +-- find result from vars +function _find_result_from_vars(name, vars, opt) + opt = opt or {} + vars = vars or {} + local installdir = opt.installdir -- save includedirs to result (maybe only include and no links) local result = {} @@ -154,6 +128,9 @@ function _find_package_from_repo(name, opt) if result.links then result.links = table.unique(result.links) end + if result.linkdirs then + result.linkdirs = table.unique(result.linkdirs) + end if result.libfiles then result.libfiles = table.unique(table.join(result.libfiles, libfiles)) end @@ -164,6 +141,40 @@ function _find_package_from_repo(name, opt) result[name] = values end end + return result +end + +-- find package from the repository (maybe only include and no links) +function _find_package_from_repo(name, opt) + + -- check options + if not opt.require_version or not opt.buildhash then + return + end + + -- find the manifest file of package, e.g. ~/.xmake/packages/z/zlib/1.1.12/ed41d5327fad3fc06fe376b4a94f62ef/manifest.txt + local packagedirs = {} + if opt.installdir then + table.insert(packagedirs, opt.installdir) + else + table.insert(packagedirs, path.join(package.installdir(), name:lower():sub(1, 1), name:lower(), opt.require_version, opt.buildhash)) + end + local manifest_file = find_file("manifest.txt", packagedirs) + if not manifest_file then + return + end + + -- load manifest info + local manifest = io.load(manifest_file) + if not manifest then + return + end + + -- get install directory of this package + local installdir = path.directory(manifest_file) + + -- find result from the global vars + local result = _find_result_from_vars(name, manifest.vars, {installdir = installdir}) -- update the project references file if result then @@ -179,6 +190,7 @@ function _find_package_from_repo(name, opt) -- get version and license result.version = manifest.version or path.filename(path.directory(path.directory(manifest_file))) result.license = manifest.license + print(result) return result end -- cgit v1.3.1 From 16e25c578ff2227f8f88e894ed3711944fe49f44 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 00:53:25 +0800 Subject: improve to find_package --- .../modules/package/manager/xmake/find_package.lua | 92 +++++++++++++--------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/xmake/modules/package/manager/xmake/find_package.lua b/xmake/modules/package/manager/xmake/find_package.lua index e184a5685..44668d503 100644 --- a/xmake/modules/package/manager/xmake/find_package.lua +++ b/xmake/modules/package/manager/xmake/find_package.lua @@ -28,11 +28,37 @@ import("core.language.language") import("lib.detect.find_file") import("lib.detect.find_library") --- find result from vars -function _find_result_from_vars(name, vars, opt) - opt = opt or {} - vars = vars or {} - local installdir = opt.installdir +-- find package from the repository (maybe only include and no links) +function _find_package_from_repo(name, opt) + + -- check options + if not opt.require_version or not opt.buildhash then + return + end + + -- find the manifest file of package, e.g. ~/.xmake/packages/z/zlib/1.1.12/ed41d5327fad3fc06fe376b4a94f62ef/manifest.txt + local packagedirs = {} + if opt.installdir then + table.insert(packagedirs, opt.installdir) + else + table.insert(packagedirs, path.join(package.installdir(), name:lower():sub(1, 1), name:lower(), opt.require_version, opt.buildhash)) + end + local manifest_file = find_file("manifest.txt", packagedirs) + if not manifest_file then + return + end + + -- load manifest info + local manifest = io.load(manifest_file) + if not manifest then + return + end + + -- get manifest variables + local vars = manifest.vars or {} + + -- get install directory of this package + local installdir = path.directory(manifest_file) -- save includedirs to result (maybe only include and no links) local result = {} @@ -50,8 +76,21 @@ function _find_result_from_vars(name, vars, opt) -- get links and link directories local links = {} local linkdirs = {} + local components = opt.components if vars.links then table.join2(links, vars.links) + elseif components and manifest.components then + -- get links from components + local vars = manifest.components.vars + if vars then + for _, component_name in ipairs(components) do + local component_vars = vars[component_name] + if component_vars and component_vars.links then + table.join2(links, component_vars.links) + end + end + end + links = table.reverse_unique(links) else -- we scan links automatically local found = false @@ -126,7 +165,7 @@ function _find_result_from_vars(name, vars, opt) end end if result.links then - result.links = table.unique(result.links) + result.links = table.reverse_unique(result.links) end if result.linkdirs then result.linkdirs = table.unique(result.linkdirs) @@ -141,41 +180,18 @@ function _find_result_from_vars(name, vars, opt) result[name] = values end end - return result -end - --- find package from the repository (maybe only include and no links) -function _find_package_from_repo(name, opt) - - -- check options - if not opt.require_version or not opt.buildhash then - return - end - - -- find the manifest file of package, e.g. ~/.xmake/packages/z/zlib/1.1.12/ed41d5327fad3fc06fe376b4a94f62ef/manifest.txt - local packagedirs = {} - if opt.installdir then - table.insert(packagedirs, opt.installdir) - else - table.insert(packagedirs, path.join(package.installdir(), name:lower():sub(1, 1), name:lower(), opt.require_version, opt.buildhash)) - end - local manifest_file = find_file("manifest.txt", packagedirs) - if not manifest_file then - return - end - -- load manifest info - local manifest = io.load(manifest_file) - if not manifest then - return + -- save components + if result and components and manifest.components then + local vars = manifest.components.vars + if vars then + for _, component_name in ipairs(components) do + result.components = result.components or {} + result.components[component_name] = vars[component_name] + end + end end - -- get install directory of this package - local installdir = path.directory(manifest_file) - - -- find result from the global vars - local result = _find_result_from_vars(name, manifest.vars, {installdir = installdir}) - -- update the project references file if result then local projectdir = os.projectdir() -- 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(-) 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 e732b8f24940f524f4d7a48ea92cdc91520d8622 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 00:57:23 +0800 Subject: get package info from components --- xmake/core/project/target.lua | 12 ++++++++++-- xmake/modules/package/manager/xmake/find_package.lua | 1 - 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index f20d0e3f7..c4e73b37d 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -417,8 +417,16 @@ function _instance:get_from_pkgs(name, opt) -- uses them instead of the builtin configs if exists extra package config -- e.g. `add_packages("xxx", {links = "xxx"})` local configinfo = self:pkgconfig(pkg:name()) - if configinfo and configinfo[name] then - table.join2(values, configinfo[name]) + if configinfo and configinfo.components then + local components = table.wrap(pkg:get("components")) + for _, component_name in ipairs(table.wrap(configinfo.components)) do + local info = components[component_name] + if info then + table.join2(values, info[name] or pkg:get(name)) + end + end + elseif configinfo and configinfo[name] then + table.join2(values, configinfo[name]) else -- uses the builtin package configs table.join2(values, pkg:get(name)) diff --git a/xmake/modules/package/manager/xmake/find_package.lua b/xmake/modules/package/manager/xmake/find_package.lua index 44668d503..a8072e91f 100644 --- a/xmake/modules/package/manager/xmake/find_package.lua +++ b/xmake/modules/package/manager/xmake/find_package.lua @@ -206,7 +206,6 @@ function _find_package_from_repo(name, opt) -- get version and license result.version = manifest.version or path.filename(path.directory(path.directory(manifest_file))) result.license = manifest.license - print(result) return result 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(-) 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 56e8eefde61b8a152218364163a9685eb8d6ee76 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 00:59:18 +0800 Subject: add warnings --- xmake/core/project/target.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index c4e73b37d..d879f656a 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -423,6 +423,9 @@ function _instance:get_from_pkgs(name, opt) local info = components[component_name] if info then table.join2(values, info[name] or pkg:get(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 elseif configinfo and configinfo[name] then -- cgit v1.3.1 From 123086c6e378ee5232158ef1d63d9669f29d3f5b Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 21:00:03 +0800 Subject: fix package --- xmake/core/package/package.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 74e85debb..1729eaa00 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -805,7 +805,7 @@ function _instance:manifest_save() vars = vars or {} vars[name] = value end - for _, component_name in ipairs(self:get("components")) do + for _, component_name in ipairs(table.wrap(self:get("components"))) do local comp = self:component(component_name) if comp then local component_value = comp:get(name) -- cgit v1.3.1 From 5339aa483ec9afccfad3281f6ed8117d2a097795 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 22:30:16 +0800 Subject: improve to get values from packages --- xmake/core/project/target.lua | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index d879f656a..1d8dde40e 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -414,24 +414,32 @@ end function _instance:get_from_pkgs(name, opt) local values = {} for _, pkg in ipairs(self:orderpkgs(opt)) do - -- uses them instead of the builtin configs if exists extra package config - -- e.g. `add_packages("xxx", {links = "xxx"})` local configinfo = self:pkgconfig(pkg:name()) + -- get values from package components + -- e.g. `add_packages("sfml", {components = {"graphics", "window"}})` if configinfo and configinfo.components then local components = table.wrap(pkg:get("components")) + local components_values = {} for _, component_name in ipairs(table.wrap(configinfo.components)) do local info = components[component_name] if info then - table.join2(values, info[name] or pkg:get(name)) + table.join2(components_values, info[name])-- or pkg:get(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 + if #components_values > 0 then + table.join2(values, components_values) + else + table.join2(values, pkg:get(name)) + end + -- get values instead of the builtin configs if exists extra package config + -- e.g. `add_packages("xxx", {links = "xxx"})` elseif configinfo and configinfo[name] then table.join2(values, configinfo[name]) else - -- uses the builtin package configs + -- get values from the builtin package configs table.join2(values, pkg:get(name)) end end -- cgit v1.3.1 From f45ee76bd832d0dac78e904d75624e817a293c74 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 22:30:24 +0800 Subject: add test --- tests/projects/package/components/test.lua | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/projects/package/components/test.lua diff --git a/tests/projects/package/components/test.lua b/tests/projects/package/components/test.lua new file mode 100644 index 000000000..4964fecaa --- /dev/null +++ b/tests/projects/package/components/test.lua @@ -0,0 +1,12 @@ +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 -- cgit v1.3.1 From 6016c0ce4627b96a3d7b40e82f1c176247694229 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 22:30:28 +0800 Subject: remove unused commet --- xmake/core/project/target.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 1d8dde40e..9febab8a5 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -423,7 +423,7 @@ function _instance:get_from_pkgs(name, opt) for _, component_name in ipairs(table.wrap(configinfo.components)) do local info = components[component_name] if info then - table.join2(components_values, info[name])-- or pkg:get(name)) + table.join2(components_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) -- cgit v1.3.1 From 4e6db386bfd6bdb61f7487207f45308153da6653 Mon Sep 17 00:00:00 2001 From: ruki Date: Tue, 18 Oct 2022 22:33:33 +0800 Subject: fix ci --- .github/workflows/archlinux.yml | 1 + .github/workflows/fedora.yml | 1 + .github/workflows/linux.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/archlinux.yml b/.github/workflows/archlinux.yml index ae183eb5f..69ad61a81 100644 --- a/.github/workflows/archlinux.yml +++ b/.github/workflows/archlinux.yml @@ -19,6 +19,7 @@ jobs: - name: Prepare build tools run: | pacman -Sy --noconfirm --needed glibc git base-devel perl make unzip + pacman -Sy --noconfirm --needed mesa gcc-fortran glu git config --global --add safe.directory /__w/xmake/xmake - uses: actions/checkout@v2 diff --git a/.github/workflows/fedora.yml b/.github/workflows/fedora.yml index 9a6a0d50d..eb2617523 100644 --- a/.github/workflows/fedora.yml +++ b/.github/workflows/fedora.yml @@ -20,6 +20,7 @@ jobs: run: | uname -a dnf -y install @development-tools @rpm-development-tools + dnf -y install mesa-libGL-devel mesa-libGLU-devel dnf -y install copr-cli make gcc-c++ dnf -y install perl dnf -y upgrade git diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 12d053b0f..0f56cd79f 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -31,6 +31,7 @@ jobs: run: | sudo apt update sudo apt install -y ruby ruby-dev rubygems build-essential llvm + sudo apt install -y libgl1-mesa-dev libglu1-mesa-dev - name: Tests run: | -- cgit v1.3.1 From 0cc19007cf7c5de02f50153a4d0d77775e6ccfcb Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 00:49:35 +0800 Subject: improve find_package --- .../modules/package/manager/xmake/find_package.lua | 52 +++++++++++++--------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/xmake/modules/package/manager/xmake/find_package.lua b/xmake/modules/package/manager/xmake/find_package.lua index a8072e91f..e913763b2 100644 --- a/xmake/modules/package/manager/xmake/find_package.lua +++ b/xmake/modules/package/manager/xmake/find_package.lua @@ -164,14 +164,8 @@ function _find_package_from_repo(name, opt) result.libfiles = table.join(result.libfiles or {}, path.join(libinfo.linkdir, libinfo.filename)) end end - if result.links then - result.links = table.reverse_unique(result.links) - end - if result.linkdirs then - result.linkdirs = table.unique(result.linkdirs) - end if result.libfiles then - result.libfiles = table.unique(table.join(result.libfiles, libfiles)) + result.libfiles = table.join(result.libfiles, libfiles) end -- inherit the other prefix variables @@ -182,27 +176,47 @@ function _find_package_from_repo(name, opt) end -- save components - if result and components and manifest.components then + if components and manifest.components then local vars = manifest.components.vars if vars then for _, component_name in ipairs(components) do - result.components = result.components or {} - result.components[component_name] = vars[component_name] + local comp = vars[component_name] + if comp then + result.components = result.components or {} + result.components[component_name] = comp + + -- merge component values to root + for k, v in pairs(comp) do + if k ~= "links" then + result[k] = table.join(result[k] or {}, v) + end + end + end end end end - -- update the project references file - if result then - local projectdir = os.projectdir() - if projectdir and os.isdir(projectdir) then - local references_file = path.join(installdir, "references.txt") - local references = os.isfile(references_file) and io.load(references_file) or {} - references[projectdir] = os.date("%y%m%d") - io.save(references_file, references) + -- remove repeat values + for _, k in ipairs(table.keys(result)) do + local v = result[k] + if type(v) == "table" then + if k == "links" or k == "syslinks" or k == "frameworks" then + result[k] = table.reverse_unique(v) + else + result[k] = table.unique(v) + end end end + -- update the project references file + local projectdir = os.projectdir() + if projectdir and os.isdir(projectdir) then + local references_file = path.join(installdir, "references.txt") + local references = os.isfile(references_file) and io.load(references_file) or {} + references[projectdir] = os.date("%y%m%d") + io.save(references_file, references) + end + -- get version and license result.version = manifest.version or path.filename(path.directory(path.directory(manifest_file))) result.license = manifest.license @@ -296,8 +310,6 @@ function _find_package_from_packagedirs(name, opt) result[infoname] = packageinfo:get(infoname) end end - - -- ok? return result end -- cgit v1.3.1 From 4f870472e9defeaa236ef778a0b70baade344787 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 00:52:36 +0800 Subject: add __base --- .../modules/package/manager/xmake/find_package.lua | 35 ++++++++++++++-------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/xmake/modules/package/manager/xmake/find_package.lua b/xmake/modules/package/manager/xmake/find_package.lua index e913763b2..f55601596 100644 --- a/xmake/modules/package/manager/xmake/find_package.lua +++ b/xmake/modules/package/manager/xmake/find_package.lua @@ -28,6 +28,20 @@ import("core.language.language") import("lib.detect.find_file") import("lib.detect.find_library") +-- deduplicate values +function _deduplicate_values(values) + for _, k in ipairs(table.keys(values)) do + local v = values[k] + if type(v) == "table" then + if k == "links" or k == "syslinks" or k == "frameworks" then + values[k] = table.reverse_unique(v) + else + values[k] = table.unique(v) + end + end + end +end + -- find package from the repository (maybe only include and no links) function _find_package_from_repo(name, opt) @@ -169,20 +183,24 @@ function _find_package_from_repo(name, opt) end -- inherit the other prefix variables + local components_base = {includedirs = result.includedirs, linkdirs = result.linkdirs} for name, values in pairs(vars) do if name ~= "links" and name ~= "linkdirs" and name ~= "includedirs" then result[name] = values + components_base[name] = values end end - -- save components + -- get component values if components and manifest.components then local vars = manifest.components.vars if vars then + _deduplicate_values(components_base) + result.components = result.components or {} + result.components.__base = components_base for _, component_name in ipairs(components) do local comp = vars[component_name] if comp then - result.components = result.components or {} result.components[component_name] = comp -- merge component values to root @@ -196,17 +214,8 @@ function _find_package_from_repo(name, opt) end end - -- remove repeat values - for _, k in ipairs(table.keys(result)) do - local v = result[k] - if type(v) == "table" then - if k == "links" or k == "syslinks" or k == "frameworks" then - result[k] = table.reverse_unique(v) - else - result[k] = table.unique(v) - end - end - end + -- deduplicate result + _deduplicate_values(result) -- update the project references file local projectdir = os.projectdir() -- cgit v1.3.1 From 3d09499afb17f63704f7b301fc25df116f569ac3 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 00:53:28 +0800 Subject: get values from __base --- xmake/core/project/target.lua | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 9febab8a5..0b9aa41d6 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -419,21 +419,15 @@ function _instance:get_from_pkgs(name, opt) -- e.g. `add_packages("sfml", {components = {"graphics", "window"}})` if configinfo and configinfo.components then local components = table.wrap(pkg:get("components")) - local components_values = {} - for _, component_name in ipairs(table.wrap(configinfo.components)) do + for _, component_name in ipairs(table.join(configinfo.components, "__base")) do local info = components[component_name] if info then - table.join2(components_values, info[name]) + 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 - if #components_values > 0 then - table.join2(values, components_values) - else - table.join2(values, pkg:get(name)) - end -- get values instead of the builtin configs if exists extra package config -- e.g. `add_packages("xxx", {links = "xxx"})` elseif configinfo and configinfo[name] then -- cgit v1.3.1 From 78fe5e017f14b4459a36b27548d98af9485e9fff Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 00:53:53 +0800 Subject: improve comments --- xmake/core/project/target.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 0b9aa41d6..4e6c21a56 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -418,6 +418,8 @@ 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 + -- 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] -- cgit v1.3.1 From 9b1e01c0b6deb3eaae25038643e11ea482ea248a Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 00:58:10 +0800 Subject: use sysincludedirs --- xmake/core/base/table.lua | 2 +- xmake/core/package/package.lua | 9 +++++++++ xmake/modules/lib/detect/find_package.lua | 5 +++++ xmake/modules/package/manager/xmake/find_package.lua | 4 ++-- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/xmake/core/base/table.lua b/xmake/core/base/table.lua index 5e04b0256..a360f7b42 100644 --- a/xmake/core/base/table.lua +++ b/xmake/core/base/table.lua @@ -155,7 +155,7 @@ end -- clone table function table.clone(self) - local result + local result = self if type(self) == "table" then result = {} for k, v in pairs(self) do diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 1729eaa00..81b66b945 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1482,12 +1482,21 @@ function _instance:_fetch_library(opt) end end if fetchinfo then + local components_base = fetchinfo.components and fetchinfo.components.__base if opt.external then fetchinfo.sysincludedirs = fetchinfo.sysincludedirs or fetchinfo.includedirs fetchinfo.includedirs = nil + if components_base then + components_base.sysincludedirs = components_base.sysincludedirs or components_base.includedirs + components_base.includedirs = nil + end else fetchinfo.includedirs = fetchinfo.includedirs or fetchinfo.sysincludedirs fetchinfo.sysincludedirs = nil + if components_base then + components_base.includedirs = components_base.includedirs or components_base.sysincludedirs + components_base.sysincludedirs = nil + end end end if fetchinfo and option.get("verbose") then diff --git a/xmake/modules/lib/detect/find_package.lua b/xmake/modules/lib/detect/find_package.lua index d3c9e57d1..dc1c92848 100644 --- a/xmake/modules/lib/detect/find_package.lua +++ b/xmake/modules/lib/detect/find_package.lua @@ -112,6 +112,11 @@ function main(name, opt) if result and result.includedirs and opt.external then result.sysincludedirs = result.includedirs result.includedirs = nil + local components_base = result.components and result.components.__base + if components_base then + components_base.sysincludedirs = components_base.includedirs + components_base.includedirs = nil + end end -- cache result diff --git a/xmake/modules/package/manager/xmake/find_package.lua b/xmake/modules/package/manager/xmake/find_package.lua index f55601596..10c58436a 100644 --- a/xmake/modules/package/manager/xmake/find_package.lua +++ b/xmake/modules/package/manager/xmake/find_package.lua @@ -183,11 +183,11 @@ function _find_package_from_repo(name, opt) end -- inherit the other prefix variables - local components_base = {includedirs = result.includedirs, linkdirs = result.linkdirs} + local components_base = {includedirs = table.clone(result.includedirs), linkdirs = table.clone(result.linkdirs)} for name, values in pairs(vars) do if name ~= "links" and name ~= "linkdirs" and name ~= "includedirs" then result[name] = values - components_base[name] = values + components_base[name] = table.clone(values) end end -- 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(-) 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 372a43da77fc966f28626e96ee9cbb5501da6951 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 22:31:02 +0800 Subject: remove libfiles when merging --- xmake/modules/private/action/require/impl/register_packages.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/xmake/modules/private/action/require/impl/register_packages.lua b/xmake/modules/private/action/require/impl/register_packages.lua index 59d9093e5..0ac1b833a 100644 --- a/xmake/modules/private/action/require/impl/register_packages.lua +++ b/xmake/modules/private/action/require/impl/register_packages.lua @@ -59,6 +59,7 @@ function _register_required_package_libs(instance, required_package, is_deps) -- merge into the components values local required_components = required_package:get("components") if required_components then + fetchinfo.libfiles = nil local components_base = required_components.__base or {} for k, v in pairs(fetchinfo) do local values = table.wrap(components_base[k]) -- cgit v1.3.1 From 0d3dc74e78b1d93de70c1a5e053afc9099e89029 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 22:31:53 +0800 Subject: show components --- xmake/modules/private/action/require/info.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xmake/modules/private/action/require/info.lua b/xmake/modules/private/action/require/info.lua index 7a6c096c6..3bc8123e5 100644 --- a/xmake/modules/private/action/require/info.lua +++ b/xmake/modules/private/action/require/info.lua @@ -246,6 +246,12 @@ function main(requires_raw) end end + -- show components + local components = instance:get("components") + if components then + cprint(" -> ${color.dump.string_quote}components${clear}: %s", table.concat(table.wrap(components), ", ")) + end + -- show references local references = instance:references() if references then -- 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(-) 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(-) 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 6f7d8c18261a39d72e40c6e2d89089b6eee8dd94 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 22:42:06 +0800 Subject: fix ci --- .github/workflows/linux_luajit.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/linux_luajit.yml b/.github/workflows/linux_luajit.yml index 3c84921b0..86192e983 100644 --- a/.github/workflows/linux_luajit.yml +++ b/.github/workflows/linux_luajit.yml @@ -32,6 +32,7 @@ jobs: - name: Prepare run: | sudo apt install -y build-essential llvm + sudo apt install -y libgl1-mesa-dev libglu1-mesa-dev - name: Tests run: | -- 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(-) 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 56302de4dff5414efec3cf3216d639ed7ab20b1f Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 19 Oct 2022 23:44:29 +0800 Subject: fix components order for find_package --- xmake/core/package/package.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 376906a8e..945701a4f 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1557,7 +1557,7 @@ function _instance:find_package(name, opt) plat = self:plat(), arch = self:arch(), configs = table.join(self:configs(), opt.configs), - components = self:get("components"), + components = self:components_orderlist(), 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 b17daa462dd75c5a218a788698f30955d13ebe5f Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 20 Oct 2022 00:36:02 +0800 Subject: improve to get value from packages --- xmake/core/project/target.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 7eb0a2d94..7cd18e984 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -417,7 +417,7 @@ function _instance:get_from_pkgs(name, opt) local configinfo = self:pkgconfig(pkg:name()) -- get values from package components -- e.g. `add_packages("sfml", {components = {"graphics", "window"}})` - if configinfo and configinfo.components then + if configinfo and configinfo.components and pkg:components() then local components_enabled = hashset.new() for _, comp in ipairs(table.wrap(configinfo.components)) do components_enabled:insert(comp) -- 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(-) 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(-) 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(-) 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(-) 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 From 2183a9d1ac3d63351a36b5a855c7fce02405d374 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 20 Oct 2022 22:36:41 +0800 Subject: add some comments --- xmake/core/package/package.lua | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index c52e14c7f..224a8fa37 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -1810,6 +1810,9 @@ function _instance:component(name) end -- get package components +-- +-- .e.g. add_components("graphics", "windows") +-- function _instance:components() local components = self._COMPONENTS if not components then @@ -1823,6 +1826,21 @@ function _instance:components() end -- get package dependencies of components +-- +-- @see https://github.com/xmake-io/xmake/issues/2636#issuecomment-1284787681 +-- +-- @code +-- add_components("graphics", {deps = "window"}) +-- @endcode +-- +-- or +-- +-- @code +-- on_component(function (package, component)) +-- component:add("deps", "window") +-- end) +-- @endcode +-- function _instance:components_deps() local components_deps = self._COMPONENTS_DEPS if not components_deps then -- cgit v1.3.1