compil giac sous Mac OSX

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

Répondre
cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

compil giac sous Mac OSX

Message par cdeval » sam. mai 15, 2010 9:26 pm

J'ai obtenu (pour le moment) la libgiac en statique ; je donne ma méthode qui pourra peut-être intéresser quelqu'un :
j'ai utilisé Mac OSX en 10.5 sous VMWARE.
J'ai installé Xcode à partir du site Apple pour avoir gcc/make
J'ai installé fink qui permet d'installer les librairies standard unix portées sous mac.
J'ai donc installé avec "fink commander" : gmp, gsl, png, etc... sauf pari pour laquelle fink me réclame X11 que je n'ai pas trouvé sous fink. Il semble qu'Apple en fournisse un mais je n'ai pas approfondi ; j'ai fait sans pari.
Ensuite avec les sources giac 0.8.6 :
dans global.cc :
2955 : __isnand -> isnan
2963 : __isinfd -> isinf
dans ./libintl.h:3 j'ai remplacé /usr/local/include par /sw/include
puis dans un terminal :

Code : Tout sélectionner

export CFLAGS=-I/sw/include 
export LDFLAGS=-L/sw/lib 
export CXXFLAGS=$CFLAGS 
export CPPFLAGS=$CXXFLAGS 
export ACLOCAL_FLAGS="-I /sw/share/aclocal"
./configure + make
(là, je vois dans les messages que le mode librairie partagée n'est pas disponible mais je n'ai pas regardé en détail, c'est pour ça que je n'ai que libgiac.a)

je compile examples/demo/pgcd.cc avec :

Code : Tout sélectionner

g++ test.cc -I/sw/include -L/sw/lib -lintl -lgmp -lgsl -lpng /sw/lib/libgiac.a
je produis un a.out qui marche.

Par contre, comme ce programme dépend de librairies dynamiques, je me demande ce qui se passe si le système qui l'exécute n'a pas fink+les librairies gmp, etc...
Si tu as le temps, peux-tu tester ce a.out sur un mac osx ?
Voilà le lien (9,5Mo) : http://cdeval.free.fr/test/a.out

j'ai bien essayé de tout passer en statique (car fink est sympa, il donne les .h et les .a en plus des binaires). Ca passe avec libgmp.a mais pour les autres il y a des symboles non résolues qui viennent d'autres librairies.

A part ça, la machinerie OOo fonctionne au poil, je compile bien ce qui vient du SDK.
A+

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: compil giac sous Mac OSX

Message par parisse » dim. mai 16, 2010 6:29 am

j'ai peur que ça ne marche pas si fink n'est pas installé. Il vaudrait mieux que tu fasses comme moi, compiler sans fink, ce qui marche aussi (j'ai juste un problème avec pari). Je n'ai pas de mac, mais je pourrai te donner des précisions lundi ou mardi sur la méthode que j'ai employée.

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: compil giac sous Mac OSX

Message par cdeval » lun. mai 17, 2010 8:38 pm

je reprends sur le forum,
pour continuer avec fink, je pense avoir compris ce qui se passe.
Il doit s'agir d'un problème de version gcc g++
Quand j'ai installé fink et les librairies standards pour giac, j'ai réussi à compiler libgiac.a uniquement et mon programme pgcd.cc.
Depuis que j'ai mis à jour fink, j'ai des "undefined symbols" et des symbols manquants dans libgiac.a à l'exécution de ranlib.(ex : libgiac.a(pari.o) has no symbols ; idem pour first.o, TmpLESystelSolver.o et TmpFGLM.o)
Idem pour la compil de pgcd.cc qui affiche des symboles non résolus.
Or, j'utilise toujours le gcc 4.01 de Apple alors que fink doit utiliser des librairies compilées avec des versions plus récentes.
Comme j'ai trouvé un gcc 4.2 fourni par Apple dans usr bin, je suis en train de voir si c'est mieux.

Mais, autre problème, la chaine de compilation pour OOo est gcc-4.0.1, je pense que c'est grillé pour les librairies de fink qui seront trop récentes.

J'espère que ta méthode fonctionnera...
(PS : effectivement, un slash dans le message et phpbb plante!)

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: compil giac sous Mac OSX

Message par parisse » mar. mai 18, 2010 8:36 am

J'ai mis sur le serveur ftp dans le repertoire devel 2 fichiers, un shell-script preconfiglocal.osx a modifier et lancer avant d'appeler configure, et une archive config.log.osx.tgz avec les log de configure de diverses librairies, j'espere que ca t'aidera!

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: compil giac sous Mac OSX

Message par cdeval » mar. mai 18, 2010 1:36 pm

bien reçu.
j'ai jeté un oeil en attendant de tester à la maison.
Je ne connaissais pas ce

Code : Tout sélectionner

-isysroot /Developer/SDKs/MacOSX10.4u.sdk 
qui permet d'assurer la compatibilité entre les différentes versions. Je vais le prendre.
J'ai vu aussi les options -arch que je n'utilisais pas et qui devraient me permettre de produire du code non spécifique à mon amd64, sinon, ce n'est pas la peine que je me fatigue.
Si j'ai bien compris ce que tu as fait : tu as d'abord compilé les librairies gmp, etc... qui servent à giac, elles sont placés dans usr.local.lib et ensuite tu compiles giac ?
Je vais essayer ta méthode.
PS : je viens de regarder "compiler gmp sur mac osx" et là : http://gmplib.org/macos.html les développeurs de gmp sont sévères avec les choix Apple et en particulier leur gcc. C'est, me semble-t-il, les problèmes que j'ai eus en essayant de compiler les sources gmp dans fink. En plus ils évoquent des problèmes de symboles non résolus que j'ai eu aussi en compilant giac. Je savais bien que j'aurais des soucis avec mon amd64 !

Je garde quand même la piste fink sous le coude (les librairies sont déjà compilées et j'avais réussi à produire un a.out qui marchait). Je vais en refaire une install propre.

je te tiens au courant....

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: compil giac sous Mac OSX

Message par parisse » mar. mai 18, 2010 1:44 pm

oui, c'est bien ça, j'installe dans /usr/local/lib. Note aussi qu'il faut parfois faire ranlib sur les librairies après install

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: compil giac sous Mac OSX

Message par cdeval » mer. mai 19, 2010 7:46 am

ok,
je suppose que tu as mis le strict nécessaire pour compiler libgiac uniquement ?
Donc, j'essaie de compiler ces librairies et ensuite giac après avoir fait un ranlib sur ces librairies ?

j'ai commencé à jouer avec les options :

Code : Tout sélectionner

-arch i386
passe bien mais :

Code : Tout sélectionner

-arch pcc
ne passe pas. Ca doit être à cause de mon processeur amd64 je pense. J'ai vu que ta compil était faite sur un ppc.

Code : Tout sélectionner

-isysroot /Developer/SDKs/MacOSX10.4u.sdk
passe bien aussi mais en ajoutant

Code : Tout sélectionner

-mmacosx-version-min=10.4
car je suis sous mac osx 10.5

je continue les tests

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: compil giac sous Mac OSX

Message par parisse » mer. mai 19, 2010 7:49 am

pour -arch ppc, je pense aussi que ce n'est pas supporté sur 64 bits (ça permet de faire des universal binary mais probablement en 32 bits seulement).

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: compil giac sous Mac OSX

Message par cdeval » ven. mai 21, 2010 9:48 pm

C'est fait, ça fonctionne dans OOo :D
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:

Code : Tout sélectionner

sudo port install libpng
et tout se compile et s'installe dans
  • /opt/local/lib
et
  • /opt/local/include
.
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
  • /sw/lib
vers
  • /opt/local/lib
, 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 :wink: )

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
  • /sw/lib
et
  • /opt/local/lib
mon extension continue de fonctionner.
A priori, c'est gagné :D
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 :oops:
J'espère que tout ceci pourra servir à d'autres que moi.
A+ et merci encore !

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: compil giac sous Mac OSX

Message par cdeval » ven. mai 21, 2010 10:24 pm

une copie d'écran que je n'ai pas réussi à placer dans le message précédent (qu'est-ce que c'est bogué phpbb !) :
casmac.png
casmac.png (48.8 Kio) Consulté 10141 fois

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: compil giac sous Mac OSX

Message par cdeval » jeu. juin 10, 2010 12:37 pm

C'est fait, c'est confirmé, mon extension fonctionne bien sur un vrai mac-intel (osx 10.6) :D
En plus de mon post précédent j'ai dû aussi jouer avec "install_name_tool -id" sur ma librairie et celles que je fournis (libgmp, libintl, libiconv).
En bref, pour ceux qui voudrait redistribuer un programme compilé utilisant giac sans avoir à installer sur le pc cible ni Xcode ni les librairies utilisées par giac :
0) installer Xcode
1) utiliser macports ou fink pour installer les librairies nécessaires à la compilation de giac (libgmp, libpng, etc...)
2) compiler giac (cf mon post précédent pour les "exports")
3) compiler son programme en linkant avec le maximum de librairies statiques (macports et fink fournissent les ".a"). Cependant, je n'ai pas réussi à linker libintl.a. Pas grave, il suffit de fournir libintl.dylib et libiconv.dylib (appelée par libintl) dans le même répertoire que l'exécutable après les avoir patchés :

Code : Tout sélectionner

install_name_tool -id @loader_path/libintl.8.dylib libintl.8.dylib
install_name_tool -change /sw/lib/libiconv.2.dylib @loader_path/libiconv.2.dylib libintl.8.dylib
et

Code : Tout sélectionner

install_name_tool -id @loader_path/libiconv.2.dylib libiconv.2.dylib
et voilà.

Répondre