summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cnf/make.globals2
-rw-r--r--man/ebuild.55
-rw-r--r--man/make.conf.55
-rw-r--r--man/portage.52
-rw-r--r--pym/portage/package/ebuild/_config/UseManager.py1
-rw-r--r--pym/portage/package/ebuild/config.py45
6 files changed, 55 insertions, 5 deletions
diff --git a/cnf/make.globals b/cnf/make.globals
index 2258fd2f2..2892d5089 100644
--- a/cnf/make.globals
+++ b/cnf/make.globals
@@ -106,7 +106,7 @@ CONFIG_PROTECT="/etc"
CONFIG_PROTECT_MASK="/etc/env.d"
# Disable auto-use
-USE_ORDER="env:pkg:conf:defaults:pkginternal:env.d"
+USE_ORDER="env:pkg:conf:defaults:pkginternal:repo:env.d"
# Default ownership of installed files.
PORTAGE_INST_UID="0"
diff --git a/man/ebuild.5 b/man/ebuild.5
index bc5680fc9..20117e08d 100644
--- a/man/ebuild.5
+++ b/man/ebuild.5
@@ -246,8 +246,9 @@ is possible to prefix flags with + or - in order to create default settings
that respectively enable or disable the corresponding \fBUSE\fR flags. For
details about \fBUSE\fR flag stacking order, refer to the \fBUSE_ORDER\fR
variable in \fBmake.conf\fR(5). Given the default \fBUSE_ORDER\fR setting,
-negative IUSE default settings are ineffective since profile and user
-configuration settings override them.
+negative IUSE default settings are effective only for negation of
+repo\-level USE settings, since profile and user configuration settings
+override them.
.TP
\fBDEPEND\fR
This should contain a list of all packages that are required for the
diff --git a/man/make.conf.5 b/man/make.conf.5
index 86ac46231..fcb0954ea 100644
--- a/man/make.conf.5
+++ b/man/make.conf.5
@@ -838,7 +838,7 @@ in USE="foo_bar foo_bla".
Names of \fBUSE_EXPAND\fR variables that should not be shown in the verbose merge
list output of the \fBemerge\fR(1) command.
.TP
-\fBUSE_ORDER\fR = \fI"env:pkg:conf:defaults:pkginternal:env.d"\fR
+\fBUSE_ORDER\fR = \fI"env:pkg:conf:defaults:pkginternal:repo:env.d"\fR
Determines the precedence of layers in the incremental stacking of the USE
variable. Precedence decreases from left to right such that env overrides
pkg, pkg overrides conf, and so forth.
@@ -866,6 +866,9 @@ USE from make.defaults and package.use in the profile (see \fBportage\fR(5))
.B pkginternal
USE from \fBebuild\fR(5) IUSE defaults
.TP
+.B repo
+USE from make.defaults and package.use in the repo (see \fBportage\fR(5))
+.TP
.B env.d
USE from the environment variables defined by files in \fI/etc/env.d/\fR
.RE
diff --git a/man/portage.5 b/man/portage.5
index 61f462309..b2b0eb12c 100644
--- a/man/portage.5
+++ b/man/portage.5
@@ -81,8 +81,10 @@ categories
info_pkgs
info_vars
license_groups
+make.defaults
package.mask
package.unmask
+package.use
package.use.force
package.use.mask
profiles.desc
diff --git a/pym/portage/package/ebuild/_config/UseManager.py b/pym/portage/package/ebuild/_config/UseManager.py
index 3905f4fa1..de18500a9 100644
--- a/pym/portage/package/ebuild/_config/UseManager.py
+++ b/pym/portage/package/ebuild/_config/UseManager.py
@@ -53,6 +53,7 @@ class UseManager(object):
self._repo_useforce_dict = self._parse_repository_files_to_dict_of_tuples("use.force", repositories)
self._repo_pusemask_dict = self._parse_repository_files_to_dict_of_dicts("package.use.mask", repositories)
self._repo_puseforce_dict = self._parse_repository_files_to_dict_of_dicts("package.use.force", repositories)
+ self._repo_puse_dict = self._parse_repository_files_to_dict_of_dicts("package.use", repositories)
self._usemask_list = self._parse_profile_files_to_tuple_of_tuples("use.mask", profiles)
self._useforce_list = self._parse_profile_files_to_tuple_of_tuples("use.force", profiles)
diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index b75a17716..6b7af51e9 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -206,6 +206,7 @@ class config(object):
self.repositories = clone.repositories
self._iuse_implicit_match = clone._iuse_implicit_match
self._non_user_variables = clone._non_user_variables
+ self._repo_make_defaults = clone._repo_make_defaults
self.usemask = clone.usemask
self.useforce = clone.useforce
self.puse = clone.puse
@@ -229,6 +230,7 @@ class config(object):
self.configdict = copy.deepcopy(clone.configdict)
self.configlist = [
self.configdict['env.d'],
+ self.configdict['repo'],
self.configdict['pkginternal'],
self.configdict['globals'],
self.configdict['defaults'],
@@ -319,6 +321,9 @@ class config(object):
self.configdict["env.d"] = self.configlist[-1]
self.configlist.append({})
+ self.configdict["repo"] = self.configlist[-1]
+
+ self.configlist.append({})
self.configdict["pkginternal"] = self.configlist[-1]
self.packages_list = [grabfile_package(os.path.join(x, "packages"), verify_eapi=True) for x in self.profiles]
@@ -509,6 +514,14 @@ class config(object):
locations_manager.set_port_dirs(self["PORTDIR"], self["PORTDIR_OVERLAY"])
+ self._repo_make_defaults = {}
+ for repo in self.repositories.repos_with_profiles():
+ d = getconfig(os.path.join(repo.location, "profiles", "make.defaults"),
+ expand=self.configdict["globals"].copy()) or {}
+ for blacklisted in self._env_blacklist:
+ d.pop(blacklisted, None)
+ self._repo_make_defaults[repo.name] = d
+
#Read package.keywords and package.accept_keywords.
self._keywords_manager = KeywordsManager(self.profiles, abs_user_config, \
local_config, global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", ""))
@@ -629,7 +642,7 @@ class config(object):
# reasonable defaults; this is important as without USE_ORDER,
# USE will always be "" (nothing set)!
if "USE_ORDER" not in self:
- self.backupenv["USE_ORDER"] = "env:pkg:conf:defaults:pkginternal:env.d"
+ self.backupenv["USE_ORDER"] = "env:pkg:conf:defaults:pkginternal:repo:env.d"
self["PORTAGE_GID"] = str(portage_gid)
self.backup_changes("PORTAGE_GID")
@@ -890,6 +903,7 @@ class config(object):
del self._penv[:]
self.configdict["pkg"].clear()
self.configdict["pkginternal"].clear()
+ self.configdict["repo"].clear()
self.configdict["defaults"]["USE"] = \
" ".join(self.make_defaults_use)
self.usemask = self._use_manager.getUseMask()
@@ -1065,6 +1079,7 @@ class config(object):
pkg_configdict["CATEGORY"] = cat
pkg_configdict["PF"] = pf
+ repository = None
if mydb:
if not hasattr(mydb, "aux_get"):
for k in aux_keys:
@@ -1109,6 +1124,34 @@ class config(object):
self.configdict["pkginternal"]["USE"] = pkginternaluse
has_changed = True
+ repo_env = []
+ repo_env_empty = True
+ if repository and repository != Package.UNKNOWN_REPO:
+ for repo in [repo.name for
+ repo in self.repositories[repository].masters] + [repository]:
+ d = self._repo_make_defaults.get(repo)
+ if d is None:
+ d = {}
+ else:
+ # make a copy, since we might modify it with
+ # package.use settings
+ d = d.copy()
+ repo_env.append(d)
+ cpdict = self._use_manager._repo_puse_dict.get(repo, {}).get(cp)
+ if cpdict:
+ repo_puse = ordered_by_atom_specificity(cpdict, pkg)
+ if repo_puse:
+ for x in repo_puse:
+ d["USE"] = d.get("USE", "") + " " + " ".join(x)
+ if d:
+ repo_env_empty = False
+
+ if not repo_env_empty or self.configdict["repo"]:
+ self.configdict["repo"].clear()
+ self.configdict["repo"].update(stack_dicts(repo_env,
+ incrementals=self.incrementals))
+ has_changed = True
+
defaults = []
for i, pkgprofileuse_dict in enumerate(self._use_manager._pkgprofileuse):
if self.make_defaults_use[i]: