summaryrefslogtreecommitdiff
path: root/xmake/actions/package/remote/main.lua
blob: 45746eb698f3e263cb99de35bf77d15becac4e60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
--!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, Xmake Open Source Community.
--
-- @author      ruki
-- @file        main.lua
--

-- imports
import("core.base.option")
import("core.base.task")
import("core.project.rule")
import("core.project.config")
import("core.project.project")
import("core.base.bit")
import("private.detect.check_targetname")

-- get library deps
function _get_librarydeps(target)
    local librarydeps = {}
    for _, depname in ipairs(target:get("deps")) do
        local dep = project.target(depname, {namespace = target:namespace()})
        if not ((target:is_binary() or target:is_shared()) and dep:is_static()) then
            table.insert(librarydeps, dep:name():lower())
        end
    end
    return librarydeps
end

-- package remote
function _package_remote(target)

    -- get the output directory
    local packagedir  = target:packagedir()
    local packagename = target:name():lower()

    -- generate xmake.lua
    local file = io.open(path.join(packagedir, "xmake.lua"), "w")
    if file then
        local deps = _get_librarydeps(target)
        file:print("package(\"%s\")", packagename)
        if target:is_binary() then
            file:print("    set_kind(\"binary\")")
        elseif target:is_headeronly() then
            file:print("    set_kind(\"library\", {headeronly = true})")
        elseif target:is_moduleonly() then
            file:print("    set_kind(\"library\", {moduleonly = true})")
        end
        local homepage = option.get("homepage")
        if homepage then
            file:print("    set_homepage(\"%s\")", homepage)
        end
        local description = option.get("description") or ("The " .. packagename .. " package")
        file:print("    set_description(\"%s\")", description)
        if target:license() then
            file:print("    set_license(\"%s\")", target:license())
        end
        if #deps > 0 then
            file:print("    add_deps(\"%s\")", table.concat(deps, "\", \""))
        end
        -- export packages as deps, @see https://github.com/xmake-io/xmake/issues/4202
        local interface
        if target:is_shared() then
            interface = true
        end
        for _, pkg in ipairs(target:orderpkgs({interface = interface})) do
            local requireconf_str
            local requireconf = pkg:requireconf()
            if requireconf then
                local conf = table.clone(requireconf)
                conf.alias = nil
                requireconf_str = string.serialize(conf, {indent = false, strip = true})
            end
            if requireconf_str and requireconf_str ~= "{}" then
                file:print("    add_deps(\"%s\", %s)", pkg:requirestr(), requireconf_str)
            else
                file:print("    add_deps(\"%s\")", pkg:requirestr())
            end
        end
        file:print("")
        local url = option.get("url") or "https://github.com/myrepo/foo.git"
        local version = option.get("version") or target:version() and (target:version()) or "1.0"
        local shasum = option.get("shasum") or "<shasum256 or gitcommit>"
        file:print("    add_urls(\"%s\")", url)
        file:print("    add_versions(\"%s\", \"%s\")", version, shasum)
        file:print("")
        file:print([[
    on_install(function (package)
        local configs = {}
        if package:config("shared") then
            configs.kind = "shared"
        end
        import("package.tools.xmake").install(package, configs)
    end)

    on_test(function (package)
        -- TODO check includes and interfaces
        -- assert(package:has_cfuncs("foo", {includes = "foo.h"})
    end)]])
        file:close()
    end

    -- show tips
    print("package(%s): %s generated", packagename, packagedir)
end

-- package target
function _package_target(target)
    if not target:is_phony() then
        local scripts =
        {
            binary     = _package_remote
        ,   static     = _package_remote
        ,   shared     = _package_remote
        ,   headeronly = _package_remote
        ,   moduleonly = _package_remote
        }
        local kind = target:kind()
        local script = scripts[kind]
        if script then
            script(target)
        end
    end
end

-- package the given targets
function _package_targets(targets)
    for _, target in ipairs(targets) do
        _package_target(target)
    end
end

-- main
function main()

    -- lock the whole project
    project.lock()

    -- load config
    config.load()

    -- package the given target?
    local targetname = option.get("target")
    if targetname then
        local target = assert(check_targetname(targetname))
        _package_target(target)
    else
        -- package default or all targets
        for _, target in ipairs(project.ordertargets()) do
            if target:is_default() or option.get("all") then
                _package_target(target)
            end
        end
    end

    -- unlock the whole project
    project.unlock()
end