mercredi 19 octobre 2011

compilations pour Solaris



Petit détour par des essais d'optimisation en -O5 ou mieux -fast, en 64 bits sur solaris x86 et sparc,
eh ben devinez quoi, ya un petit problème, juste tout petit sur un seul fichier "sqlite3.c"
j'ai pas cherché d'où ça vient
cc -fast -m64 marche pas ya que -m64 ou -m64 -xO5 (cc -fast -xdryrun pour voir le détail)

php-5.3.8/ext/sqlite3/libsqlite/sqlite3.c
assertion failed in function lf_peep_node() @ lf_peep_x86.c:7752
assert(!is_64bit_true_const(topnd2))
cc: ube failed for /appli/tst/php-5.3.8/ext/sqlite3/libsqlite/sqlite3.c


Curieusement, les problèmes sont ls même avec sparc et avec i386.

Pas facile de compiler avec le cc.
surtout qu'on a besoin de libstdc++,


alors je recompile gcc
le makefile est un peu faux (???)
http://readlist.com/lists/gcc.gnu.org/gcc-help/1/5445.html
gcc a besoin d'être compilé avec gnu as
http://gcc.gnu.org/ml/gcc-help/2007-10/msg00167.html
trop compliqué. je récupère un libstdc++ et je continue.

dans libmcrypt sur Solaris SunOS il faut remplacer le libtool fourni par le libtool standard, surtout si on ne compile pas avec gcc mais avec cc

Ah, encore des surprises :
- pour bzip il faut virer "-Wl,-soname -Wl,libbz2.so.1.0" et "-Wall -Winline" des Makefile*

for i in configure configure.in;do cp -p $i a;
sed -e 's/VERSION_SCRIPT_FLAGS *=[ "]*-Wl,-M -Wl,[ "]*/VERSION_SCRIPT_FLAGS=""/'
a > $i;
done;
autoreconf --force;autoconf;


- pour mhash il faut définir __const=const (à cause de cc qu'est pas gcc)
  cp -p configure a;sed -e 's/DEFS=-DHAVE_CONFIG_H/DEFS="-D__const=const -DHAVE_CONFIG_H"/' a > configure
- pour libmcrypt libxml2 libxslt il faut des autoconf+libtool à jour, qui remplacent le libtool local
  rm libtool;ln -s $(which libtool) .


- pour xmlrpc, ../libtool: syntax error at line 685: `func_arith_result=$' unexpected
parce que chez Solaris, sh n'est pas ksh ni bash ; sh est resté figé dans le passé,
comme de nombreux outils solaris. les nouveaux outils à jour compatibles sont rangés
dans /usr/xpg4/ ou xpg6 (une idée de xavier-pierre-gérard ?)
à partir de ce choix, solaris est devenu un OS rétrograde anti-progressiste

for i in $(grep -l /bin/sh * */*);do cp -p $i a;sed -e 's:/bin/sh:/bin/ksh:g' a > $i;done;

-toujours xmlrpc,
Undefined symbol      first referenced in file
find_named_value      ../src/.libs/libxmlrpc-epi.so
describe_method       ../src/.libs/libxmlrpc-epi.so
http://www.mail-archive.com/php-bugs@lists.php.net/msg76346.html
je traduis "there is no external definition. See C99 specification section 6.7.4. "

il faut rajouter dans src/xmlrpc_introspection.h
XMLRPC_VALUE find_named_value(XMLRPC_VALUE list, const char* needle);
void describe_method(XMLRPC_SERVER server, XMLRPC_VALUE vector, const char* method);


Il faut aussi rajouter la lib iconv

sed -e 's/-lexpat/-lexpat -liconv/' Makefile>a;mv a Makefile;\
sed -e 's/-lexpat/-lexpat -liconv/' src/Makefile>a;mv a src/Makefile;\
sed -e 's/-lexpat/-lexpat -liconv/' sample/Makefile>a;mv a sample/Makefile;\
et ça compile



-icu a un script sh pour se configurer, icu-config --version
  ..mais Solaris a un portage de echo très ancien, echo -n 1 2 3 affiche -n 1 2 3 
   pour éviter donc que icu-config --version affiche -n 4.2.1
   sed -e 's/ECHO_N="-n"/ECHO_N=""/' -i icu-config;

il me manque des libs, de /usr/lib, j'ajoute -lCrun -lCstd -liostream au ldflags sinon 
__1c2K6Fpv_v_ __1c2N6FI_pv_ __1c2k6Fpv_v_ __1cDstdFqsort6FpvIIpFpkv3_i_v_ __1cDstdJbasic_ios4Ccn0ALchar_traits4Cc___Deof6kM_b_ __1cDstdJbasic_ios4Ccn0ALchar_traits4Cc___Efail6kM_b_ __1cDstdJbasic_ios4Ccn0ALchar_traits4Cc___Fclear6Mi_v_ __1cDstdLchar_traits4Cc_Deof6F_i_ __1cDstdNbasic_istream4Ccn0ALchar_traits4Cc___Dget6M_i_ __1cDstdNbasic_istream4Ccn0ALchar_traits4Cc___Hputback6Mc_r1_ __1cDstdNbasic_ostream4Ccn0ALchar_traits4Cc___Fwrite6Mpkcl_r1_ __1cG__CrunKpure_error6F_v_ __1cG__CrunKvector_con6FpvIIpF1_vp2_v_ __1cG__CrunKvector_del6FpvIpF1_v_1_ __1cG__CrunKvector_des6FpvIIpF1_v_v_ __1cG__CrunKvector_new6FpvIIpF1_vp2_1_  __1cG__CrunMex_rethrow_q6F_v_ __1cG__CrunNvector_assign6Fpv1IIpF11_1_v_ __1cG__CrunRex_chk_unexpected6F_v_
ne sont pas définis..
mmm... fausse piste : il faut mettre dans le bon ordre les répertoires de librairie, y compris dans LDFLAG
#path et libs : sys(dernier)-appli(premier)
for GSCRIPTDIR in \
/lib \
/usr/lib \
/usr/sfw \
/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0 \
$GSCRIPT_MYSQL $GSCRIPT_SSLDIR $GSCRIPT_OPENLDAPDIR\
$GSCRIPT_MOTEUR $GSCRIPT_SYSTEM $GSCRIPT_LIBDIR \
;do
if [ -d "$GSCRIPTDIR" ];then 
if [ -d "$GSCRIPTDIR/bin" ];then 
export PATH=$GSCRIPTDIR/bin:$PATH
fi
if [ -d "$GSCRIPTDIR/lib" ];then 
export LD_LIBRARY_PATH=$GSCRIPTDIR/lib:$LD_LIBRARY_PATH
export LDFLAGS="-L$GSCRIPTDIR/lib $LDFLAGS"
else
export LD_LIBRARY_PATH=$GSCRIPTDIR:$LD_LIBRARY_PATH
export LDFLAGS="-L$GSCRIPTDIR $LDFLAGS"
fi
if [ -d "$GSCRIPTDIR/include" ];then 
export CPPFLAGS="-I$GSCRIPTDIR/include $CPPFLAGS"
fi
fi
done
export LD_RUN_PATH=$LD_LIBRARY_PATH

#unset des flags vides (pb zlib sinon)
for s7ed in LD_LIBRARY_PATH CPPFLAGS CFLAGS LDFLAGS LD_RUN_PATH;do
if [ "$(eval echo \$$s7ed)" == "" ];then unset $s7ed;fi;done


youhou ça compile ! (mais ça a besoin de /usr/sfw/lib/ libstdc++.so.6,libgcc_s.so.1,libexpat.so.0 et libz.so.1 SUNW_1.1 discutable.)

On ajoute une remise à zéro des flag (unset) s'ils sont vide (""), car ça perturbe zlib sur linux, eh ouais :

No shared library support; try without defining CC and CFLAGS

...
make libz.so.1.2.3
gcc -o libz.so.1.2.3 adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'


* et si je compilais glib ? avec le vieux 'cc' :
cc: "mem-overflow.c", line 103: error 1613: Zero-sized struct.
ça passe en modifiant glib/tests/mem-overflow.c
typedef struct { } Empty;
modifié en
typedef struct { int empty; } Empty;
(finalement j'ai pas continué sur glib)


Aucun commentaire: