summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-09-07 11:50:31 +0800
committerGitHub <[email protected]>2022-09-07 11:50:31 +0800
commit96d2662955aae226e3ff5705ed5f7e2ac98da6d9 (patch)
treef855d716d68c60687582b0b1e34e557c75fce01b
parent6b1902122657a8b4885e93bf15b29bae20ba84b2 (diff)
parentb59153266d0a58490f7860042fefaaa9e97fbdfc (diff)
Merge pull request #2790 from xmake-io/packagenvs
Improve package envs
-rw-r--r--xmake/core/package/package.lua75
-rw-r--r--xmake/modules/private/action/require/impl/register_packages.lua15
-rw-r--r--xmake/modules/private/xrepo/action/env.lua12
3 files changed, 57 insertions, 45 deletions
diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua
index 5ec14ff0b..d65d35e6d 100644
--- a/xmake/core/package/package.lua
+++ b/xmake/core/package/package.lua
@@ -295,7 +295,7 @@ function _instance:artifacts_set(artifacts_info)
end
end
if manifest.envs then
- local envs = self:envs()
+ local envs = self:_rawenvs()
for k, v in pairs(manifest.envs) do
envs[k] = v
end
@@ -756,7 +756,7 @@ function _instance:manifest_save()
manifest.arch = self:arch()
manifest.mode = self:mode()
manifest.configs = self:configs()
- manifest.envs = self:envs()
+ manifest.envs = self:_rawenvs()
-- save enabled library deps
if self:librarydeps() then
@@ -821,9 +821,9 @@ function _instance:manifest_save()
end
end
--- get the exported environments
-function _instance:envs()
- local envs = self._ENVS
+-- get the raw environments
+function _instance:_rawenvs()
+ local envs = self._RAWENVS
if not envs then
envs = {}
if self:is_binary() or self:is_plat("windows", "mingw") then -- bin/*.dll for windows
@@ -836,7 +836,50 @@ function _instance:envs()
envs.DYLD_LIBRARY_PATH = {"lib"}
end
end
- self._ENVS = envs
+ self._RAWENVS = envs
+ end
+ return envs
+end
+
+-- get path environment keys
+function _instance:_pathenvs()
+ local pathenvs = self._PATHENVS
+ if pathenvs == nil then
+ pathenvs = hashset.from {
+ "PATH",
+ "LD_LIBRARY_PATH",
+ "DYLD_LIBRARY_PATH",
+ "PKG_CONFIG_PATH",
+ "ACLOCAL_PATH",
+ "CMAKE_PREFIX_PATH",
+ "PYTHONPATH"
+ }
+ self._PATHENVS = pathenvs
+ end
+ return pathenvs
+end
+
+-- mark as path environments
+function _instance:mark_as_pathenv(name)
+ self:_pathenvs():insert(name)
+end
+
+-- get the exported environments
+function _instance:envs()
+ local envs = {}
+ for name, values in pairs(self:_rawenvs()) do
+ if self:_pathenvs():has(name) then
+ local newvalues = {}
+ for _, value in ipairs(values) do
+ if path.is_absolute(value) then
+ table.insert(newvalues, value)
+ else
+ table.insert(newvalues, path.join(self:installdir(), value))
+ end
+ end
+ values = newvalues
+ end
+ envs[name] = values
end
return envs
end
@@ -845,7 +888,7 @@ end
function _instance:envs_load()
local manifest = self:manifest_load()
if manifest then
- local envs = self:envs()
+ local envs = self:_rawenvs()
for name, values in pairs(manifest.envs) do
envs[name] = values
end
@@ -856,33 +899,23 @@ end
function _instance:envs_enter()
local installdir = self:installdir({readonly = true})
for name, values in pairs(self:envs()) do
- if name == "PATH" or name == "LD_LIBRARY_PATH" or name == "DYLD_LIBRARY_PATH" then
- for _, value in ipairs(values) do
- if path.is_absolute(value) then
- os.addenv(name, value)
- else
- os.addenv(name, path.join(installdir, value))
- end
- end
- else
- os.addenv(name, table.unpack(table.wrap(values)))
- end
+ os.addenv(name, table.unpack(table.wrap(values)))
end
end
-- get the given environment variable
function _instance:getenv(name)
- return self:envs()[name]
+ return self:_rawenvs()[name]
end
-- set the given environment variable
function _instance:setenv(name, ...)
- self:envs()[name] = {...}
+ self:_rawenvs()[name] = {...}
end
-- add the given environment variable
function _instance:addenv(name, ...)
- self:envs()[name] = table.join(self:envs()[name] or {}, ...)
+ self:_rawenvs()[name] = table.join(self:_rawenvs()[name] or {}, ...)
end
-- get the given build environment variable
diff --git a/xmake/modules/private/action/require/impl/register_packages.lua b/xmake/modules/private/action/require/impl/register_packages.lua
index ecab45b7c..1bedc2969 100644
--- a/xmake/modules/private/action/require/impl/register_packages.lua
+++ b/xmake/modules/private/action/require/impl/register_packages.lua
@@ -25,19 +25,8 @@ import("core.project.project")
-- envs: bin path for *.dll, program ..
function _register_required_package_envs(instance, envs)
for name, values in pairs(instance:envs()) do
- if name == "PATH" or name == "LD_LIBRARY_PATH" or name == "DYLD_LIBRARY_PATH" then
- for _, value in ipairs(values) do
- envs[name] = envs[name] or {}
- if path.is_absolute(value) then
- table.insert(envs[name], value)
- else
- table.insert(envs[name], path.join(instance:installdir(), value))
- end
- end
- else
- envs[name] = envs[name] or {}
- table.join2(envs[name], values)
- end
+ envs[name] = envs[name] or {}
+ table.join2(envs[name], values)
end
end
diff --git a/xmake/modules/private/xrepo/action/env.lua b/xmake/modules/private/xrepo/action/env.lua
index 4b5bb319e..63ddfae63 100644
--- a/xmake/modules/private/xrepo/action/env.lua
+++ b/xmake/modules/private/xrepo/action/env.lua
@@ -243,17 +243,7 @@ function _package_addenvs(envs, instance)
-- add run envs, e.g. PATH, LD_LIBRARY_PATH, DYLD_LIBRARY_PATH
local installdir = instance:installdir()
for name, values in pairs(instance:envs()) do
- if name == "PATH" or name == "LD_LIBRARY_PATH" or name == "DYLD_LIBRARY_PATH" then
- for _, value in ipairs(values) do
- if path.is_absolute(value) then
- _addenvs(envs, name, value)
- else
- _addenvs(envs, name, path.join(installdir, value))
- end
- end
- else
- _addenvs(envs, name, table.unpack(table.wrap(values)))
- end
+ _addenvs(envs, name, table.unpack(table.wrap(values)))
end
-- add library envs, e.g. ACLOCAL_PATH, PKG_CONFIG_PATH, CMAKE_PREFIX_PATH