2010/3/22 Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
On 01.03.2010 16:34, Carl-Daniel Hailfinger wrote:
> On 28.02.2010 16:30, Idwer Vollering wrote:
>
>> 2010/2/26 Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
>>
>>
>>> Idwer reported problems with the current libpci check on
>>>
>>> FreeBSD 8.0-RELEASE i386
>>>
>>> This is caused by a strict linker. Parsing linker error messages is an
>>> exercise in futility, so I implemented fallback library detection with
>>> $CC --print-file-name.
>>> This fallback will fail on llvm-clang (llvm bug 5137), but such machines
>>> hopefully have a more permissive linker and will never hit that code path.
>>> The fallback will also fail on NetBSD where we should look for
>>> libpciutils instead, but that hopefully doesn't have a strict linker
>>> either.
>>>
>>> Side note: The configure checks in the Makefile are now so unwieldy that
>>> a separate configure script will definitely improve readability.
>>>
>>> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
>>>
>>>
>>>
>> $ gmake
>> Checking for a C compiler... found.
>> Checking for libpci headers... found.
>> Checking for libpci (method 1)... not found.
>> Checking for dynamic libpci (method 2)... not found.
>> not found.
>>
>> Please install libpci (package pciutils).
>> See README for more information.
>>
>> unavailable.
>>
>> Please install libpci (package pciutils).
>> See README for more information.
>>
>>
>
> Ouch. Turns out the patch had one error message too many, a missing
> semicolon and missing LDFLAGS in some CC calls.
> New version
> .
> Idwer reported problems with the current libpci check on
> FreeBSD 8.0-RELEASE i386
> This is caused by a strict linker. Parsing linker error messages is an
> exercise in futility, so I implemented fallback library detection with
> $CC --print-file-name.
> This fallback may cause false positives/negatives on llvm-clang (llvm
> bug 5137), but such machines hopefully have a more permissive linker and
> will never hit that code path.
> The fallback will be unreliable on NetBSD where we should look for
> libpciutils instead, but that hopefully doesn't have a strict linker
> either. A fix is easy (replace libpci with PCI_LIB_NAME), but outside
> the scope of this patch.
> Tested with error injection at various levels.

Turns out that --print-file-name is totally useless for libraries
outside the standard hardcoded builtin gcc search path. Oh well. Back to
some really simple code which should even work. Nice benefit is that we
use the correct libpci on NetBSD for the check.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>

Acked-by: Idwer Vollering <vidwer@gmail.com>

Index: flashrom-libpci_robust_detection/Makefile
===================================================================
--- flashrom-libpci_robust_detection/Makefile   (Revision 964)
+++ flashrom-libpci_robust_detection/Makefile   (Arbeitskopie)
@@ -279,26 +279,17 @@
               echo "Please install libpci headers (package pciutils-devel)."; \
               echo "See README for more information."; echo;                  \
               rm -f .test.c .test.o; exit 1)
-       @printf "Checking for libpci... "
-       @$(shell ( echo "#include <pci/pci.h>";            \
-                  echo "int main(int argc, char **argv)"; \
-                  echo "{ return 0; }"; ) > .test1.c )
-       @$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .test1.c -o .test1 -lpci $(LIBS) >/dev/null 2>&1 &&     \
-               echo "found." || ( echo "not found."; echo;                             \
-               echo "Please install libpci (package pciutils).";                       \
-               echo "See README for more information."; echo;                          \
-               rm -f .test1.c .test1; exit 1)
-       @printf "Checking if libpci is sufficient... "
+       @printf "Checking if libpci is present and sufficient... "
       @printf "" > .libdeps
-       @$(CC) $(LDFLAGS) .test.o -o .test -lpci $(LIBS) >/dev/null 2>&1 &&                             \
+       @$(CC) $(LDFLAGS) .test.o -o .test $(LIBS) >/dev/null 2>&1 &&                           \
               echo "yes." || ( echo "no.";                                                    \
-               printf "Checking if libz is present and supplies all needed symbols...";        \
-               $(CC) $(LDFLAGS) .test.o -o .test -lpci -lz $(LIBS) >/dev/null 2>&1 &&          \
+               printf "Checking if libz+libpci are present and sufficient..."; \
+               $(CC) $(LDFLAGS) .test.o -o .test $(LIBS) -lz >/dev/null 2>&1 &&                \
               ( echo "yes."; echo "NEEDLIBZ := yes" > .libdeps ) || ( echo "no."; echo;       \
-               echo "Please install libz.";                    \
+               echo "Please install libpci (package pciutils) and/or libz.";                   \
               echo "See README for more information."; echo;                          \
               rm -f .test.c .test.o .test; exit 1) )
-       @rm -f .test.c .test.o .test .test1.c .test1
+       @rm -f .test.c .test.o .test
 else
 pciutils: compiler
       @printf "" > .libdeps


--
"I do consider assignment statements and pointer variables to be among
computer science's most valuable treasures."
-- Donald E. Knuth