Hi, This message is about circular dependencies in BLFS, and the way to resolve them automatically for jhalfs, so it belongs to both alfs-discuss and blfs-dev.
Let us first introduce some notation (BTW, please read this message with a monospaced font): a -> b: means "a directly depends on b". Note that we may use a -d> b, where d is 1, 2, or 3 to denote respectively required, recommended, or optional dependency. For example freetype2 -2> harfbuzz a <- b: means "a is a direct dependency of b". We may need the notation a <d- b, for example harfbuzz <2- freetype2. I think there is only one circular dependency at the recommended level: freetype2 <2-2> harfbuzz but there are a lot of cycles of various lengths at the optional level: a -> x1 -> * -> b -3> c /|\ | | \|/ yn <- * <- * <- y2 <- y1 For example harfbuzz <3-3> graphite2 Note that in the xml, we have the information on the dependency and its requirement level, but no help in deciding which package(s) should be built twice, in order to satisfy all dependencies, except in natural language (which xslt is not supposed to interpret). For example, we know that the right order is freetype2-pass1 <- harfbuzz <- freetype2-pass2 only from reading sentences, not from parsing tags or attributes in the xml... So ATM, there *cannot* be any algorithm able to decide whether it should be freetype2-pass1 <- harfbuzz <- freetype2-pass2 or harfbuzz-pass1 <- freetype2 <- harfbuzz-pass2 I propose to introduce an additional role attribute in the dependencies: role="first". For example if, in the above big cycle, we have <xref role="first" linkend="y1-id"/> in the dependencies of c, it would mean: "break the cycle as follows: y1-pass2 -> y2 -> * -> * -> yn -> a -> x1 -> * -> b -3> c -> y1-pass1 and remove y2 from the dependencies of y1-pass1" We would have in the harfbuzz dependencies: <xref role="first" linkend="freetype2"/>, which means "break the cycle as: freetype2-pass1 <- harfbuzz <- freetype2-pass2 and remove harfbuzz from the dependencies of freetype2-pass1". But this is not the end of the story, because we may enter the cycle at any point. Let's say that we enter at package a, that is something like this: requested package -> * -> parent -> a -> x1 -> * -> b -3> c /|\ | | \|/ yn <- * <- * <- y2 <- y1 If we apply the above resolution, we would end with: requested package -> * -> parent -> a -> x1 -> * -> b -3> c -> y1-pass1 and now, nothing depends on y1-pass2 -> y2 -> * -> * -> yn so that those packages might not be built... This may happen for example with the harfbuzz <-> freetype2 cycle if we enter the cycle at harfbuzz... So the solution would be to make y1-pass2 a dependency of parents: requested package -> * -> parent -> a -> x1 -> * -> b -3> c -> y1-pass1 _\| y1-pass2 -> y2 -> * -> * -> yn Don't know whether it is clear, but I will apply this if you agree to add this new role to the book Pierre -- http://lists.linuxfromscratch.org/listinfo/blfs-dev FAQ: http://www.linuxfromscratch.org/blfs/faq.html Unsubscribe: See the above information page