kohler / click

The Click modular router: fast modular packet processing and analysis
Other
743 stars 321 forks source link

Infinite loop in finding libraries: https://github.com/kohler/click/blob/master/click-buildtool.in#L824 #465

Open fasilz opened 4 years ago

fasilz commented 4 years ago

In Ubuntu bionic, an Element passed its dependencies like so: ELEMENT_LIBS((../lua/libluajit.a -lm -ldl)) && ELEMENT_LIBS(-lpthread), and in elements.conf I see -!lib../lua/libluajit.a;-lm;-ldl & -!lib-lpthread -!lib-lpthread. I see the following (inserting set -x in bin/click-buildtool):

+ libs=../lua/libluajit.a -lm -ldl 
-lpthread 
+ test -n ../lua/libluajit.a -lm -ldl 
-lpthread 
+ echo ../lua/libluajit.a -lm -ldl 
-lpthread 
+ sed s/^\([^ ][^ ]*\) *$/\1 \1/
+ libs=../lua/libluajit.a -lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm -ldl 
-lpthread -lpthread
+ /bin/grep  [^ ].* [^ ]
+ echo ../lua/libluajit.a -lm -ldl 
-lpthread -lpthread
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\\2 /
+ libs=../lua/libluajit.a -lm
-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm
-lm -ldl 
-lpthread -lpthread
+ /bin/grep  [^ ].* [^ ]
+ test -n ../lua/libluajit.a -lm
-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm
-lm -ldl 
-lpthread -lpthread
+ tsort
+ libs=-lpthread
../lua/libluajit.a
-lm
-ldl

and it builds as expected. In Ubuntu focal, the same code has the following output

+ libs=../lua/libluajit.a -lm -ldl 
-lpthread 
+ test -n ../lua/libluajit.a -lm -ldl 
-lpthread 
+ echo ../lua/libluajit.a -lm -ldl 
-lpthread 
+ sed s/^\([^ ][^ ]*\) *$/\1 \1/
+ libs=../lua/libluajit.a -lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm -ldl 
-lpthread -lpthread
+ /usr/local/bin/grep  [^ ].* [^ ]
+ echo ../lua/libluajit.a -lm -ldl 
-lpthread -lpthread
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\2 /
+ libs=../lua/libluajit.a -lm-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm-lm -ldl 
-lpthread -lpthread
+ /usr/local/bin/grep  [^ ].* [^ ]
+ echo ../lua/libluajit.a -lm-lm -ldl 
-lpthread -lpthread
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\2 /
+ libs=../lua/libluajit.a -lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ /usr/local/bin/grep  [^ ].* [^ ]
+ echo ../lua/libluajit.a -lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\2 /
+ libs=../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ /usr/local/bin/grep  [^ ].* [^ ]
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\2 /
+ libs=../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ /usr/local/bin/grep  [^ ].* [^ ]
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\2 /
+ libs=../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ /usr/local/bin/grep  [^ ].* [^ ]
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\2 /
+ libs=../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ /usr/local/bin/grep  [^ ].* [^ ]
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\2 /
+ libs=../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ echo ../lua/libluajit.a -lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm-lm -ldl 
-lpthread -lpthread
+ /usr/local/bin/grep  [^ ].* [^ ]
+ sed / [^ ].* [^ ]/s/^\([^ ][^ ]*\)  *\([^ ][^ ]*\) /\1 \2\2 /
deshmukhrajvardhan commented 4 years ago

I see the same issue We use this to link a library ELEMENT_LIBS((../lua/libluajit.a -lm -ldl))

I've noticed other examples have 2 words seperatred by space, we have 3. And the 2nd words keeps doubling.

fasilz commented 4 years ago

passing each lib separately as ELEMENT_LIBS(../lua/libluajit.a) seems to fix this on focal, but still not sure why it behaves differently from bionic.