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.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-libpci_robust_detection/Makefile =================================================================== --- flashrom-libpci_robust_detection/Makefile (Revision 919) +++ flashrom-libpci_robust_detection/Makefile (Arbeitskopie) @@ -251,21 +251,28 @@ 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... " + @printf "Checking for libpci (method 1)... " @$(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) + @$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) .test1.c -o .test1 $(LIBS) >/dev/null 2>&1 && \ + echo "found." || ( echo "not found."; \ + $(CC) $(LDFLAGS) --print-file-name=libpci.so >/dev/null 2>&1 && ( \ + printf "Checking for dynamic libpci (method 2)... "; \ + $(CC) $(LDFLAGS) --print-file-name=libpci.so 2>/dev/null | grep -q / && \ + echo "found." || ( echo "not found."; \ + printf "Checking for static libpci (method 2)... "; \ + $(CC) $(LDFLAGS) --print-file-name=libpci.a 2>/dev/null | grep -q / && \ + 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 "" > .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 && \ + $(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 "See README for more information."; echo; \