> 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

Reply via email to