WARNING: Way of disabling --as-needed in spec changed from:
 %define no_build_with_as_needed 1
to more generic one:
 %define filterout_ld -Wl,--as-needed

but, DON'T USE IT ! Fix spec instead.
Why ? Because it's very stupid. If something fails to build normally
it's a sign --as-needed did well it's job and disabled unneeded
libraries.

Here goes a little example, xmoto:

With -Wl,--as-needed enabled it stops on something like this:

==========================================================================
x86_64-pld-linux-g++ -DNOMMGR -Wall -DGAMEDATADIR=\"/usr/share/xmoto\"  
-mfpmath=sse -ggdb -O2 -ftree-vectorize -ftree-vectorizer-verbose=1 
-march=athlon64 -mmmx -msse -msse2 -m3dnow  -s -Wl,--as-needed -Wl,-s  -o 
xmoto-edit  BuiltInFont.o Image.o LevelSrc.o VApp.o VBezier.o VDraw.o 
VDrawText.o VFileIO.o VMath.o VTexture.o VXml.o tim.o tim_io_stdio.o tim_jpeg.o 
tim_memory_crt.o tim_png.o tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o 
md5.o md5file.o FileCompression.o SwapEndian.o DBuffer.o CRCHash.o Theme.o 
WWW.o Editor.o EditorMain.o EditorData.o EditorLog.o Packager.o -lGL -lcurl 
-lode -llualib50 -llua50 -lSDL_mixer -lbz2 -lz -lpng -ljpeg
VApp.o: In function `vapp::App::getRealTime()':
src/VApp.cpp:287: undefined reference to `SDL_GetTicks'
VApp.o: In function `vapp::App::getTime()':
src/VApp.cpp:284: undefined reference to `SDL_GetTicks'
[... bunch of SDL functions ...]
Editor.o: In function `vapp::EditorApp::viewDrawGrid()':
src/Editor.cpp:777: undefined reference to `SDL_GetMouseState'
Editor.o:src/Editor.cpp:46: more undefined references to `SDL_GetMouseState' 
follow
EditorMain.o: In function `main':
src/EditorMain.cpp:59: undefined reference to `SDL_Quit'
collect2: ld returned 1 exit status
make[1]: *** [xmoto-edit] Error 1
==========================================================================


So let's try to find some of missing symbols:

[EMAIL PROTECTED] SPECS]$ grep SDL_GetMouseState /usr/lib64/libSDL*
Binary file /usr/lib64/libSDL-1.2.so.0 matches
Binary file /usr/lib64/libSDL-1.2.so.0.11.0 matches
Binary file /usr/lib64/libSDL.so matches

they are in -lSDL, but binary does not link with -lSDL;
edit Makefile by hand and add -lSDL at the same place as -lSDL_mixer is:
LIBS = -lcurl -lode -llualib50 -llua50 -lSDL_mixer -lSDL -lbz2 -lz -lpng -ljpeg

What we get after running make in build tree:

==========================================================================
x86_64-pld-linux-g++ -DNOMMGR -Wall -DGAMEDATADIR=\"/usr/share/xmoto\"  
-mfpmath=sse -ggdb -O2 -ftree-vectorize -ftree-vectorizer-verbose=1 
-march=athlon64 -mmmx -msse -msse2 -m3dnow  -s -Wl,--as-needed -Wl,-s  -o 
xmoto-edit  BuiltInFont.o Image.o LevelSrc.o VApp.o VBezier.o VDraw.o 
VDrawText.o VFileIO.o VMath.o VTexture.o VXml.o tim.o tim_io_stdio.o tim_jpeg.o 
tim_memory_crt.o tim_png.o tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o 
md5.o md5file.o FileCompression.o SwapEndian.o DBuffer.o CRCHash.o Theme.o 
WWW.o Editor.o EditorMain.o EditorData.o EditorLog.o Packager.o  -lcurl -lode 
-llualib50 -llua50 -lSDL_mixer -lSDL -lbz2 -lz -lpng -ljpeg 
VApp.o: In function `vapp::App::grabScreen()':
src/VApp.cpp:667: undefined reference to `glReadBuffer'
src/VApp.cpp:671: undefined reference to `glReadPixels'
[...]
src/Editor.cpp:1280: undefined reference to `glEnable'
src/Editor.cpp:1288: undefined reference to `glDisable'
collect2: ld returned 1 exit status
==========================================================================

Same thing:

[EMAIL PROTECTED] xmoto-0.2.0]$ grep glEnableClientState /usr/lib64/lib*
Binary file /usr/lib64/libGL.so matches
Binary file /usr/lib64/libGL.so.1 matches
Binary file /usr/lib64/libGL.so.1.2 matches

LIBS = -lcurl -lode -llualib50 -llua50 -lSDL_mixer -lSDL -lGL -lbz2 -lz -lpng 
-ljpeg

But take a look at spec file, -lGL thing was fixed there already:

%{__make} \
        GL_LIBS="-lGL"

Anyway, lets run make, and what we get ?

==========================================================================
x86_64-pld-linux-g++ -DNOMMGR -Wall -DGAMEDATADIR=\"/usr/share/xmoto\"  
-mfpmath=sse -ggdb -O2 -ftree-vectorize -ftree-vectorizer-verbose=1 
-march=athlon64 -mmmx -msse -msse2 -m3dnow  -s -Wl,--as-needed -Wl,-s  -o 
xmoto-edit  BuiltInFont.o Image.o LevelSrc.o VApp.o VBezier.o VDraw.o 
VDrawText.o VFileIO.o VMath.o VTexture.o VXml.o tim.o tim_io_stdio.o tim_jpeg.o 
tim_memory_crt.o tim_png.o tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o 
md5.o md5file.o FileCompression.o SwapEndian.o DBuffer.o CRCHash.o Theme.o 
WWW.o Editor.o EditorMain.o EditorData.o EditorLog.o Packager.o  -lcurl -lode 
-llualib50 -llua50 -lSDL_mixer -lSDL -lGL -lbz2 -lz -lpng -ljpeg 
make[1]: Leaving directory `/home/users/sparky/rpm/BUILD/xmoto-0.2.0'
==========================================================================

It worked !


But why was it working without --as-needed ?
Answer is realy easy: libSDL is required by SDL_mixer:

[EMAIL PROTECTED] xmoto-0.2.0]$ ldd /usr/lib64/libSDL_mixer-1.2.so.0.2.4 | grep 
SDL
        libSDL-1.2.so.0 => /usr/lib64/libSDL-1.2.so.0 (0x00002ab425307000)

but xmoto-edit contains no SDL_mixer symbols, that's why xmoto-edit
wasn't linked with SDL_mixer, and nothing provided SDL library


Can you see now why was it so stupid to disable --as-needed ? It worked
just perfectly !



Finally, fix for this may be:
%configure \
        LIBS="-lSDL -lGL"

or patching configure.in
and the result is:

Wrote: /home/users/sparky/rpm/RPMS/xmoto-0.2.0-2.x86_64.rpm

I hope this little example will help you.

-- 
 ____  Sparky{PI] -- Przemyslaw _  ___  _  _  ........... LANG...Pl..Ca..Es..En
/____) ___  ___  _ _ || Iskra  |  | _ \| |  | : WWW........ppcrcd.pld-linux.org
\____\| -_)'___| ||^'||//\\// <   |  _/| |  | : JID......sparky<at>jabberes.org
(____/||   (_-_|_||  ||\\ ||   |_ |_|  |_| _| : Mail....sparky<at>pld-linux.org
_______________________________________________
pld-devel-en mailing list
pld-devel-en@lists.pld-linux.org
http://lists.pld-linux.org/mailman/listinfo/pld-devel-en

Reply via email to