summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-01-11 00:02:46 +0800
committerGitHub <[email protected]>2025-01-11 00:02:46 +0800
commitebc885cb9b011a8fcf18a78161b32e3dfecce3cd (patch)
tree3752b67f3f82a864760c45afa7b31f4394fce675
parente470863c24280ad3566d35b16ad184d3781510af (diff)
parentaca01466c20ab4ab339df31ba507c241606bab25 (diff)
Merge pull request #6055 from xmake-io/pkgconfig
check pkgconfig/cmake importfiles for package
-rw-r--r--xmake/core/package/package.lua24
-rw-r--r--xmake/modules/lib/detect/check_importfiles.lua75
2 files changed, 99 insertions, 0 deletions
diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua
index 741ca318c..ea33e24fa 100644
--- a/xmake/core/package/package.lua
+++ b/xmake/core/package/package.lua
@@ -2712,6 +2712,30 @@ function _instance:check_fcsnippets(snippets, opt)
return sandbox_module.import("lib.detect.check_fcsnippets", {anonymous = true})(snippets, opt)
end
+-- check the given importfiles?
+--
+-- @param names the import filenames (without .pc/.cmake extension), e.g. pkgconfig::libxml-2.0, cmake::CURL
+-- @param opt the argument options
+--
+-- @return true or false, errors
+--
+function _instance:check_importfiles(names, opt)
+ opt = opt or {}
+ if opt.PKG_CONFIG_PATH == nil then
+ local PKG_CONFIG_PATH = {}
+ local linkdirs = table.wrap(self:get("linkdirs") or "lib")
+ local installdir = self:installdir()
+ for _, linkdir in ipairs(linkdirs) do
+ table.insert(PKG_CONFIG_PATH, path.join(installdir, linkdir, "pkgconfig"))
+ end
+ opt.PKG_CONFIG_PATH = PKG_CONFIG_PATH
+ end
+ if opt.CMAKE_PREFIX_PATH == nil then
+ opt.CMAKE_PREFIX_PATH = self:installdir()
+ end
+ return sandbox_module.import("lib.detect.check_importfiles", {anonymous = true})(names or ("pkgconfig::" .. self:name()), opt)
+end
+
-- the current mode is belong to the given modes?
function package._api_is_mode(interp, ...)
return config.is_mode(...)
diff --git a/xmake/modules/lib/detect/check_importfiles.lua b/xmake/modules/lib/detect/check_importfiles.lua
new file mode 100644
index 000000000..f364c36f5
--- /dev/null
+++ b/xmake/modules/lib/detect/check_importfiles.lua
@@ -0,0 +1,75 @@
+--!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 check_importfiles.lua
+--
+
+-- imports
+import("core.base.option")
+import("lib.detect.pkgconfig")
+import("package.manager.cmake.find_package", {alias = "cmake_find_package"})
+
+-- check the given importfiles for pkgconfig/cmake
+--
+-- @param names the import filenames (without .pc/.cmake suffix), e.g. pkgconfig::libxml-2.0, cmake::CURL
+-- @param opt the argument options, e.g. { verbose = true, configdirs = {"lib"}}
+--
+function main(names, opt)
+ local verbose
+ if opt.verbose or option.get("verbose") or option.get("diagnosis") then
+ verbose = true
+ end
+ for _, name in ipairs(names) do
+ local kind
+ local parts = name:split("::")
+ if #parts == 2 then
+ kind = parts[1]
+ name = parts[2]
+ end
+ if kind == nil then
+ kind = "pkgconfig"
+ end
+ if verbose then
+ cprint("${dim}> checking for %s/%s", kind, name)
+ end
+ if kind == "pkgconfig" then
+ opt.configdirs = opt.PKG_CONFIG_PATH
+ local result = pkgconfig.libinfo(name, opt)
+ if verbose and result then
+ print(result)
+ end
+ if not result then
+ return false, string.format("pkgconfig/%s.pc not found!", name)
+ end
+ elseif kind == "cmake" then
+ if opt.CMAKE_PREFIX_PATH then
+ opt.configs = opt.configs or {}
+ opt.configs.envs = opt.configs.envs or {}
+ opt.configs.envs.CMAKE_PREFIX_PATH = path.joinenv(table.wrap(opt.CMAKE_PREFIX_PATH))
+ end
+ local result = cmake_find_package(name, opt)
+ if verbose and result then
+ print(result)
+ end
+ if not result then
+ return false, string.format("cmake/%s.cmake not found!", name)
+ end
+ end
+ end
+ return true
+end
+