> Date: Thu, 25 May 2017 14:03:33 -0000
> From: "William Harrington" <[email protected]>
>
> On Thu, May 25, 2017 08:09, Simon Geard wrote:
> > On Wed, 2017-05-24 at 15:14 +0000, William Harrington wrote:
> >> In the past I have attempted to use topological sorting (tsort). This
> >> method takes a bit of time if you start with an App with a lot of
> >> deps. A rought example through book and required/recommended deps and
> >> coming up with something for Vim (have to work through the circular
> >> deps):
> >>
> >
> > And the easiest way to implement a topo sort is to re-use Make, since
> > translating a dependency graph into a linear ordering is pretty much
> > what Make is designed for. That's how my B/LFS system used to be
> > maintained... a script to generate a Makefile from sources like the
> > books.
> >
> > Simon.--
>
> Hello Simon,
>
> So pretty much like this right? Can work around circular deps real well
> with Make.
(Apols for the long post.)
Not quite sure if you're extolling 'make' over 'tsort' there, or if the
(slightly passive-aggressive?) tone/wording is to indicate the other way
'round.
Some examples below show cases where 'make' detects circular-deps while
'tsort' does not, & vice versa.
>
> cat Makefile
> vim: Gtk2 GPM Lua Python2 Ruby
> @echo vim
>
> Gtk2: Atk2 Gdk-pixbuf Pango hicolor-icon-theme
> @echo Gtk2
>
> Atk2: GLib
> @echo Atk2
>
> Gdk-pixbuf: GLib libjpeg-turbo Libpng libTIFF Xorg-Libs
> @echo Gdk-pixbuf
>
> Pango: Fontconfig GLib Cairo Xorg-Libs
> @echo Pango
>
> Cairo: Libpng Pixman Fontconfig GLib Xorg-Libs
> @echo Cairo
>
> Pixman:
> @echo Pixman
>
> hicolor-icon-theme:
> @echo hicolor-icon-theme
>
> Fontconfig: FreeType2-HarfBuzz
> @echo Fontconfig
>
> FreeType2-HarfBuzz: HarfBuzz Libpng Which
> @echo FreeType2
>
> FreeType2:
> @echo FreeType2
>
> HarfBuzz: GLib ICU FreeType2
> @echo HarfBuzz
>
> ICU: LLVM-Clang
>
> LLVM-Clang: CMake Libffi Python2
> @echo LLVM-Clang
>
> CMake: cURL libarchive
> @echo CMake
>
> cURL: CACerts OpenSSL
> @echo cURL
>
> libarchive: libXML2 LZO OpenSSL
> @echo libarchive
>
> libXML2: Python2
> @echo libXML2
>
> LZO:
> @echo LZO
>
> Which:
> @echo Which
>
> Xorg-Libs: Fontconfig libxcb
> @echo Xorg-Libs
>
> libxcb: libXau xcb-proto libXdmcp
> @echo libxcb
>
> libXau: Xorg-proto
> @echo libXau
>
> xcb-proto: Python2 Xorg-build-env
> @echo xcb-proto
>
> libXdmcp: Xorg-proto
> @echo libXdmcp
>
> GLib: Libffi Python2 PCRE
> @echo GLib
>
> PCRE:
> @echo PCRE
>
> Libffi:
> @echo Libffi
>
> Xorg-proto: util-macros Sudo Wget-OpenSSL
> @echo Xorg-proto
>
> util-macros: Xorg-build-env
> @echo util-macros
>
> Xorg-build-env:
> @echo Xorg-build-env
>
> Sudo:
> @echo Sudo
>
> Wget:
> @echo Wget
>
> Wget-OpenSSL: Wget CACerts OpenSSL Python3
> @echo Wget-OpenSSL
>
> CACerts: OpenSSL Wget
>
> OpenSSL:
> @echo OpenSSL
>
> Python3: Libffi
> @echo Python3
>
> Python2: Libffi
> @echo Python2
>
> GPM:
> @echo GPM
>
> Lua:
> @echo Lua
>
> Ruby: Libffi OpenSSL
> @echo Ruby
>
> libjpeg-turbo: NASM Yasm
> @echo libjpeg-turbo
>
> Libpng:
> @echo Libpng
>
> libTIFF:
> @echo libTIFF
>
> NASM:
> @echo NASM
>
> Yasm: Python2
> @echo Yasm
>
> Output:
'Output' of what?
>
> Libffi
> Python2
> PCRE
> GLib
> Atk2
> NASM
> Yasm
> libjpeg-turbo
> Libpng
> libTIFF
> OpenSSL
> Wget
> cURL
> libXML2
> LZO
> libarchive
> CMake
> LLVM-Clang
> FreeType2
> HarfBuzz
> Which
> FreeType2
> Fontconfig
> Xorg-build-env
> util-macros
> Sudo
> Python3
> Wget-OpenSSL
> Xorg-proto
> libXau
> xcb-proto
> libXdmcp
> libxcb
> Xorg-Libs
> Gdk-pixbuf
> Pixman
> Cairo
> Pango
> hicolor-icon-theme
> Gtk2
> GPM
> Lua
> Ruby
> vim
>
Am guessing that you are trying to state that make fails to detect a
circular dep, while tsort gets it right.
The example data above, does show in favour of tsort:
$
DEP_DEFN_FP="$( mktemp /tmp/dep_defn.XXXXXX )" ;
cat >"${DEP_DEFN_FP}" <<EOF
vim Gtk2 GPM Lua Python2 Ruby
Gtk2 Atk2 Gdk-pixbuf Pango hicolor-icon-theme
Atk2 GLib
Gdk-pixbuf GLib libjpeg-turbo Libpng libTIFF Xorg-Libs
Pango Fontconfig GLib Cairo Xorg-Libs
Cairo Libpng Pixman Fontconfig GLib Xorg-Libs
Pixman
hicolor-icon-theme
Fontconfig FreeType2-HarfBuzz
FreeType2-HarfBuzz HarfBuzz Libpng Which
FreeType2
HarfBuzz GLib ICU FreeType2
ICU LLVM-Clang
LLVM-Clang CMake Libffi Python2
CMake cURL libarchive
cURL CACerts OpenSSL
libarchive libXML2 LZO OpenSSL
libXML2 Python2
LZO
Which
Xorg-Libs Fontconfig libxcb
libxcb libXau xcb-proto libXdmcp
libXau Xorg-proto
xcb-proto Python2 Xorg-build-env
libXdmcp Xorg-proto
GLib Libffi Python2 PCRE
PCRE
Libffi
Xorg-proto util-macros Sudo Wget-OpenSSL
util-macros Xorg-build-env
Xorg-build-env
Sudo
Wget
Wget-OpenSSL Wget CACerts OpenSSL Python3
CACerts OpenSSL Wget
OpenSSL
Python3 Libffi
Python2 Libffi
GPM
Lua
Ruby Libffi OpenSSL
libjpeg-turbo NASM Yasm
Libpng
libTIFF
NASM
Yasm Python2
EOF
$
$ tsort "${DEP_DEFN_FP}"
Cairo
FreeType2
LLVM-Clang
PCRE
Pixman
Wget-OpenSSL
Xorg-build-env
Yasm
cURL
vim
xcb-proto
hicolor-icon-theme
Fontconfig
util-macros
Libpng
Gtk2
libXdmcp
libxcb
FreeType2-HarfBuzz
Sudo
Which
libTIFF
Atk2
libXau
HarfBuzz
tsort: /tmp/dep_defn.lS7Ppk: input contains a loop:
tsort: CACerts
tsort: OpenSSL
tsort: Python3
CACerts
tsort: /tmp/dep_defn.lS7Ppk: input contains a loop:
tsort: CMake
tsort: Libffi
tsort: Python2
CMake
Libffi
OpenSSL
GPM
Xorg-proto
Python2
Python3
Wget
libXML2
libarchive
Lua
GLib
LZO
Ruby
ICU
Xorg-Libs
libjpeg-turbo
Gdk-pixbuf
NASM
Pango
$
$ tsort "${DEP_DEFN_FP}" >/dev/null
tsort: /tmp/dep_defn.lS7Ppk: input contains a loop:
tsort: CACerts
tsort: OpenSSL
tsort: Python3
tsort: /tmp/dep_defn.lS7Ppk: input contains a loop:
tsort: CMake
tsort: Libffi
tsort: Python2
$
(Note that tsort gives different outputs here if e.g. the input file
is sorted in various ways - e.g. 'sort', 'sort -r', 'sort -f').
Whereas 'make' doesn't nec. warn/&c about it:
$
##
# Gen mkf:
#
MKF_FP="$( mktemp /tmp/mkf.XXXXXX )" ;
sed -rue 's/^([^[:blank:]]+)(.*)$/\1:\2\n\t@echo \$@\n/' "${DEP_DEFN_FP}"
>"${MKF_FP}" ;
##
# For each target in makefile, run 'make $target' :
#
# todo: dfprg: use 'spng' var.
#
while read tgt spng ; do
make -f "${MKF_FP}" "${tgt}" ;
done <<<"$(
sed -rue 's/^([^[:blank:]]+).*$/\1/' "${DEP_DEFN_FP}" ;
)" >/dev/null ;
$
Ie no output of error/warning lines of the form:
make: Circular A <- B dependency dropped.
However, does tsort always get things right:
$
#
# 'a' has 'Q' as a dep; & 'Q' has 'a' as a dep.
#
cat >"${DEP_DEFN_FP}" <<EOF
a b c Q f d e h
b c f
d z
Q a
f e
z e
c e
e
h
i
EOF
tsort "${DEP_DEFN_FP}"
a
e
f
b
z
h
d
c
i
Q
$
Ie, no error/warning given by tsort.
Whereas make gives e.g.:
$
sed -rue 's/^([^[:blank:]]+)(.*)$/\1:\2\n\t@echo \$@\n/' "${DEP_DEFN_FP}"
>"${MKF_FP}" ;
{
while read tgt spng ; do
make -f "${MKF_FP}" "${tgt}" ;
done <<<"$(
sed -rue 's/^([^[:blank:]]+).*$/\1/' "${DEP_DEFN_FP}" ;
)" ;
} >/dev/null ;
make: Circular Q <- a dependency dropped.
make: Circular a <- Q dependency dropped.
$
So, there are cases where 'tsort' "gets it right" while 'make' doesn't;
& vice-versa.
$ # tdyp:
rm -i "${DEP_DEFN_FP}" "${MKF_FP}" ;
unset DEP_DEFN_FP MKF_FP ;
$
akh
--
--
http://lists.linuxfromscratch.org/listinfo/blfs-support
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page