summaryrefslogtreecommitdiff
path: root/xmake/modules/private/package/impl/actions/install.lua
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/modules/private/package/impl/actions/install.lua')
-rw-r--r--xmake/modules/private/package/impl/actions/install.lua273
1 files changed, 0 insertions, 273 deletions
diff --git a/xmake/modules/private/package/impl/actions/install.lua b/xmake/modules/private/package/impl/actions/install.lua
deleted file mode 100644
index 8de1c3aa8..000000000
--- a/xmake/modules/private/package/impl/actions/install.lua
+++ /dev/null
@@ -1,273 +0,0 @@
---!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 install.lua
---
-
--- imports
-import("core.base.option")
-import("core.base.tty")
-import("core.project.target")
-import("lib.detect.find_file")
-import("private.package.impl.actions.test")
-import("private.package.impl.actions.patch_sources")
-import("private.package.impl.actions.download_resources")
-import("private.package.impl.utils.filter")
-
--- patch pkgconfig if not exists
-function _patch_pkgconfig(package)
-
- -- only binary? need not pkgconfig
- if not package:is_library() then
- return
- end
-
- -- get lib/pkgconfig/*.pc file
- local pkgconfigdir = path.join(package:installdir(), "lib", "pkgconfig")
- local pcfile = os.isdir(pkgconfigdir) and find_file("*.pc", pkgconfigdir) or nil
- if pcfile then
- return
- end
-
- -- trace
- pcfile = path.join(pkgconfigdir, package:name() .. ".pc")
- vprint("patching %s ..", pcfile)
-
- -- fetch package
- local fetchinfo = package:fetchdeps()
- if not fetchinfo then
- return
- end
-
- -- get libs
- local libs = ""
- for _, linkdir in ipairs(fetchinfo.linkdirs) do
- libs = libs .. "-L" .. linkdir
- end
- libs = libs .. " -L${libdir}"
- for _, link in ipairs(fetchinfo.links) do
- libs = libs .. " -l" .. link
- end
- for _, link in ipairs(fetchinfo.syslinks) do
- libs = libs .. " -l" .. link
- end
-
- -- cflags
- local cflags = ""
- for _, includedir in ipairs(fetchinfo.includedirs) do
- cflags = cflags .. "-I" .. includedir
- end
- cflags = cflags .. " -I${includedir}"
-
- -- patch a *.pc file
- local file = io.open(pcfile, 'w')
- if file then
- file:print("prefix=%s", package:installdir())
- file:print("exec_prefix=${prefix}")
- file:print("libdir=${exec_prefix}/lib")
- file:print("includedir=${prefix}/include")
- file:print("")
- file:print("Name: %s", package:name())
- file:print("Description: %s", package:description())
- file:print("Version: %s", package:version_str())
- file:print("Libs: %s", libs)
- file:print("Libs.private: ")
- file:print("Cflags: %s", cflags)
- file:close()
- end
-end
-
--- install the given package
-function main(package)
-
- -- get working directory of this package
- local workdir = package:cachedir()
-
- -- lock this package
- package:lock()
-
- -- enter the working directory
- local oldir = nil
- if #package:urls() > 0 then
- -- only one root directory? skip it
- local filedirs = os.filedirs(path.join(workdir, "source", "*"))
- if #filedirs == 1 and os.isdir(filedirs[1]) then
- oldir = os.cd(filedirs[1])
- else
- oldir = os.cd(path.join(workdir, "source"))
- end
- end
- if not oldir then
- os.mkdir(workdir)
- oldir = os.cd(workdir)
- end
-
- -- init tipname
- local tipname = package:name()
- if package:version_str() then
- tipname = tipname .. "-" .. package:version_str()
- end
-
- -- install it
- try
- {
- function ()
-
- -- the package scripts
- local scripts =
- {
- package:script("install_before")
- , package:script("install")
- , package:script("install_after")
- }
-
- -- install the third-party package directly, e.g. brew::pcre2/libpcre2-8, conan::OpenSSL/1.0.2n@conan/stable
- local installed_now = false
- if package:is3rd() then
- local script = package:script("install")
- if script ~= nil then
- filter.call(script, package)
- end
- else
-
- -- build and install package to the install directory
- if option.get("force") or not package:manifest_load() then
-
- -- clean install directory first
- os.tryrm(package:installdir())
-
- -- enter the environments of all package dependencies
- for _, dep in ipairs(package:orderdeps()) do
- dep:envs_enter()
- end
-
- -- download package resources
- download_resources(package)
-
- -- patch source codes of package
- patch_sources(package)
-
- -- do install
- for i = 1, 3 do
- local script = scripts[i]
- if script ~= nil then
- filter.call(script, package)
- end
- end
-
- -- leave the environments of all package dependencies
- for _, dep in irpairs(package:orderdeps()) do
- dep:envs_leave()
- end
-
- -- save the package info to the manifest file
- package:manifest_save()
- installed_now = true
- end
- end
-
- -- enter the package environments
- for _, dep in ipairs(package:orderdeps()) do
- dep:envs_enter()
- end
- package:envs_enter()
-
- -- fetch package and force to flush the cache
- local fetchinfo = package:fetch({force = true})
- if option.get("verbose") or option.get("diagnosis") then
- print(fetchinfo)
- end
- assert(fetchinfo, "fetch %s failed!", tipname)
-
- -- this package is installed now
- if installed_now then
-
- -- patch pkg-config files for package
- _patch_pkgconfig(package)
-
- -- test it
- test(package)
- end
-
- -- leave the package environments
- package:envs_leave()
- for _, dep in irpairs(package:orderdeps()) do
- dep:envs_leave()
- end
-
- -- trace
- tty.erase_line_to_start().cr()
- cprint("${yellow} => ${clear}install %s %s .. ${color.success}${text.success}", package:displayname(), package:version_str() or "")
- end,
-
- catch
- {
- function (errors)
-
- -- show or save the last errors
- local errorfile = path.join(package:installdir("logs"), "install.txt")
- if errors then
- if (option.get("verbose") or option.get("diagnosis")) then
- cprint("${dim color.error}error: ${clear}%s", errors)
- else
- io.writefile(errorfile, errors .. "\n")
- end
- end
-
- -- trace
- tty.erase_line_to_start().cr()
- cprint("${yellow} => ${clear}install %s %s .. ${color.failure}${text.failure}", package:displayname(), package:version_str() or "")
-
- -- leave the package environments
- package:envs_leave()
-
- -- copy the invalid package directory to cache
- local installdir = package:installdir()
- if os.isdir(installdir) then
- local installdir_failed = path.join(package:cachedir(), "installdir.failed")
- os.tryrm(installdir_failed)
- if not os.isdir(installdir_failed) then
- os.cp(installdir, installdir_failed)
- end
- errorfile = path.join(installdir_failed, "logs", "install.txt")
- end
- os.tryrm(installdir)
-
- -- failed
- if not package:requireinfo().optional then
- if os.isfile(errorfile) then
- print("if you want to get verbose errors, please see:")
- cprint(" -> ${bright}%s", errorfile)
- end
- raise("install failed!")
- end
- end
- }
- }
-
- -- clean the empty package directory
- local installdir = package:installdir()
- if os.emptydir(installdir) then
- os.tryrm(installdir)
- end
-
- -- unlock this package
- package:unlock()
-
- -- leave source codes directory
- os.cd(oldir)
-end