summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-07-24 23:04:12 +0800
committerruki <[email protected]>2020-07-24 23:04:12 +0800
commit52979164630aebfea2bda906ed5b9e29b865fcb7 (patch)
treecea4e472f70b85ed918e0f94f3d04b515bdbd232
parent6b89d8b1edc849f8324dae490e635dca080ac473 (diff)
add go package manager
-rw-r--r--tests/projects/go/console_with_deps/xmake.lua4
-rw-r--r--xmake/core/package/package.lua20
-rw-r--r--xmake/core/project/project.lua2
-rw-r--r--xmake/languages/golang/xmake.lua1
-rw-r--r--xmake/modules/package/manager/go/find_package.lua49
-rw-r--r--xmake/modules/package/manager/go/install_package.lua81
6 files changed, 150 insertions, 7 deletions
diff --git a/tests/projects/go/console_with_deps/xmake.lua b/tests/projects/go/console_with_deps/xmake.lua
index 753a88a08..41c80304e 100644
--- a/tests/projects/go/console_with_deps/xmake.lua
+++ b/tests/projects/go/console_with_deps/xmake.lua
@@ -1,6 +1,10 @@
add_rules("mode.debug", "mode.release")
+add_requires("go::golang.org/x/sys/unix", {alias = "unix"})
+add_requires("go::github.com/sirupsen/logrus", {alias = "logrus"})
+
target("test")
set_kind("binary")
add_files("src/*.go")
+ add_packages("logrus", "unix")
diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua
index f31abcc6e..e7d3792f8 100644
--- a/xmake/core/package/package.lua
+++ b/xmake/core/package/package.lua
@@ -588,6 +588,12 @@ end
-- get the version string
function _instance:version_str()
+ if self:is3rd() then
+ local requireinfo = self:requireinfo()
+ if requireinfo then
+ return requireinfo.version
+ end
+ end
return self._VERSION_STR
end
@@ -803,9 +809,10 @@ function _instance:fetch(opt)
return fetchinfo
end
- -- fetch the require version
+ -- fetch the require version
local require_ver = opt.version or self:requireinfo().version
- if not require_ver:find('.', 1, true) then
+ if not self:is3rd() and not require_ver:find('.', 1, true) then
+ -- strip branch version only system package
require_ver = nil
end
@@ -869,6 +876,7 @@ function _instance:fetch(opt)
version = require_ver,
mode = self:mode(),
pkgconfigs = self:configs(),
+ buildhash = self:is3rd() and self:buildhash(), -- only for 3rd package manager, e.g. go:: ..
cachekey = "fetch_package_system",
system = true})
if fetchinfo then
@@ -1194,9 +1202,11 @@ function package.load_from_system(packagename)
-- on install script
local on_install = function (pkg)
local opt = table.copy(pkg:configs())
- opt.mode = pkg:debug() and "debug" or "release"
- opt.plat = pkg:plat()
- opt.arch = pkg:arch()
+ opt.mode = pkg:debug() and "debug" or "release"
+ opt.plat = pkg:plat()
+ opt.arch = pkg:arch()
+ opt.version = pkg:version_str()
+ opt.buildhash = pkg:buildhash()
import("package.manager.install_package")(pkg:name(), opt)
end
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 0fd4816e6..602b65934 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -605,8 +605,6 @@ function project._load_requires()
-- add require info
requires[alias or packagename] = instance
end
-
- -- ok?
return requires
end
diff --git a/xmake/languages/golang/xmake.lua b/xmake/languages/golang/xmake.lua
index e7c354d41..8d95d5cbc 100644
--- a/xmake/languages/golang/xmake.lua
+++ b/xmake/languages/golang/xmake.lua
@@ -61,6 +61,7 @@ language("golang")
, "target.defines"
, "target.undefines"
, "target.includedirs"
+ , "option.includedirs"
, "toolchain.includedirs"
, "toolchain.defines"
, "toolchain.undefines"
diff --git a/xmake/modules/package/manager/go/find_package.lua b/xmake/modules/package/manager/go/find_package.lua
new file mode 100644
index 000000000..f2eeb8ee4
--- /dev/null
+++ b/xmake/modules/package/manager/go/find_package.lua
@@ -0,0 +1,49 @@
+--!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-2020, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file find_package.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.project.config")
+import("core.package.package")
+
+-- get the package install directory
+function _go_get_installdir(name, opt)
+ local name = "go_" .. name:lower()
+ local dir = path.join(package.installdir(), name:sub(1, 1):lower(), name)
+ if opt.version then
+ dir = path.join(dir, opt.version)
+ end
+ return path.join(dir, opt.buildhash)
+end
+
+-- find package using the go package manager
+--
+-- @param name the package name
+-- @param opt the options, e.g. {verbose = true, version = "1.12.x")
+--
+function main(name, opt)
+ local result
+ local installdir = _go_get_installdir(name, opt)
+ for _, libraryfile in ipairs(os.files(path.join(installdir, "lib", "**.a"))) do
+ result = {version = opt.version, linkdirs = path.join(installdir, "lib"), includedirs = path.join(installdir, "lib")}
+ break
+ end
+ return result
+end
diff --git a/xmake/modules/package/manager/go/install_package.lua b/xmake/modules/package/manager/go/install_package.lua
new file mode 100644
index 000000000..e8b8a1d37
--- /dev/null
+++ b/xmake/modules/package/manager/go/install_package.lua
@@ -0,0 +1,81 @@
+--!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-2020, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file install_package.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.project.config")
+import("lib.detect.find_tool")
+import("core.package.package")
+import("private.tools.go.goenv")
+
+-- get the package cache directory
+function _go_get_cachedir(name, opt)
+ local name = "go_" .. name:lower()
+ return path.join(package.cachedir(), name:sub(1, 1), name, opt.version)
+end
+
+-- get the package install directory
+function _go_get_installdir(name, opt)
+ local name = "go_" .. name:lower()
+ local dir = path.join(package.installdir(), name:sub(1, 1):lower(), name)
+ if opt.version then
+ dir = path.join(dir, opt.version)
+ end
+ return path.join(dir, opt.buildhash)
+end
+
+-- install package
+--
+-- @param name the package name, e.g. go::github.com/sirupsen/logrus
+-- @param opt the options, e.g. { verbose = true, mode = "release", plat = , arch = , version = "x.x.x", buildhash = "xxxxxx"}
+--
+-- @return true or false
+--
+function main(name, opt)
+
+ -- TODO we do not yet support the installation of go packages in specific versions
+ local version = opt.version
+ assert(not version or version == "latest" or version == "master", "we can only support to install go packages without version!")
+
+ -- find go
+ local go = find_tool("go")
+ if not go then
+ raise("go not found!")
+ end
+
+ -- get plat and arch
+ local plat = opt.plat or config.plat() or os.host()
+ local arch = opt.arch or config.arch() or os.arch()
+ local goos = goenv.GOOS(plat)
+ local goarch = goenv.GOARCH(arch)
+
+ -- get go package to cachedir/pkg/${goos}_${goarch}/github.com/xxx/*.a
+ local cachedir = _go_get_cachedir(name, opt)
+ os.tryrm(cachedir)
+ os.mkdir(cachedir)
+ os.vrunv(go.program, {"get", "-u", name}, {envs = {GOPATH = cachedir, GOOS = goos, GOARCH = goarch}, curdir = cachedir})
+
+ -- install go package
+ local installdir = _go_get_installdir(name, opt)
+ local pkgdir = path.join(cachedir, "pkg", goos .. "_" .. goarch)
+ os.tryrm(installdir)
+ os.mkdir(path.join(installdir, "lib"))
+ os.vcp(path.join(pkgdir, "**.a"), path.join(installdir, "lib"), {rootdir = pkgdir})
+end