C'est fait, ça fonctionne dans OOo
Voilà le chemin que j'ai suivi pour en arriver là :
J'ai donc essayé de compiler par moi même les librairies nécessaires à libgiac.
Comme je ne voulais pas trop me casser la tête, j'ai retenté le coup avec macports qui fournit les principales librairies freebsd directement patchées pour être compilées sur mac osx (le gcc-apple n'a pas un comportement toujours très standard... Microsoft/Apple même combat !)
Une fois macports installé, c'était du gâteau, par exemple:
et tout se compile et s'installe dans
et
.
J'ai simplement eu un problème à cause de mon AMD64 : libgmp ne veut pas se compiler, que ce soit avec fink, macports ou directement à partir du source gmp. Par conséquent je n'avais pas libmpfr non plus.
Je suppose que sur un vrai mac, cela ne poserait pas de problème.
J'ai donc utilisé fink et téléchargé les binaires libgmp et libmpfr que j'ai déplacées de
vers
, ainsi que les headers.
Ensuite, avant de compiler giac j'ai :
Code : Tout sélectionner
export CFLAGS='-O2 -arch i386 -I/opt/local/include -L/opt/local/lib -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4'
export CXXFLAGS=$CFLAGS
export MACOSX_DEPLOYMENT_TARGET='10.5'
export CC='/usr/bin/gcc4.0'
export CXX='/usr/bin/g++4.0'
(avant les deux "4.0" il y a un signe - qui fait planter phpbb. Je les ai supprimé aussi dans les autres lignes de code dans la suite du message).
ensuite : configure, make
(mon amd64 interdit "-arch ppc" ; mon extension ne fonctionnera donc que sur intel pour le moment)
Tout va bien jusqu'à la création de icas :
Code : Tout sélectionner
/bin/sh ../libtool --mode=link /usr/bin/g++4.0 -O2 -arch i386 -I/opt/local/include -L/opt/local/lib -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 -o icas -L../src/.libs icas.o -lxcas -lgiac -lgmp -lmpfr -lpthread -ljpeg -lpng -lz -lgsl -lgslcblas -lreadline -lncurses -ldl -lm -lgmp
/usr/bin/g++4.0 -O2 -arch i386 -I/opt/local/include -L/opt/local/lib -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 -o icas -L../src/.libs icas.o -lxcas -lgiac -lgmp -lmpfr -lpthread -ljpeg -lpng -lz -lgsl -lgslcblas -lreadline -lncurses -ldl -lm -lgmp
Undefined symbols:
"_libintl_gettext", referenced from:
giac::check_local_assign(giac::gen const&, giac::context const*)in libgiac.a(prog.o)
giac::check_local_assign(giac::gen const&, giac::context const*)in libgiac.a(prog.o)
giac::check_local_assign(giac::gen const&, giac::context const*)in libgiac.a(prog.o)
giac::check_local_assign(giac::gen const&, giac::context const*)in libgiac.a(prog.o)
giac::check_local_assign(giac::gen const&, giac::context const*)in libgiac.a(prog.o)
giac::check_local_assign(giac::gen const&, giac::context const*)in libgiac.a(prog.o)
giac::symb_program_sto(giac::gen const&, giac::gen const&, giac::gen const&, giac::gen const&, bool, giac::context const*)in libgiac.a(prog.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[2]: *** [icas] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all-recursive-am] Error 2
j'ai réglé ce problème en ajoutant "-lintl" à l'édition des liens et c'est passé.
J'ai obtenu un icas opérationnel.
Ensuite je me suis attaqué au programme pgcd.cc que tu fournis dans les exemples. J'ai essayé de le rendre le plus statique possible. Je n'ai pas réussi avec libintl, je pense que c'est parce qu'elle fait appel à des librairies internes au système mac osx (CoreFoundation) :
Code : Tout sélectionner
Xelabos-Mac-Pro:MacOSX_x86 MacAdmin$ otool -L libintl.8.dylib
libintl.8.dylib:
/opt/local/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.0.0)
/opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.1)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.15.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
voilà donc la compil de pgcd.cc :
Code : Tout sélectionner
Xelabos-Mac-Pro:demo MacAdmin$ g++ pgcd.cc -I/opt/local/include -L/opt/local/lib -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 /sw/lib/libgmp.a /sw/lib/libmpfr.a /opt/local/lib/libgsl.a /opt/local/lib/libgslcblas.a /opt/local/lib/libpng12.a /opt/local/lib/libjpeg.a /opt/local/lib/libz.a /opt/local/lib/libncurses.a -lintl ../../src/.libs/libgiac.a
Xelabos-Mac-Pro:demo MacAdmin$ ./a.out
Tapez une fonction a integrer et une variable sin(x)
x
La primitive est -(cos(x))
(je te suggère de changer le nom de ce programme de test
)
Ensuite OOo : j'ai modifié mon makefile pour tenir compte de ces librairies statiques mais j'avais le problème des quelques librairies dynamiques à régler (entre temps, libgmp.a n'a pas voulu non plus passer en statique dans la compil OOo, je n'ai pas trop cherché à savoir pourquoi).
J'ai obtenu ma librairie CmathOOoCAS.uno.dylib et je me suis dit que j'allais faire comme avec linux : mettre les librairies gmp, intl et iconv dans mon extension à côté de ma librairie. Pas de chance, mac osx n'est pas linux et les chemins de ces trois librairies étaient inscrits en dur dans ma librairie :
Code : Tout sélectionner
Xelabos-Mac-Pro:MacOSX_x86 MacAdmin$ otool -L CmathOOoCAS.uno.dylib
CmathOOoCAS.uno.dylib:
/Users/MacAdmin/OOoSDK/MACOSXexample.out/lib/CmathOOoCAS.uno.dylib (compatibility version 0.0.0, current version 0.0.0)
@executable_path/urelibs/libuno_cppuhelpergcc3.dylib.3 (compatibility version 0.0.0, current version 0.0.0)
/sw/lib/libgmp.3.dylib (compatibility version 8.0.0, current version 8.2.0)
/opt/local/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.0.0)
@executable_path/urelibs/libuno_cppu.dylib.3 (compatibility version 0.0.0, current version 0.0.0)
@executable_path/urelibs/libuno_sal.dylib.3 (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.10)
heureusement, j'ai trouvé l'instruction qui va bien :
Code : Tout sélectionner
install_name_tool -change /sw/lib/libgmp.3.dylib @loader_path/libgmp.3.dylib CmathOOoCAS.uno.dylib
idem pour libintl et libiconv contenue dans libintl.
Ainsi, en ajoutant ces trois librairies dynamiques dans mon extension, elles sont chargées par ma librairie et il n'est donc pas nécessaire d'installer quoique ce soit sur le mac osx : ni xcode, ni macports.
Mes tests sont concluants : en déplaçant
et
mon extension continue de fonctionner.
A priori, c'est gagné
Maintenant il reste à voir si ça fonctionne effectivement sur un vrai mac.
Je vais mettre à jour mon extension et essayer de trouver des utilisateurs de mac-intel (je crois que le tien est un ppc, pas de chance).
Bon il était temps que j'aboutisse... pour le bien être familial
J'espère que tout ceci pourra servir à d'autres que moi.
A+ et merci encore !