Browse Source

implement MultiarchCross for build-dep and source (Closes: #632221)

debian/1.8.y
David Kalnischkies 11 years ago
parent
commit
234675b71a
  1. 113
      cmdline/apt-get.cc
  2. 3
      debian/changelog
  3. 27
      doc/apt-get.8.xml
  4. 1
      doc/examples/configure-index
  5. 22
      test/integration/framework
  6. 183
      test/integration/test-bug-632221-cross-dependency-satisfaction

113
cmdline/apt-get.cc

@ -2620,12 +2620,17 @@ bool DoSource(CommandLine &CmdL)
// Try to compile it with dpkg-buildpackage
if (_config->FindB("APT::Get::Compile",false) == true)
{
string buildopts = _config->Find("APT::Get::Host-Architecture");
if (buildopts.empty() == false)
buildopts = "-a " + buildopts + " ";
buildopts.append(_config->Find("DPkg::Build-Options","-b -uc"));
// Call dpkg-buildpackage
char S[500];
snprintf(S,sizeof(S),"cd %s && %s %s",
Dir.c_str(),
_config->Find("Dir::Bin::dpkg-buildpackage","dpkg-buildpackage").c_str(),
_config->Find("DPkg::Build-Options","-b -uc").c_str());
buildopts.c_str());
if (system(S) != 0)
{
@ -2687,8 +2692,19 @@ bool DoBuildDep(CommandLine &CmdL)
if (Fetcher.Setup(&Stat) == false)
return false;
bool StripMultiArch;
string hostArch = _config->Find("APT::Get::Host-Architecture");
if (hostArch.empty() == false)
{
std::vector<std::string> archs = APT::Configuration::getArchitectures();
if (std::find(archs.begin(), archs.end(), hostArch) == archs.end())
return _error->Error(_("No architecture information available for %s. See apt.conf(5) APT::Architectures for setup"), hostArch.c_str());
StripMultiArch = false;
}
else
StripMultiArch = true;
unsigned J = 0;
bool const StripMultiArch = APT::Configuration::getArchitectures().size() <= 1;
for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
{
string Src;
@ -2722,7 +2738,7 @@ bool DoBuildDep(CommandLine &CmdL)
ioprintf(c1out,_("%s has no build depends.\n"),Src.c_str());
continue;
}
// Install the requested packages
vector <pkgSrcRecords::Parser::BuildDepRec>::iterator D;
pkgProblemResolver Fix(Cache);
@ -2773,7 +2789,95 @@ bool DoBuildDep(CommandLine &CmdL)
if (_config->FindB("Debug::BuildDeps",false) == true)
cout << "Looking for " << (*D).Package << "...\n";
pkgCache::PkgIterator Pkg = Cache->FindPkg((*D).Package);
pkgCache::PkgIterator Pkg;
// Cross-Building?
if (StripMultiArch == false)
{
size_t const colon = D->Package.find(":");
if (colon != string::npos &&
(strcmp(D->Package.c_str() + colon, ":any") == 0 || strcmp(D->Package.c_str() + colon, ":native") == 0))
Pkg = Cache->FindPkg(D->Package.substr(0,colon));
else
Pkg = Cache->FindPkg(D->Package);
// We need to decide if host or build arch, so find a version we can look at
pkgCache::VerIterator Ver;
// a bad version either is invalid or doesn't satify dependency
#define BADVER(Ver) Ver.end() == true || \
(Ver.end() == false && D->Version.empty() == false && \
Cache->VS().CheckDep(Ver.VerStr(),D->Op,D->Version.c_str()) == false)
if (Pkg.end() == false)
{
Ver = (*Cache)[Pkg].InstVerIter(*Cache);
if (BADVER(Ver))
Ver = (*Cache)[Pkg].CandidateVerIter(*Cache);
}
if (BADVER(Ver))
{
pkgCache::PkgIterator HostPkg = Cache->FindPkg(D->Package, hostArch);
if (HostPkg.end() == false)
{
Ver = (*Cache)[HostPkg].InstVerIter(*Cache);
if (BADVER(Ver))
Ver = (*Cache)[HostPkg].CandidateVerIter(*Cache);
}
}
if ((BADVER(Ver)) == false)
{
string forbidden;
if (Ver->MultiArch == pkgCache::Version::None || Ver->MultiArch == pkgCache::Version::All);
else if (Ver->MultiArch == pkgCache::Version::Same)
{
if (colon != string::npos)
Pkg = Ver.ParentPkg().Group().FindPkg(hostArch);
else if (strcmp(D->Package.c_str() + colon, ":any") == 0)
forbidden = "Multi-Arch: same";
// :native gets the buildArch
}
else if (Ver->MultiArch == pkgCache::Version::Foreign || Ver->MultiArch == pkgCache::Version::AllForeign)
{
if (colon != string::npos)
forbidden = "Multi-Arch: foreign";
}
else if (Ver->MultiArch == pkgCache::Version::Allowed || Ver->MultiArch == pkgCache::Version::AllAllowed)
{
if (colon == string::npos)
Pkg = Ver.ParentPkg().Group().FindPkg(hostArch);
else if (strcmp(D->Package.c_str() + colon, ":any") == 0)
{
// prefer any installed over preferred non-installed architectures
pkgCache::GrpIterator Grp = Ver.ParentPkg().Group();
// we don't check for version here as we are better of with upgrading than remove and install
for (Pkg = Grp.PackageList(); Pkg.end() == false; Pkg = Grp.NextPkg(Pkg))
if (Pkg.CurrentVer().end() == false)
break;
if (Pkg.end() == true)
Pkg = Grp.FindPreferredPkg(true);
}
// native gets buildArch
}
if (forbidden.empty() == false)
{
if (_config->FindB("Debug::BuildDeps",false) == true)
cout << " :any is not allowed from M-A: same package " << (*D).Package << endl;
if (hasAlternatives)
continue;
return _error->Error(_("%s dependency for %s can't be satisfied "
"because %s is not allowed on '%s' packages"),
Last->BuildDepType(D->Type), Src.c_str(),
D->Package.c_str(), "Multi-Arch: same");
}
}
else if (_config->FindB("Debug::BuildDeps",false) == true)
cout << " No multiarch info as we have no satisfying installed nor candidate for " << D->Package << " on build or host arch" << endl;
#undef BADVER
}
else
Pkg = Cache->FindPkg(D->Package);
if (Pkg.end() == true)
{
if (_config->FindB("Debug::BuildDeps",false) == true)
@ -3241,6 +3345,7 @@ int main(int argc,const char *argv[]) /*{{{*/
{'m',"ignore-missing","APT::Get::Fix-Missing",0},
{'t',"target-release","APT::Default-Release",CommandLine::HasArg},
{'t',"default-release","APT::Default-Release",CommandLine::HasArg},
{'a',"host-architecture","APT::Get::Host-Architecture",CommandLine::HasArg},
{0,"download","APT::Get::Download",0},
{0,"fix-missing","APT::Get::Fix-Missing",0},
{0,"ignore-hold","APT::Ignore-Hold",0},

3
debian/changelog

@ -19,6 +19,7 @@ apt (0.8.15.3) UNRELEASED; urgency=low
- restore all important dependencies for garbage packages (LP: #806274)
- do not require unused partial dirs in 'source' (Closes: #633510)
- buildconflicts effect all architectures
- implement MultiarchCross for build-dep and source (Closes: #632221)
* apt-pkg/init.cc:
- use CndSet in pkgInitConfig (Closes: #629617)
* apt-pkg/depcache.cc:
@ -39,7 +40,7 @@ apt (0.8.15.3) UNRELEASED; urgency=low
save to ignore them in non-MultiArch contexts but if the dependency
is a specific architecture (and not the native) do not strip
-- David Kalnischkies <kalnischkies@gmail.com> Mon, 25 Jul 2011 12:46:19 +0200
-- David Kalnischkies <kalnischkies@gmail.com> Mon, 25 Jul 2011 14:40:00 +0200
apt (0.8.15.2) unstable; urgency=high

27
doc/apt-get.8.xml

@ -54,6 +54,13 @@
<replaceable>target_release</replaceable>
</arg>
</arg>
<arg>
<option>-a=</option>
<arg choice='plain'>
<replaceable>default_architecture</replaceable>
</arg>
</arg>
<group choice="req">
<arg choice='plain'>update</arg>
@ -254,8 +261,10 @@
<para>If the <option>--compile</option> option is specified
then the package will be compiled to a binary .deb using
<command>dpkg-buildpackage</command>, if <option>--download-only</option>
is specified then the source package will not be unpacked.</para>
<command>dpkg-buildpackage</command> for the architecture as
defined by the <command>--host-architecture</command> option.
If <option>--download-only</option> is specified then the source package
will not be unpacked.</para>
<para>A specific source version can be retrieved by postfixing the source name
with an equals and then the version to fetch, similar to the mechanism
@ -270,7 +279,9 @@
<varlistentry><term>build-dep</term>
<listitem><para><literal>build-dep</literal> causes apt-get to install/remove packages in an
attempt to satisfy the build dependencies for a source package.</para></listitem>
attempt to satisfy the build dependencies for a source package. By default the dependencies are
satisfied to build the package nativly. If desired a host-architecture can be specified
with the <option>--host-architecture</option> option instead.</para></listitem>
</varlistentry>
<varlistentry><term>check</term>
@ -433,6 +444,16 @@
Configuration Item: <literal>APT::Get::Show-Versions</literal>.</para></listitem>
</varlistentry>
<varlistentry><term><option>-a</option></term>
<term><option>--host-architecture</option></term>
<listitem><para>This option controls the architecture packages are built for
by <command>apt-get source --compile</command> and how cross-builddependencies
are satisfied. By default is not set which means that the host architecture
is the same as the build architecture (which is defined by <literal>APT::Architecture</literal>)
Configuration Item: <literal>APT::Get::Host-Architecture</literal>
</para></listitem>
</varlistentry>
<varlistentry><term><option>-b</option></term><term><option>--compile</option></term>
<term><option>--build</option></term>
<listitem><para>Compile source packages after downloading them.

1
doc/examples/configure-index

@ -32,6 +32,7 @@ APT
// Options for apt-get
Get
{
Host-Architecture "armel";
Arch-Only "false";
AllowUnauthenticated "false";
AutomaticRemove "false";

22
test/integration/framework

@ -151,6 +151,7 @@ setupenvironment() {
configarchitecture() {
local CONFFILE=rootdir/etc/apt/apt.conf.d/01multiarch.conf
rm -f $CONFFILE
echo "APT::Architecture \"$1\";" > $CONFFILE
shift
while [ -n "$1" ]; do
@ -429,6 +430,27 @@ Filename: pool/main/${NAME}/${NAME}_${VERSION}_${arch}.deb" >> $FILE
done
}
insertsource() {
local RELEASE="$1"
local NAME="$2"
local ARCH="$3"
local VERSION="$4"
local DEPENDENCIES="$5"
local ARCHS=""
local SPATH="aptarchive/dists/${RELEASE}/main/source"
mkdir -p $SPATH
local FILE="${SPATH}/Sources"
echo "Package: $NAME
Binary: $NAME
Version: $VERSION
Maintainer: Joe Sixpack <joe@example.org>
Architecture: $ARCH" >> $FILE
test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
echo "Files:
d41d8cd98f00b204e9800998ecf8427e 0 ${NAME}_${VERSION}.dsc
d41d8cd98f00b204e9800998ecf8427e 0 ${NAME}_${VERSION}.tar.gz" >> $FILE
}
insertinstalledpackage() {
local NAME="$1"
local ARCH="$2"

183
test/integration/test-bug-632221-cross-dependency-satisfaction

@ -0,0 +1,183 @@
#!/bin/sh
set -e
TESTDIR=$(readlink -f $(dirname $0))
. $TESTDIR/framework
setupenvironment
configarchitecture 'amd64' 'armel'
insertinstalledpackage 'build-essential' 'all' '11.5'
insertpackage 'unstable' 'doxygen' 'amd64,armel' '1.0'
insertpackage 'unstable' 'libc6' 'amd64,armel' '1.0' 'Multi-Arch: same'
insertpackage 'unstable' 'libc6-dev' 'amd64,armel' '1.0' 'Depends: libc6
Multi-Arch: same'
insertpackage 'unstable' 'cool' 'amd64,armel' '1.0' 'Multi-Arch: allowed'
insertpackage 'unstable' 'amdboot' 'amd64' '1.0'
insertpackage 'unstable' 'foreigner' 'amd64,armel' '1.0' 'Multi-Arch: foreign'
insertsource 'unstable' 'apt' 'any' '0.8.15' 'Build-Depends: doxygen, libc6-dev, libc6-dev:native, cool:any, amdboot:amd64, foreigner'
setupaptarchive
testequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
amdboot cool doxygen foreigner libc6 libc6-dev
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
Inst amdboot (1.0 unstable [amd64])
Inst cool (1.0 unstable [amd64])
Inst doxygen (1.0 unstable [amd64])
Inst foreigner (1.0 unstable [amd64])
Inst libc6 (1.0 unstable [amd64])
Inst libc6-dev (1.0 unstable [amd64])
Conf amdboot (1.0 unstable [amd64])
Conf cool (1.0 unstable [amd64])
Conf doxygen (1.0 unstable [amd64])
Conf foreigner (1.0 unstable [amd64])
Conf libc6 (1.0 unstable [amd64])
Conf libc6-dev (1.0 unstable [amd64])' aptget build-dep apt -s
testequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
amdboot cool doxygen foreigner libc6 libc6:armel libc6-dev libc6-dev:armel
0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded.
Inst amdboot (1.0 unstable [amd64])
Inst cool (1.0 unstable [amd64])
Inst doxygen (1.0 unstable [amd64])
Inst foreigner (1.0 unstable [amd64])
Inst libc6:armel (1.0 unstable [armel])
Inst libc6 (1.0 unstable [amd64])
Inst libc6-dev:armel (1.0 unstable [armel])
Inst libc6-dev (1.0 unstable [amd64])
Conf amdboot (1.0 unstable [amd64])
Conf cool (1.0 unstable [amd64])
Conf doxygen (1.0 unstable [amd64])
Conf foreigner (1.0 unstable [amd64])
Conf libc6 (1.0 unstable [amd64])
Conf libc6:armel (1.0 unstable [armel])
Conf libc6-dev (1.0 unstable [amd64])
Conf libc6-dev:armel (1.0 unstable [armel])' aptget build-dep apt -s -a armel
configarchitecture 'armel' 'amd64'
testequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
amdboot:amd64 cool doxygen foreigner libc6 libc6-dev
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
Inst amdboot:amd64 (1.0 unstable [amd64])
Inst cool (1.0 unstable [armel])
Inst doxygen (1.0 unstable [armel])
Inst foreigner (1.0 unstable [armel])
Inst libc6 (1.0 unstable [armel])
Inst libc6-dev (1.0 unstable [armel])
Conf amdboot:amd64 (1.0 unstable [amd64])
Conf cool (1.0 unstable [armel])
Conf doxygen (1.0 unstable [armel])
Conf foreigner (1.0 unstable [armel])
Conf libc6 (1.0 unstable [armel])
Conf libc6-dev (1.0 unstable [armel])' aptget build-dep apt -s
testequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
amdboot:amd64 cool doxygen foreigner libc6:amd64 libc6 libc6-dev:amd64
libc6-dev
0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded.
Inst amdboot:amd64 (1.0 unstable [amd64])
Inst cool (1.0 unstable [armel])
Inst doxygen (1.0 unstable [armel])
Inst foreigner (1.0 unstable [armel])
Inst libc6 (1.0 unstable [armel])
Inst libc6:amd64 (1.0 unstable [amd64])
Inst libc6-dev (1.0 unstable [armel])
Inst libc6-dev:amd64 (1.0 unstable [amd64])
Conf amdboot:amd64 (1.0 unstable [amd64])
Conf cool (1.0 unstable [armel])
Conf doxygen (1.0 unstable [armel])
Conf foreigner (1.0 unstable [armel])
Conf libc6:amd64 (1.0 unstable [amd64])
Conf libc6 (1.0 unstable [armel])
Conf libc6-dev:amd64 (1.0 unstable [amd64])
Conf libc6-dev (1.0 unstable [armel])' aptget build-dep apt -s -a amd64
configarchitecture 'amd64' 'armel'
insertinstalledpackage 'cool' 'amd64' '0.5'
insertinstalledpackage 'foreigner' 'armel' '0.5'
testequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
amdboot doxygen libc6 libc6-dev
0 upgraded, 4 newly installed, 0 to remove and 2 not upgraded.
Inst amdboot (1.0 unstable [amd64])
Inst doxygen (1.0 unstable [amd64])
Inst libc6 (1.0 unstable [amd64])
Inst libc6-dev (1.0 unstable [amd64])
Conf amdboot (1.0 unstable [amd64])
Conf doxygen (1.0 unstable [amd64])
Conf libc6 (1.0 unstable [amd64])
Conf libc6-dev (1.0 unstable [amd64])' aptget build-dep apt -s
testequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
amdboot doxygen libc6 libc6:armel libc6-dev libc6-dev:armel
0 upgraded, 6 newly installed, 0 to remove and 2 not upgraded.
Inst amdboot (1.0 unstable [amd64])
Inst doxygen (1.0 unstable [amd64])
Inst libc6:armel (1.0 unstable [armel])
Inst libc6 (1.0 unstable [amd64])
Inst libc6-dev:armel (1.0 unstable [armel])
Inst libc6-dev (1.0 unstable [amd64])
Conf amdboot (1.0 unstable [amd64])
Conf doxygen (1.0 unstable [amd64])
Conf libc6 (1.0 unstable [amd64])
Conf libc6:armel (1.0 unstable [armel])
Conf libc6-dev (1.0 unstable [amd64])
Conf libc6-dev:armel (1.0 unstable [armel])' aptget build-dep apt -s -a armel
configarchitecture 'armel' 'amd64'
# cool 0.5 is not M-A: allowed, so amd64 is not acceptable
testequal 'Reading package lists...
Building dependency tree...
The following packages will be REMOVED:
cool:amd64
The following NEW packages will be installed:
amdboot:amd64 cool doxygen libc6 libc6-dev
0 upgraded, 5 newly installed, 1 to remove and 1 not upgraded.
Remv cool:amd64 [0.5]
Inst amdboot:amd64 (1.0 unstable [amd64])
Inst cool (1.0 unstable [armel])
Inst doxygen (1.0 unstable [armel])
Inst libc6 (1.0 unstable [armel])
Inst libc6-dev (1.0 unstable [armel])
Conf amdboot:amd64 (1.0 unstable [amd64])
Conf cool (1.0 unstable [armel])
Conf doxygen (1.0 unstable [armel])
Conf libc6 (1.0 unstable [armel])
Conf libc6-dev (1.0 unstable [armel])' aptget build-dep apt -s
testequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
amdboot:amd64 doxygen libc6:amd64 libc6 libc6-dev:amd64 libc6-dev
0 upgraded, 6 newly installed, 0 to remove and 2 not upgraded.
Inst amdboot:amd64 (1.0 unstable [amd64])
Inst doxygen (1.0 unstable [armel])
Inst libc6 (1.0 unstable [armel])
Inst libc6:amd64 (1.0 unstable [amd64])
Inst libc6-dev (1.0 unstable [armel])
Inst libc6-dev:amd64 (1.0 unstable [amd64])
Conf amdboot:amd64 (1.0 unstable [amd64])
Conf doxygen (1.0 unstable [armel])
Conf libc6:amd64 (1.0 unstable [amd64])
Conf libc6 (1.0 unstable [armel])
Conf libc6-dev:amd64 (1.0 unstable [amd64])
Conf libc6-dev (1.0 unstable [armel])' aptget build-dep apt -s -a amd64
Loading…
Cancel
Save