Skip to content
This repository has been archived by the owner on Apr 8, 2024. It is now read-only.

Commit

Permalink
Merge pull request #3 from csplink/dev
Browse files Browse the repository at this point in the history
add csp-repo command
  • Loading branch information
xqyjlj authored Jan 7, 2024
2 parents c66520d + 9758fd1 commit 0e8b22e
Show file tree
Hide file tree
Showing 9 changed files with 294 additions and 12 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/mirror.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ name: mirror

on:
push:
branches:
- master
- dev

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
Expand Down
9 changes: 1 addition & 8 deletions packages/c/csp_hal_apm32f1/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,13 @@ do
add_urls("https://gitee.com/csplink/csp_hal_apm32f1.git")
add_urls("https://e.coding.net/csplink/csplink/csp_hal_apm32f1.git")

add_configs("mcu", {
description = "mcu name",
default = "APM32F103ZET6",
values = {"APM32F103C8T6", "APM32F103CBT6", "APM32F103ZET6"}
})
add_configs("use_default_startup", {description = "use default startup asm file", default = true})
add_versions("v0.0.1", "ea1f9967d8b35a184dafe39783d574046a2e65407f825f56c6c42727f8d5660f")

on_install(function(package)
import("package.tools.xmake").install(package)
end)

on_test(function(package)
assert(os.isdir(path.join(package:installdir("include"), "csp_hal_apm32f1", "chal")))
assert(os.isfile(path.join(package:installdir("include"), "csp_hal_apm32f1", "csp_hal_apm32f1_config.h")))
assert(os.isfile(path.join(package:installdir("lib"), "libcsp_hal_apm32f1.a")))
end)
end
Expand Down
3 changes: 2 additions & 1 deletion tools/scripts/tasks/csp-config/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
-- ------------ ---------- -----------------------------------------------
-- 2023-12-17 xqyjlj initial version
--

function _project_menu_options()
import("core.project.menu")
return menu.options()
Expand All @@ -31,6 +30,7 @@ task("csp-config")
do
on_run("main")
set_category("plugin")
-- LuaFormatter off
set_menu {
usage = "xmake csp-config [options]",
description = "Configure the project.",
Expand All @@ -41,5 +41,6 @@ do
_project_menu_options,
}
}
-- LuaFormatter on
end
task_end()
3 changes: 2 additions & 1 deletion tools/scripts/tasks/csp-file2c/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
-- ------------ ---------- -----------------------------------------------
-- 2023-12-17 xqyjlj initial version
--

task("csp-file2c")
do
on_run("main")
set_category("plugin")
-- LuaFormatter off
set_menu {
usage = "xmake csp-file2c [options]",
description = "Convert file to array of C files",
Expand All @@ -38,5 +38,6 @@ do
{"u", "unit", "kv", 4, "Eemory unit size.",},
}
}
-- LuaFormatter on
end
task_end()
3 changes: 3 additions & 0 deletions tools/scripts/tasks/csp-project/cmake/cmakelists.lua
Original file line number Diff line number Diff line change
Expand Up @@ -319,15 +319,18 @@ function _generate_toolchains(cmakelists, target)
if string.find(toolchains, "armcc") or string.find(toolchains, "armclang") then
local fromelf, _ = target:tool("fromelf")
if fromelf then
fromelf = fromelf:gsub("\\", "/")
cmakelists:print("set(CMAKE_FROMELF \"%s\")", fromelf)
end
else
local objcopy, _ = target:tool("objcopy")
if objcopy then
objcopy = objcopy:gsub("\\", "/")
cmakelists:print("set(CMAKE_OBJCOPY \"%s\")", objcopy)
end
local size, _ = target:tool("size")
if size then
size = size:gsub("\\", "/")
cmakelists:print("set(CMAKE_SIZE \"%s\")", size)
end
end
Expand Down
8 changes: 7 additions & 1 deletion tools/scripts/tasks/csp-project/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,13 @@ import("cmake.cmakelists")
import("core.base.task")

function makers()
return {cmake = cmakelists.main, cmakelists = cmakelists.main}
-- LuaFormatter off
return
{
cmake = cmakelists.main,
cmakelists = cmakelists.main
}
-- LuaFormatter on
end

function _make(kind)
Expand Down
3 changes: 2 additions & 1 deletion tools/scripts/tasks/csp-project/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
-- ------------ ---------- -----------------------------------------------
-- 2023-12-17 xqyjlj initial version
--

task("csp-project")
do
on_run("main")
set_category("plugin")
-- LuaFormatter off
set_menu {
usage = "xmake csp-project [options]",
description = "Generate the project file.",
Expand All @@ -36,5 +36,6 @@ do
{nil, "outputdir", "v", ".", "Set the output directory."},
}
}
-- LuaFormatter on
end
task_end()
223 changes: 223 additions & 0 deletions tools/scripts/tasks/csp-repo/main.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
--
-- Licensed under the GNU General Public License v. 3 (the "License")
-- You may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- https://www.gnu.org/licenses/gpl-3.0.html
--
-- 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) 2023-2024 xqyjlj<xqyjlj@126.com>
--
-- @author xqyjlj
-- @file main.lua
--
-- Change Logs:
-- Date Author Notes
-- ------------ ---------- -----------------------------------------------
-- 2024-01-03 xqyjlj initial version
--
import("core.project.config")
import("core.base.option")
import("core.base.json")
import("core.project.project")
import("core.package.package")
import("private.action.require.impl.utils.filter")
import("devel.git")
import("net.fasturl")
import("net.http")
import("utils.archive")

local rootdir = path.absolute(path.join(os.scriptdir(), "..", "..", "..", ".."))

function get_download_url(packagename, version)
version = version or "latest"
local packagedir = path.join(rootdir, "packages", string.sub(packagename, 1, 1), packagename)
local packagefile = path.join(packagedir, "xmake.lua")

local instance = package.load_from_repository(packagename, packagedir, {packagefile = packagefile})
local on_load = instance:get("load")
if on_load then
on_load(instance)
end

local urls = instance:urls()
if instance:is_precompiled() then
instance:fallback_build()
local urls_raw = instance:urls()
if urls_raw then
urls = table.join(urls, urls_raw)
end
end

local rtn = {}
if version == "latest" then
for _, url in ipairs(urls) do
local u = git.asgiturl(url)
if u then
rtn[u] = ""
end
end
else
local versions = instance:get("versions")
local version_keys = table.orderkeys(versions)
assert(table.contains(version_keys, version), "invalid version \"%s\" in %s:{\"%s\"}", version, packagename,
table.concat(version_keys, "\", \""))

instance:version_set(version)
for _, url in ipairs(urls) do
if not git.asgiturl(url) then
rtn[filter.handle(url, instance)] = versions[version]
end
end
end

return rtn
end

function list_table(repositories_dir)
local list = {}
for _, packagedir in ipairs(os.dirs(path.join(repositories_dir, "*"))) do
local hal = path.relative(packagedir, repositories_dir)
if not list[hal] then
list[hal] = {}
end
for _, versiondir in ipairs(os.dirs(path.join(packagedir, "*"))) do
local version = path.relative(versiondir, packagedir)
if os.isdir(path.join(versiondir, ".git")) then
local sha = git.lastcommit({repodir = versiondir})
list[hal][version] = sha
else
list[hal][version] = ""
end
end
end
return list
end

function dump_table()
local packagelist = {toolchain = {}, library = {}}
for _, packagedir in ipairs(os.dirs(path.join(rootdir, "packages", "*", "*"))) do
local packagename = path.filename(packagedir)
local packagefile = path.join(packagedir, "xmake.lua")
local packageinstance = package.load_from_repository(packagename, packagedir, {packagefile = packagefile})
local on_load = packageinstance:get("load")
if on_load then
on_load(packageinstance)
end
local pkg = {}
local urls = packageinstance:get("urls") or os.raise("%s urls is empty", packagename)
local versions = packageinstance:get("versions") or {latest = "nil"}
local description = packageinstance:get("description") or "unknown"
local homepage = packageinstance:get("homepage") or "unknown"
local license = packageinstance:get("license") or "unknown"

if type(urls) == "table" then
pkg["urls"] = urls
else
pkg["urls"] = {urls}
end

pkg["versions"] = packageinstance:get("versions") or {latest = "nil"}
pkg["description"] = description
pkg["homepage"] = homepage
pkg["license"] = license

if packageinstance:get("kind") then
packagelist[packageinstance:get("kind")][packagename] = pkg
else
packagelist["library"][packagename] = pkg
end
end
return packagelist
end

function is_installed(packagename, version, repositories_dir)
return os.isdir(path.join(repositories_dir, packagename, version))
end

function install(packagename, version, repositories_dir)
local urls = get_download_url(packagename, version)
local outputdir = path.join(repositories_dir, packagename, version)
local download_urls = table.orderkeys(urls)
fasturl.add(download_urls)
download_urls = fasturl.sort(download_urls)
local url = download_urls[1]
if git.asgiturl(url) then
git.clone(url, {recursive = true, longpaths = true, outputdir = outputdir})
else
local file = path.join(repositories_dir, packagename, (path.filename(url):gsub("%?.+$", "")))
http.download(url, file)
local sourcehash = urls[url]
local sha256 = hash.sha256(file)
if sha256 == sourcehash then
local tmp = repositories_dir .. ".tmp"
archive.extract(file, tmp)
local filedirs = os.filedirs(path.join(tmp, "*"))
if #filedirs == 1 and os.isdir(filedirs[1]) then
os.mv(filedirs[1], outputdir)
os.rm(tmp)
else
os.mv(tmp, outputdir)
end
else
raise("unmatched checksum, current hash(%s) != original hash(%s)", sha256:sub(1, 8), sourcehash:sub(1, 8))
end
end
end

function uninstall(packagename, version, repositories_dir)
if is_installed(packagename, version, repositories_dir) then
os.rm(path.join(repositories_dir, packagename, version))
end
end

function main()
config.load()
project.load_targets()

if option.get("list") then
assert(option.get("repositories"), "must set repositories dir")
local value = option.get("list")
if value == "json" then
local list = list_table(option.get("repositories"))
print(json.encode(list))
elseif value == "table" then
local list = list_table(option.get("repositories"))
print(list)
else
assert(false, "invalid type \"%s\"", value)
end
elseif option.get("dump") then
local value = option.get("dump")
if value == "json" then
local list = dump_table()
print(json.encode(list))
elseif value == "table" then
local list = dump_table()
print(list)
else
assert(false, "invalid type \"%s\"", value)
end
elseif option.get("install") then
assert(option.get("repositories"), "must set repositories dir")
local value = option.get("install")
local list = value:split("@")
assert(#list == 2, "invalid input \"%s\", eq. xmake csp-repo --install=csp_hal_apm32f1@latest -r {dir}", value)
local packagename = list[1]
local version = list[2]
install(packagename, version, option.get("repositories"))
elseif option.get("uninstall") then
assert(option.get("repositories"), "must set repositories dir")
local value = option.get("uninstall")
local list = value:split("@")
assert(#list == 2, "invalid input \"%s\", eq. xmake csp-repo --uninstall=csp_hal_apm32f1@latest -r {dir}", value)
local packagename = list[1]
local version = list[2]
uninstall(packagename, version, option.get("repositories"))
end
end
Loading

0 comments on commit 0e8b22e

Please sign in to comment.