I just had a thought on all the hurdles we're going through on trying
to guess the proper default libraries for a given platform.
This may be totally wrong, but here goes:

Within Makefile.PL we're already test-compiling a C++ program to
detect whether headers should have a .h extension or not.  Why not
test-compile another C++ program that we know to be portable, using
the -v flag.  We could capture the verbose output using backticks, and
parse it looking for the pattern m/\s(-l\w+)\b/g, which should tell us
all the -lxxxxx libraries that are automatically linked by the
compiler/linker under normal conditions.

For example, on my Ubuntu linux system using g++ version 4.6.1, the
verbose output of a full build produces a line that looks like this:

COLLECT_GCC_OPTIONS='-Wall' '-v' '-o' 'mytest' '-shared-libgcc'
'-mtune=generic' '-march=i686'

and a final line that looks like this:

 /usr/lib/gcc/i686-linux-gnu/4.6.1/collect2 --build-id --no-add-needed
--as-needed --eh-frame-hdr -m elf_i386 --hash-style=gnu
-dynamic-linker /lib/ld-linux.so.2 -z relro -o mytest
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crt1.o
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crti.o
/usr/lib/gcc/i686-linux-gnu/4.6.1/crtbegin.o
-L/usr/lib/gcc/i686-linux-gnu/4.6.1
-L/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu
-L/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib
-L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu
-L/usr/lib/../lib -L/usr/lib/gcc/i686-linux-gnu/4.6.1/../../..
/tmp/ccBPbWmX.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/lib/gcc/i686-linux-gnu/4.6.1/crtend.o
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crtn.o

...which I think is an expansion of the linking stage.

I see in that final line that the '-shared-libgcc' flag must expand to include:

-lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s (again?) -lgcc (again?)

If Makefile.PL parsed that last line using a hash to remove
duplicates, I would end up with:

-lstdc++
-lm
-lgcc_s
-lgcc
-lc

I could then specify those specific default libraries in Makefile.PL,
and should get a clean build on my system.

I'm not sure if this technique would be portable across other flavors
of compilers though.  But if it is, it seems like a good way to get
rid of a lot of a big if(){} elsif(){} elsif(){} chain.

Dave

-- 

David Oswald
daosw...@gmail.com

Reply via email to