Esta semana tocó realizar una compilación de Percona Server para RedHat. Hay ocasiones en las que es necesarios realizar una compilación local, ya bien sea por rendimiento, ya bien por que el cliente quiera que todos los paquetes sean locales y no vengan precompilados de otro lado.
Por suerte, Percona ofrece para descarga directa la
última versión disponible en formato src.rpm, por lo que tras instalar todas las dependencias se podría realizar sin problema un
rpmbuild --rebuild. La sorpresa fue que la compilación no es tan sencilla, ya que había varios fallos.
El primero de los fallos ocurrió al compilar el HandlerSocket-Plugin-for-MySQL. RedHat trae por defecto la versión 5.1 de MySQL y cuando el HandlerSocket requería las librerías, estas no servían y por ello fallaba. Para solucionarlo, bastó con desinstalar todas las librerías de MySQL del sistema y que para la compilación cogiera las que él mismo estaba compilando. Con esto, HandlerSocket ya compiló perfectamente.
El error al que se hace referencia es el que sigue.
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I.. -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/sql -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/include -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/regex -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0 -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1 -DDBUG_OFF -I../libhsclient -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -felide-constructors -fno-exceptions -fno-rtti -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/release/include -Wall -g -fno-rtti -fno-exceptions -fPIC -DPIC -MT handlersocket_la-database.lo -MD -MP -MF .deps/handlersocket_la-database.Tpo -c database.cpp -fPIC -DPIC -o .libs/handlersocket_la-database.o
In file included from database.cpp:16:
mysql_incl.hpp:43:24: error: mysql_priv.h: No such file or directory
database.cpp:99: error: ISO C++ forbids declaration of 'TABLE' with no type
database.cpp:99: error: expected ';' before '*' token
database.cpp: In constructor 'dena::tablevec_entry::tablevec_entry()':
database.cpp:102: error: class 'dena::tablevec_entry' does not have any field named 'table'
database.cpp: At global scope:
database.cpp:106: error: expected ')' before '*' token
database.cpp:124: error: 'Item_string' does not name a type
database.cpp:125: error: 'Item_int' does not name a type
database.cpp:126: error: 'Item_func_get_lock' does not name a type
database.cpp:127: error: 'Item_func_release_lock' does not name a type
database.cpp: In member function 'long long int dena::expr_user_lock::get_lock()':
database.cpp:118: error: 'lck_func_get_lock' was not declared in this scope
database.cpp: In member function 'long long int dena::expr_user_lock::release_lock()':
database.cpp:121: error: 'lck_func_release_lock' was not declared in this scope
database.cpp: At global scope:
database.cpp:150: error: 'TABLE' has not been declared
database.cpp:157: error: 'ha_rkey_function' has not been declared
database.cpp:158: error: 'TABLE' has not been declared
database.cpp:160: error: 'TABLE' has not been declared
database.cpp:161: error: 'uchar' has not been declared
database.cpp:162: error: 'TABLE' has not been declared
database.cpp:163: error: ISO C++ forbids declaration of 'uchar' with no type
database.cpp:163: error: expected ',' or '...' before '*' token
database.cpp:164: error: 'TABLE' has not been declared
database.cpp:165: error: 'TABLE' has not been declared
database.cpp:166: error: 'TABLE' has not been declared
database.cpp:176: error: ISO C++ forbids declaration of 'THD' with no type
database.cpp:176: error: expected ';' before '*' token
database.cpp:177: error: ISO C++ forbids declaration of 'MYSQL_LOCK' with no type
database.cpp:177: error: expected ';' before '*' token
database.cpp: In constructor 'dena::dbcontext::dbcontext(volatile dena::database*, bool)':
database.cpp:222: error: class 'dena::dbcontext' does not have any field named 'thd'
database.cpp:222: error: class 'dena::dbcontext' does not have any field named 'lock'
database.cpp: At global scope:
database.cpp:237: error: 'THD' was not declared in this scope
database.cpp:237: error: 'thd' was not declared in this scope
database.cpp:237: error: expected primary-expression before 'volatile'
database.cpp:237: error: initializer expression list treated as compound expression
database.cpp:238: error: expected ',' or ';' before '{' token
database.cpp:1182: error: expected '}' at end of input
database.cpp:1182: error: expected '}' at end of input
database.cpp:237: warning: 'dena::::wait_server_to_start' defined but not used
make[2]: *** [handlersocket_la-database.lo] Error 1
make[2]: Leaving directory `/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/storage/HandlerSocket-Plugin-for-MySQL/handlersocket'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/storage/HandlerSocket-Plugin-for-MySQL'
make: *** [all] Error 2
error: Bad exit status from /var/tmp/rpm-tmp.fEHBlk (%build)
Una vez solucionado este problema, parece que ya todo estaba solucionado, por lo tanto intentamos nuevamente compilar Percona-Server.
shell> rpmbuild -ba \
--clean \
--with yassl --target x86_64 \
--define "gotrevision 1" \
percona-server-5.5.19.spec
Con esto, obtenemos un nuevo error, por ser un sistema de 64 Bit's.
Processing files: Percona-Server-devel-55-5.5.17-rel22.1.1.rhel6.x86_64
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/include/handlersocket
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient_r.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlservices.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libhsclient.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/libhsclient.la
RPM build errors:
File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/include/handlersocket
File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient.a
File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient_r.a
File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlservices.a
File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libhsclient.a
File not found: ~rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/libhsclient.la
Para solucionarlo, añadimos más parámetros al rpmbuild, tal como sigue y la compilación ya es satisfactoria.
shell> rpmbuild -ba \
--clean \
--with yassl \
--target x86_64 \
--define "redhat_version 15" \
--define "gotrevision 1" \
--define "_libdir /usr/lib" \
percona-server-5.5.19.spec
Leer más