archlinuxcn / lilac

Lilac is the build bot for archlinuxcn
GNU General Public License v3.0
113 stars 40 forks source link

Fixed key in dependency map #138

Closed petronny closed 4 years ago

petronny commented 4 years ago

这个我还不确定修的对不对。

目前是遇到了这么个问题。 在x86_64及ARM架构下,均有下述依赖关系的3个包

seafile 依赖 libsearpc, ccnet-server
ccnet-server 依赖 libsearpc
libsearpc 无依赖

然而现在build seafile-armv6h的时候,会解析出(ccnet-server-armv6h, ccnet-server) (libsearpc-armv6h, libsearpc) (libsearpc, libsearpc) 三个依赖,其中最后一个为x86_64的

这么改了以后就只有前两个依赖了。

lilydjwg commented 4 years ago

有最小重现代码吗?

petronny commented 4 years ago

感觉有点难,不过应该是这个函数的锅。

我把两个地方的map打出来了,结果见下。

def get_dependency_map(
  depman: DependencyManager, mods: LilacMods,
) -> Dict[str, Set[Dependency]]:
  map: Dict[str, Set[Dependency]] = defaultdict(set)
  shallow_map: Dict[str, Set[str]] = defaultdict(set)
  rmap: Dict[str, Set[str]] = defaultdict(set)

  for name, mod in mods.items():
    depends = getattr(mod, 'repo_depends', ())

    ds = [depman.get(d) for d in depends]
    if ds:
      for d in ds:
        shallow_map[name].add(d.pkgname)
        rmap[d.pkgname].add(name)
      map[name].update(ds)

  print(map['seafile'])
  print(map['seafile-armv6h'])
  print(map['seafile-armv7h'])
  print(map['seafile-aarch64'])
  print()

  print(map['ccnet-server'])
  print(map['ccnet-server-armv6h'])
  print(map['ccnet-server-armv7h'])
  print(map['ccnet-server-aarch64'])
  print()

  print(map['libsearpc'])
  print(map['libsearpc-armv6h'])
  print(map['libsearpc-armv7h'])
  print(map['libsearpc-aarch64'])
  print()

  dep_order = toposort_flatten(shallow_map)
  for name in dep_order:
    if name in rmap:
      deps = map[name]
      dependers = rmap[name]
      for dd in dependers:
        map[dd].update(deps)

  print(map['seafile'])
  print(map['seafile-armv6h'])
  print(map['seafile-armv7h'])
  print(map['seafile-aarch64'])
  print()

  print(map['ccnet-server'])
  print(map['ccnet-server-armv6h'])
  print(map['ccnet-server-armv7h'])
  print(map['ccnet-server-aarch64'])
  print()

  print(map['libsearpc'])
  print(map['libsearpc-armv6h'])
  print(map['libsearpc-armv7h'])
  print(map['libsearpc-aarch64'])
  print()

  return map
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/ccnet-server'), pkgname='ccnet-server')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/ccnet-server-armv6h'), pkgname='ccnet-server'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-armv6h'), pkgname='libsearpc')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-armv7h'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/ccnet-server-armv7h'), pkgname='ccnet-server')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-aarch64'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/ccnet-server-aarch64'), pkgname='ccnet-server')}

{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc'), pkgname='libsearpc')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-armv6h'), pkgname='libsearpc')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-armv7h'), pkgname='libsearpc')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-aarch64'), pkgname='libsearpc')}

set()
set()
set()
set()

{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/ccnet-server'), pkgname='ccnet-server')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/ccnet-server-armv6h'), pkgname='ccnet-server'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-armv6h'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc'), pkgname='libsearpc')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-armv7h'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/ccnet-server-armv7h'), pkgname='ccnet-server')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-aarch64'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc'), pkgname='libsearpc'), Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/ccnet-server-aarch64'), pkgname='ccnet-server')}

{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc'), pkgname='libsearpc')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-armv6h'), pkgname='libsearpc')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-armv7h'), pkgname='libsearpc')}
{Dependency(pkgdir=PosixPath('/home/calil/arch4edu/arch4edu/libsearpc-aarch64'), pkgname='libsearpc')}

set()
set()
set()
set()
lilydjwg commented 4 years ago

试试 https://github.com/archlinuxcn/lilac/tree/GH-138

petronny commented 4 years ago

在这个 case 上的确解决了问题。

lilydjwg commented 4 years ago

https://github.com/archlinuxcn/lilac/commit/4c521c1993b422e697cc53ee5ba6ee5d9e1b5e3c