处理被屏蔽(masked)的包

出自Gentoo Linux Wiki

跳转到: 导航, 搜索

处理被屏蔽(masked)的包

目录

[编辑] 介绍

首先,被关键字(keyword)屏蔽(masked)的包都是测试中的或者不稳定的包: 注意: "(masked by: ~keyword)"

代码: Masked By ~keyword Package Example
 # emerge gnome-extra/gdesklets-core

  '''Calculating dependencies'''   
  !!! all ebuilds that could satisfy "gnome-extra/gdesklets-core" have been masked.
  !!! possible candidates are:
  - gnome-extra/gdesklets-core-0.26 (masked by: ~keyword)
  - gnome-extra/gdesklets-core-0.26.1 (masked by: ~keyword)
  !!! Error calculating dependencies. Please correct.


其次,被严格屏蔽(Hard masked)的包: 注意: "(masked by: package.mask)"

代码: Hard Masked Package Example
# emerge -pv filewatcher

These are the packages that I would merge, in order:

Calculating dependencies   
!!! All ebuilds that could satisfy "filewatcher" have been masked.
!!! One of the following masked packages is required to complete your request:
- app-admin/filewatcher-2.4.0 (masked by: package.mask)
# Elfyn McBratney <beu@gentoo.org> (28 Apr 2005)
# Masked for testing.

[编辑] 如果你仍然想安装这些包,那该怎么办呢......

[编辑] 被关键字(keyword)屏蔽(masked)的包

现在的新方法是:

echo "gnome-extra/gdesklets-core" >> /etc/portage/package.keywords

或者

echo "=gnome-extra/gdesklets-core-2.10.9" >> /etc/portage/package.keywords

如果你想开放一个特定的版本。

注意:你不需要在package.keywords里面指明电脑架构,除非你想使用其他架构中的软件,当然这是不推荐的。

如果emerge指示某个软件包被 "~* keyword"屏蔽, 你需要逐字的把他写下来,例如:

echo "~gnome-extra/gdesklets-core-2.10.9 ~*" >> /etc/portage/package.keywords

如果你在用crossdev为多种架构建立软件包,例如:

echo "~gnome-extra/gdesklets-core-2.10.9 ~*" >> /etc/portage/package.keywords/cross-i686-pc-linux-gnu

OSB: 在cross-i686-pc-linux-gnu中i686-pc-linux-gnu的名字要根据各架构做相应改变。

到此,在做了以上任一步骤后,需使用一下命令编译这个包:

emerge =gnome-extra/gdesklets-core-2.10.9

关于package.keywords这个文件的更多信息 请点击这里

提示!

如果你在命令行模式下,app-portage/flagedit是自动向packages.keywords里面添加项目的工具。

使用实例:

flagedit gnome-extra/gdesklets-core -- +~x86

Kuroo是一个有用的KDE程序,可以让你浏览portage树并且对任何包进行指定安装。

它使你能安装具有任何依赖性的包,但是,这个程序目前由于不稳定而被屏蔽,比如 ~x86, 所以你不能安逸的在实际安装中使用它(即使它只是portage的前端)。

即使你不想把kuroo用于实际安装,但在开放依赖包时你还是需要它。

emerge -pv kuroo

它编辑标准的portage文件。

[编辑] 旧方法 (不提倡)

ACCEPT_KEYWORDS="~x86" emerge gnome-extra/gdesklets-core

这种方法已经不被提倡了,它出现在这里仅仅是因为历史原因,不要用这个方法。 请阅读 this post 这是关于为什么ACCEPT_KEYWORDS不好的帖子。 简而言之,是因为emerge -u world会对用ACCEPT_KEYWORDS安装的包降级,这会造成潜在的致命改变并且使你的系统陷入瘫痪。 -U(功能:仅仅升级)这个参数也不被提倡了,这有一个充分的原因:如果包坏了,portage应该使它降级,-U确会对此操作造成阻碍。

[编辑] 被不明的关键字屏蔽

在你试图安装一个没有在你的架构上测试过的软件时,这个问题很常见。 向package.keywords文件中,在你要安装的那个包后面加"~*"以开放这个包。 例如:

echo "net-ftp/vsftpd -* ~*" >> /etc/portage/package.keywords

如果你有被9999屏蔽的CVS包,你可以做如下操作:

echo "media-gfx/retina **" >> /etc/portage/package.keywords

牢记,如果你在一个没有测试个架构里安装软件,这个软件也许没法运行。

[编辑] 被严格屏蔽(Hard masked)的包

开放被严格屏蔽(Hard masked)的包,需要把它们加到/etc/portage/package.unmask文件中。 所用命令和package.keywords稍有不同:

echo "=app-admin/filewatcher-2.4.0" >> /etc/portage/package.unmask

这将开放2.4.0版的app-admin/filewatcher。 如果你想开放这个包的所有版本,仅仅写它的名字就行了:

echo "app-admin/filewatcher" >> /etc/portage/package.unmask

当然也可以像 package.keywords 里面那么操作。

注意:由于这些包的不稳定性,被严格屏蔽的包一般也被同样关键字被屏蔽。 你多半须要向package.unmask package.keywords中都加人这个包。

[编辑] 手动进行严格屏蔽

很少的情况下,你需要避免这些包的安装。 这也许是个例子,如,某软件ebuild脚本里的一个bug造成那个包在你的系统上编译失败,这会使得像emerge --update --deep world这类命令无法顺利执行。

你可以跳过那个包的ebuild,这是通过把它的名字加到/etc/portage/package.mask来实现的:

echo "=sys-apps/file-4.17-r1" >> /etc/portage/package.mask

所用命令和上述package.unmask的一样。

[编辑] 编辑/etc/portage/package.keywords文件的简便方法

[编辑] flagedit

  1. 安装: emerge flagedit
  2. 使用: flagedit <atom> -- +<keyword>,例如 flagedit dev-util/libconf -- +~x86

[编辑] gimme

这个脚本使编译那些被关键字~arch屏蔽的包变得简单

文件: /usr/bin/gimme
#!/bin/bash

############### gimme version 0.5.4 ################
# Script to add package names to package.keywords. #
# Originally by Tekmanx, re-written by Hackeron    #
# re-re-written by Gherald and edited by D. Watzke #
####################################################

source /sbin/functions.sh

 [[$EUID != 0]]  && {
	eerror "You are not root!"
	exit 1
}

 [[-z "$1"]]  && {
	eerror "Please specify a package name (eg. gimme <package-name>)"
	exit 1
}

 [[-d /etc/portage]]  || mkdir -p /etc/portage

# Get fully-qualified ebuild name
FQN=$(ACCEPT_KEYWORDS="~x86" emerge -p $1 | grep "$1" | grep 'ebuild ' | tail -n2 | \
head -n1 | sed -e 's/\[ebuild.......\]\ //' -e 's/\[[[:digit:]].*\]//' -e 's/-[[:digit:]].*$//')

# We think there is either none or more than one package matching $1
# so we let the user deal with it
 [[-z "$FQN"]]  && emerge $@ -a; exit

if grep -q "^ *[\>\<=]*$FQN *" /etc/portage/package.keywords; then
	ewarn "/etc/portage/package.keywords already contains \"$EXISTING\""
	emerge $@ -a; exit
else
	einfo "Adding $FQN to package.keywords and emerging in 5 seconds."; sleep 5
	echo $FQN >> /etc/portage/package.keywords
	emerge $@ -a
fi


把这个文件命名为"gimme"并保存到/usr/bin/然后执行: chmod 755 /usr/bin/gimme 现在你就可以使用这个脚本了,例如: gimme gdesklets-core

[编辑] /etc/portage/package.unmask的脚本

这个脚本使开放那些被严格屏蔽的包变得简单。

文件: /usr/local/bin/unmask
#!/bin/bash
#
# This script will unmask any package masked by the actual profile.
#
# First we search for what is actually masked 
# in /usr/portage/profiles/package.mask then add a corresponding 
# line in /etc/portage/package.unmask
#
#
# Original by drax@sweon.net

source /sbin/functions.sh

[ "$UID" -ne "0" ] && eerror "You must be root to run this script." && exit
[ -z "$1" ] && eerror "Please state a package name (eg. unmask kde-base/kode)" && exit
[ ! -d /etc/portage ] && einfo "Creating /etc/portage directory" && mkdir /etc/portage

if [ "$(grep "$1"-[0-9] /etc/portage/package.unmask 2>/dev/null)" ]; then
    ewarn "$1 already exists in package.unmask"
else
    PKG_LINE="$(grep "$1"-[0-9] /usr/portage/profiles/package.mask 2>/dev/null)"
    if [ ! $PKG_LINE ]; then
	PKG_LINE="$(grep "$1" /usr/portage/profiles/package.mask 2>/dev/null)"
    fi
    if [ ! $PKG_LINE ]; then
      ewarn "Could not find $1 in /usr/portage/profiles/package.mask" && exit 1
    else
      ebegin "Adding $1 to package.unmask"
      echo $PKG_LINE >> /etc/portage/package.unmask
      eend $?
    fi
fi

同样,把这个文件命名为"unmask"并保存到/usr/local/bin然后执行:

chmod 755 /usr/local/bin/unmask

现在你就可以使用这个脚本了,例如:

unmask kde-base/kode # this version of unmask requires the full package name, including app-category/

也可以配合gimme一起使用,例如:

unmask kde-base/kode && gimme kode

潇洒去吧 :)

[编辑] 开放一大群有联系的包

从Portage 2.1起,很多/etc/portage/package.*的文件能够被目录代替。 这些目录里的文件可以自动被Portage连结在一起。 这个对于X模块(xorg)来说特别有用,几乎300个的和这个模块有联系的包都需要被开放。因而,你可以复制modular X unmasking list 到/etc/portage/package.keywords/xorg (也许同样需要复制到 /etc/portage/package.unmask/xorg)。如果不这样的话/etc/portage/package.keywords里会有一大窜东西,而使得这个文件不好管理。

[编辑] 脚本:开放所有被依赖的包

文件: /bin/gimme-everything
#!/bin/bash
#
# This script will unmask any package masked by specified keyword
#
# It is using flagedit to remove keyword
# Usage:  /bin/gimme-everything "=gnome-2.14.2" "+~amd64"
# Sorry that this is in one command line, but it was composed in one ;)
#
# author: mmazurek[at]wallix.com

while true; do
   if emerge "$1" | grep '!!! All ebuilds'; then
      emerge "$1" | grep '!!! All ebuilds' | while read line; do
         n=$(echo $line | sed -e "s/.*\"\(.*\)\".*/\\1/");
         flagedit "$n" -- "$2";
      done;
   else
      break;
   fi;
done

[编辑] 脚本:开放所有被依赖的包 (2)

这个脚步不需要flagedit.

文件: /sbin/unmask
#!/usr/bin/perl -w
use strict;

sub emerge
{
        my $package = shift;
        $_ = `emerge -pv "${package}" 2>&1`;

        if(m/^- (\S+) \(masked by:.*package.mask/mi) {
                print "Unmasking ${1} in package.unmask\n";
                print UNMASK "=${1}\n";
                return 1;
        }
        if(m/^- (\S+) \(masked by:.*keyword/mi) {
                print "Unmasking ${1} in package.keywords\n";
                print KEYWORDS "=${1}\n";
                return 1;
        }
        if(m/^!!! masked or don't exist:\n(\S+)/mi) {
                while(emerge($1) != 0){}
                return 1;
        }
        return 0;
}

open(UNMASK, ">>/etc/portage/package.unmask");
open(KEYWORDS, ">>/etc/portage/package.keywords");
our $package = $ARGV[0];
$package =~ s/"/\\"/g;
while(emerge($package) != 0){}
print "Done\n";
close(UNMASK);
close(KEYWORDS);

使用:

unmask ">media-video/mplayer-1.0_rc1"
个人工具
其它语言