diff options
| author | ruki <[email protected]> | 2018-08-21 22:54:22 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2018-08-21 11:26:12 +0800 |
| commit | 3519fbff209ebf0b99290a780c1cc425b5ab99d8 (patch) | |
| tree | 4ea89d0827f76af62465ac12384720fcb0c55654 | |
| parent | 0ba43c443b64019b87721f3af47675ab9d8226ec (diff) | |
support vcpkg for lib.detect.find_package
| -rw-r--r-- | CHANGELOG.md | 2 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/import/lib/detect/find_library.lua | 6 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/import/lib/detect/find_package.lua | 10 | ||||
| -rw-r--r-- | xmake/modules/lib/detect/pkg_config.lua | 6 | ||||
| -rw-r--r-- | xmake/modules/lib/detect/vcpkg.lua | 174 | ||||
| -rw-r--r-- | xmake/platforms/windows/xmake.lua | 3 |
6 files changed, 194 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b6ba5a2a..8642f42a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * [#178](https://github.com/tboox/xmake/issues/178): Modify the shared library name for mingw. * Support case-insensitive path pattern-matching for `add_files()` on windows * Improve to detect Qt sdk directory for `detect.sdks.find_qt` +* [#184](https://github.com/tboox/xmake/issues/184): Improve `lib.detect.find_package` to support vcpkg ### Bug fixed @@ -486,6 +487,7 @@ * [#178](https://github.com/tboox/xmake/issues/178): 修改mingw平台下的目标名 * 对于`add_files()`在windows上支持大小写不敏感路径模式匹配 * 改进`detect.sdks.find_qt`对于Qt根目录的探测 +* [#184](https://github.com/tboox/xmake/issues/184): 改进`lib.detect.find_package`支持vcpkg ### Bugs修复 diff --git a/xmake/core/sandbox/modules/import/lib/detect/find_library.lua b/xmake/core/sandbox/modules/import/lib/detect/find_library.lua index 9cd12556d..4e173fc54 100644 --- a/xmake/core/sandbox/modules/import/lib/detect/find_library.lua +++ b/xmake/core/sandbox/modules/import/lib/detect/find_library.lua @@ -38,10 +38,10 @@ local find_file = import("lib.detect.find_file") -- get link name from the file name function sandbox_lib_detect_find_library._link(filename) - -- get link - local link, count = filename:gsub(target.filename("([%w%-_]+)", "static"):gsub("%.", "%%.") .. "$", "%1") + -- get link, @note need %%w to escape to %w because gsub was called in target.filename + local link, count = filename:gsub(target.filename("([%%w%%-_]+)", "static"):gsub("%.", "%%.") .. "$", "%1") if count == 0 then - link, count = filename:gsub(target.filename("([%w%-_]+)", "shared"):gsub("%.", "%%.") .. "$", "%1") + link, count = filename:gsub(target.filename("([%%w%%-_]+)", "shared"):gsub("%.", "%%.") .. "$", "%1") end -- ok? diff --git a/xmake/core/sandbox/modules/import/lib/detect/find_package.lua b/xmake/core/sandbox/modules/import/lib/detect/find_package.lua index 03976addb..cfd683217 100644 --- a/xmake/core/sandbox/modules/import/lib/detect/find_package.lua +++ b/xmake/core/sandbox/modules/import/lib/detect/find_package.lua @@ -141,11 +141,16 @@ function sandbox_lib_detect_find_package._find_from_modules(name, opt) end end --- find package from pkg-config +-- find package from pkg-config/brew function sandbox_lib_detect_find_package._find_from_pkg_config(name, opt) return import("lib.detect.pkg_config").find(name, opt) end +-- find package from vcpkg +function sandbox_lib_detect_find_package._find_from_vcpkg(name, opt) + return import("lib.detect.vcpkg").find(name, opt) +end + -- find package from system directories function sandbox_lib_detect_find_package._find_from_systemdirs(name, opt) @@ -251,6 +256,9 @@ function sandbox_lib_detect_find_package._find(name, opt) -- find package from modules table.insert(findscripts, sandbox_lib_detect_find_package._find_from_modules) + -- find package from vcpkg (support multi-platforms/architectures) + table.insert(findscripts, sandbox_lib_detect_find_package._find_from_vcpkg) + -- find package from the current host platform if opt.plat == os.host() and opt.arch == os.arch() then table.insert(findscripts, sandbox_lib_detect_find_package._find_from_pkg_config) diff --git a/xmake/modules/lib/detect/pkg_config.lua b/xmake/modules/lib/detect/pkg_config.lua index 11782b250..fc991393d 100644 --- a/xmake/modules/lib/detect/pkg_config.lua +++ b/xmake/modules/lib/detect/pkg_config.lua @@ -54,8 +54,8 @@ function info(name, opt) -- get it from cache first local result = _g._INFO[name] - if result then - return result + if result ~= nil then + return result and result or nil end -- get pkg-config path from brew @@ -132,7 +132,7 @@ function info(name, opt) end -- save result to cache - _g._INFO[name] = result + _g._INFO[name] = result and result or false -- ok? return result diff --git a/xmake/modules/lib/detect/vcpkg.lua b/xmake/modules/lib/detect/vcpkg.lua new file mode 100644 index 000000000..156b9f7a9 --- /dev/null +++ b/xmake/modules/lib/detect/vcpkg.lua @@ -0,0 +1,174 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you 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 - 2018, TBOOX Open Source Group. +-- +-- @author ruki +-- @file vcpkg.lua +-- + +-- imports +import("lib.detect.find_file") +import("lib.detect.find_library") +import("detect.sdks.find_vcpkgdir") +import("core.project.config") + +-- get package info +-- +-- @param name the package name +-- @param opt the argument options, {version = true, arch = "", plat = "", mode = "", vcpkgdir = ""} +-- +-- @return {links = {"ssl", "crypto", "z"}, linkdirs = {""}, includedirs = {""}, version = ""} +-- +-- @code +-- +-- local pkginfo = vcpkg.info("openssl") +-- +-- @endcode +-- +function info(name, opt) + + -- init options + opt = opt or {} + + -- attempt to find the vcpkg root directory + local vcpkgdir = find_vcpkgdir(opt.vcpkgdir) + if not vcpkgdir then + return + end + + -- get arch, plat and mode + local arch = opt.arch or config.arch() or os.arch() + local plat = opt.plat or config.plat() or os.host() + local mode = opt.mode or config.mode() or "release" + + -- init cache + _g._INFO = _g._INFO or {} + + -- get it from cache first + local key = name .. "_" .. arch .. "_" .. plat .. "_" .. mode + local result = _g._INFO[key] + if result ~= nil then + return result and result or nil + end + + -- get the vcpkg installed directory + local installdir = path.join(vcpkgdir, "installed") + + -- get the vcpkg info directory + local infodir = path.join(installdir, "vcpkg", "info") + + -- find the package info file, .e.g zlib_1.2.11-3_x86-windows.list + local infofile = find_file(vformat("%s_*_%s-%s.list", name, arch, plat), infodir) + + -- save includedirs, linkdirs and links + local info = infofile and io.readfile(infofile) or nil + if info then + for _, line in ipairs(info:split('\n')) do + line = line:trim() + + -- get includedirs + if line:endswith("/include/") then + result = result or {} + result.includedirs = result.includedirs or {} + table.insert(result.includedirs, path.join(installdir, line)) + end + + -- get linkdirs and links + if (plat == "windows" and line:endswith(".lib")) or line:endswith(".a") then + if line:find(plat .. (mode == "debug" and "/debug" or "") .. "/lib/", 1, true) then + result = result or {} + result.links = result.links or {} + result.linkdirs = result.linkdirs or {} + table.insert(result.linkdirs, path.join(installdir, path.directory(line))) + table.insert(result.links, path.basename(line)) + end + end + end + end + + -- save version + if opt.version then + local infoname = path.basename(infofile) + result.version = infoname:match(name .. "_(%d+%.?%d*%.?%d*.-)_" .. arch) + if not result.version then + result.version = infoname:match(name .. "_(%d+%.?%d*%.-)_" .. arch) + end + end + + -- save result to cache + _g._INFO[key] = result and result or false + + -- ok? + return result +end + +-- find package +-- +-- @param name the package name +-- @param opt the argument options, {plat = "", arch = "", mode = "", version = "1.0.1", links = {...}, vcpkgdir = ""} +-- +-- @return {links = {"ssl", "crypto", "z"}, linkdirs = {""}, includedirs = {""}} +-- +-- @code +-- +-- local pkginfo = vcpkg.find("openssl") +-- +-- @endcode +-- +function find(name, opt) + + -- get package info + local pkginfo = info(name, opt) + if not pkginfo then + return + end + + -- match version? + opt = opt or {} + if opt.version and pkginfo.version ~= opt.version then + return + end + + -- get links + local links = pkginfo.links + if not links or #links == 0 then + links = opt.links + end + + -- find library + local result = nil + for _, link in ipairs(table.wrap(links)) do + local libinfo = find_library(link, pkginfo.linkdirs) + if libinfo then + result = result or {} + result.links = table.join(result.links or {}, libinfo.link) + result.linkdirs = table.join(result.linkdirs or {}, libinfo.linkdir) + end + end + + -- found? + if result and result.links then + result.linkdirs = table.unique(result.linkdirs) + result.includedirs = table.join(result.includedirs or {}, pkginfo.includedirs) + end + + -- ok? + return result +end + diff --git a/xmake/platforms/windows/xmake.lua b/xmake/platforms/windows/xmake.lua index 4dd509963..77d142b0a 100644 --- a/xmake/platforms/windows/xmake.lua +++ b/xmake/platforms/windows/xmake.lua @@ -101,6 +101,8 @@ platform("windows") " - win8", " - win7", " - win7_[sp1|sp2|sp3]" } + , {category = "Vcpkg Configuration" } + , {nil, "vcpkg", "kv", "auto", "The Vcpkg Directory" } } , global = @@ -110,6 +112,7 @@ platform("windows") , {nil, "cuda", "kv", "auto", "The Cuda SDK Directory" } , {nil, "qt", "kv", "auto", "The Qt SDK Directory" } , {nil, "wdk", "kv", "auto", "The WDK Directory" } + , {nil, "vcpkg", "kv", "auto", "The Vcpkg Directory" } } } |
