Compilar Harbour en Centos 6.2
Después de mas de un año de no trabajar en Harbour y de haberlo dejado listo en Ubuntu y mandriva 2010,
se me presentó la necesidad de actualizarlo , no ya para operar desdede una USB, sino desde un servidor en la nube, con el famoso cuente de la publicidad de Harbour "hacer una vez y compilar en cualquier parte", pues no señor el escenario cambio y aqui estoy tratando de poner a funcionar el sistema que tenia operando ya.
escenario actual:
1. Linux Centos 6.2
2. 64 bit
3. Version 3.0 de Harbour
4. Version 4.6 de Qt
Lo primero con que me encontré fue con que no habia un versión pre-compilada de Harbour para Centos y menos de la versión 3.0, pero si habia los fuentes para compilar, procedía descargarlos en el directorio Harbour que ya había creado para este propósito desde el sitio (http://hivelocity.dl.sourceforge.net/project/harbour-project/source/3.0.0/harbour-3.0.0.tar.gz)
un simple tar zxvfPp harbour-3.0.0.tar.gz
y ya está descomprimido, luego a leeer el INSTALL, siempre hay que leerlo, no trae nada nuevo un simple make install , y todo debería funcionar sobre ruedas
Descargué qt-4.6.2-20.el6.x86_64.rpm(http://mirror.centos.org/centos/6/os/x86_64/Packages/qt-4.6.2-20.el6.x86_64.rpm) y sencillo rpm -ivh qt-4.6.2-20.el6.x86_64.rpm , instaló sin ningún problema las librerías Qt en mi Centos 6.2.
Procedi a darle el make install y después de unos momentos me mostró un error:
mCAbout.cpp:15:34: error: private/qucomextra_p.h: No such file or directory
mCAbout.cpp:17:2: error: #error "This file was generated using the moc from 3.3.8b. It"
mCAbout.cpp:18:2: error: #error "cannot be used with the include files
from this version of Qt."
mCAbout.cpp:19:2: error: #error "(The moc has changed too much.)..
bueno para hacerla fácil perdí mas de 10 días buscando la fuente del error, instale y des-instale las Qt, el Centos, use varias versiones de instalacion desde la minima , hasta el servidor de aplicaciones , instalé nuevamente la versión 2.0 fuentes para compilar y la misma cosa, busque en Internet, cuando ya estaba casi por darme por vencido y olvidarme de todo este cuento del harbour, se me ocurrió buscar con comando locate el famoso comando moc , que me estaba mostrando el error y si señor tenia dos versiones, una en /usr/lib64/qt-3.3/bin, y otra en /usr/lib64/qt4/bin,
esto pensé debe ser que me está generando el problema , un simple vistaso al PATH con
el comando echo $PATH me confirmo que efectivamente el sistema tenia por defecto :
echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oficyna/bin
procedí a cambiar el PATH para el momento de compilacion por:
export PATH=/usr/lib64/qt4/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oficyna/bin
Aunque se puede cambiar de forma definifiva en /etc/profile.d/qt.sh , preferi no hacerlo porque
no se que otras dependencias pueda tener el PATH original, y despues de todo el cambio del PATH durante del proceso de compilación funciona correctamente y no lo necesite para mas nada.
de nuevo make install , y ya no marcó el error , me indico que le faltaban librerías , como cups, gpm, ads,odbc, allegro,firebire etc las que fui instalando en la medida que el sistema las fue olicitando como dependencias, todas excepto allegro que me toco bajar un rpm del sitio de allegro, la instale con yum install, aunque embien lo hecho con el modulo administrativo del centos para agregar programs y funciono correctamente, al terminar de resolver todas las dependencias, termino exitosa mente. ( no se necesitan todas sino se va trabajar con ellas en mi caso al final solo instalé cups y allegro . esta última si me tocó porque el sistema me fallaba sino la encontraba, les sugiero instalar los repositorios de ATrpm, ReHat Enterprise y RPM forge, esto me simplifico mucho las cosas)
Estos fueron los sitios que use para instalar los repositiorios de en Centos 6.2
http://dl.atrpms.net/el6-i386/atrpms/stable/atrpms-repo-6-5.el6.i686.rpm
http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
(Nota Probé con la versión 2.0 de Harbour y también me funcionó correctamente al hacer la asignación correcta del path)
Volví a mi script de compilación que estaba funcionado en la versión 2.0 en
Ubuntu y Mandriva
clear
date
echo '*********************************************************'
echo '* Compila harbour con hbmk2
echo '*
echo '* Konta
echo '*
echo '*********************************************************'
// Tocó comentar estas lineas sino no encuentra los include del programa
//export HB_INC_INSTALL=/usr/include/harbour
//export HB_LIB_INSTALL=/usr/lib64/harbour
ls -1 *.prg > sos1
sed 's/*/ /' sos1 > sos2.clp
hbmk2 -static -m -n0 -okonta.out -gtxwc @sos2.clp -lhbqt -lhbqtcore -lhbqtgui -lhbqtnetwork -lQtCore -lQtGui -lQtNetwork -lQtUiTools
**********************************************************
Tocó comentar estas lineas sino no encuentra los #include del programa y retirar ihbqt , que en la versión 3.0 no existe
/usr/local/share/doc/harbour/ChangeLog
donde dice textual
- contrib/hbqt/hbqt.ch
- Deleted. Please use hbqtcore.ch, hbqtgui.ch instead.
; INCOMPATIBLE.
; NOTE: hbqt.ch was automatically including hbtrace.ch,
with per-component headers this is no longer true,
so if you need it you have to include it explicitly.
; NOTE: QT_PTROF() compatibility macro has been removed.
It was a dummy, so either remove it from your code
or readd the macro locally until then.
Pues bien fue a mi programa, he hice lo que recomiendan , cambiar
#include "hbqt.ch" por
#include "hbqtcore.ch"
#include hbqtgui.ch"
al final probé retirando el #include del problema . sin remplazarlo por nada y hasta la fecha
también me está funcionado la aplicación
De nuevo ejecute el script , esta vez , no marcó error sobre los # include pero si me indico que tenía errores
en el programa en lo relacionado con EVENT/SIGNAL
De nuevo a mirar el Changelog y efectivamente dice textual
2010-08-25 15:48 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbqt/qtcore/hbqt_misc.prg
+ Implemented: object local "Slots" and "Events" management.
Now no need to setup slots and events variable. These are
automatically created on demand.
EVENTS:
oWnd := QMainWindow():new()
Earlier:
pEvents := Qt_Events_New()
oWnd:installEventFilter( ::pEvents )
Qt_Events_Connect( ::pEvents, oWnd, QEventClose, {|| MsgBox( "Closing" ) } )
Now:
oWnd:connect( QEvent_Close, {|| MsgBox( "Closing" ) } )
SLOTS:
oBtn := QPushButton():new()
Earlier:
pSlots := Qt_Slots_New()
Qt_Slots_Connect( pSlots, oBtn, "clicked()", {|| ... } )
Now:
oBtn:connect( "clicked()", {|| ... } )
This implementation fixes very old demand to isolate this glitch.
* contrib/hbqt/tests/demoqt.prg
% Demonstrates the new Slots and Events management protocol.
Still a part of old proto is also retained for comparison.
Es decir que el modelo de SLOT/SIGNAL cambio a un nuevo modelo y que hay que cambiar el
programa o no funciona.
Un vistaszo comparativo como sugiere el ChangeLog , del demoqt.prg tanto en la versión 2.0 y el 3.0 me ayudo a clarificar como funciona el cambio en el modelo de eventos.
También el ChangeLog indica como debe hacerse , afortunadamente yo tengo todo el uso de de el sistema
de eventos y señales en un archivo separado que llamo sos_qt.prg, que presente en este mismo blog hace ya varios meses, y fue cosa de media hora cambiar todo el sistema y mis amigos ya tengo todo otra vez funcionado.
Ejemplo del cambio del modelo EVENT/SIGNAL
Qt_Connect_Signal( nBtn, QT_EVE_CLICKED , {|| elegido_ := "N" } )
cambio a:
nBtn : connect( QT_EVE_CLICKED , {|| elegido_ := "N" } )
Una de las cosas que hay que tenr en cuenta de la versión 2.0 a la 3.0 tiene
que ver con el modelo de uso de procedimientos sobre cargados en el anterior modelo
se usaba por ejemplo:
btn: addrow_1(param1)
btn: addrow_2(param1,param2)
btn:: addrow_3(paam1,param2,parmet3 )
.
en la actualidad ajustándose mas a la forma de sobre carga tipo C++ y java lo
procedimientos o métodos según prefieran están sobre cargados de forma "estándar"
así que para el anterior ejemplo todos los casos de uso serian
btn: addrow(param1)
btn: addrow(param1,param2)
btn: addrow(param3)
Algunas funciones se ajustaron mas al modelo de uso Qt por ejemplo
en QtDialog desapareció el setWindowTitle.
También se modifico el llamado de funciones del forma
btn:= funcion():new(parametro1)
a la mas convencional de Qt
btn:= funcion(parametro1)
En general ambas funcionan , pero hay casos en que es necesario que hacer el cambio pues
la versión 3.0 pone problema si no se hace, marcando un error de llamado de parámetros
ilegal como por ejemplo en el siguiente caso.
anterior
qTool1[items] := QAction() : new( ksosObj )
muestra error y no funciona
actual
qTool1[items] := QAction( ksosObj )
El siguiente mensaje de error
QGtkStyle was unable to detect the current GTK+ theme.
que se me presenta cuando ejecuto la aplicación
en modo super-usuario, se soluciono al ejecutar la aplicación en modo
de usuario normal (ya haba tocado el tema de DBUS y la des-configuaración
de los FONTS en Mandriva 2010 solucion de problema fonts
También se soluciono el problema de no encontraba el tipo de letra
courier y por lo tanto los informes que dependían de este tipo de letra
para permanecer alineados se deformaran.
Les dejo un interesante tutorial de las principales funciones de Qt en Harbour,
es para version 2.0 pero esta muy claro , y sobre todo tiene los ejemplos,
no olviden cambiar el modelo de eventos a la nueva versión 3.0
http://www.gruppoeratostene.com/harbour/hbqt-tutorial.pdf
en cuanto a la descripción de las funciones de Hbqt en Harbour
el mejor sitio de referencia es el de Qt en
https:/doc.trolltech.com/4.5
Haciendo el ajuste mental de la forma Harbour y la forma Qt claro,
pero un vez uno se familiarisa es en mi opinión una gran ayuda.
se me presentó la necesidad de actualizarlo , no ya para operar desdede una USB, sino desde un servidor en la nube, con el famoso cuente de la publicidad de Harbour "hacer una vez y compilar en cualquier parte", pues no señor el escenario cambio y aqui estoy tratando de poner a funcionar el sistema que tenia operando ya.
escenario actual:
1. Linux Centos 6.2
2. 64 bit
3. Version 3.0 de Harbour
4. Version 4.6 de Qt
Lo primero con que me encontré fue con que no habia un versión pre-compilada de Harbour para Centos y menos de la versión 3.0, pero si habia los fuentes para compilar, procedía descargarlos en el directorio Harbour que ya había creado para este propósito desde el sitio (http://hivelocity.dl.sourceforge.net/project/harbour-project/source/3.0.0/harbour-3.0.0.tar.gz)
un simple tar zxvfPp harbour-3.0.0.tar.gz
y ya está descomprimido, luego a leeer el INSTALL, siempre hay que leerlo, no trae nada nuevo un simple make install , y todo debería funcionar sobre ruedas
Descargué qt-4.6.2-20.el6.x86_64.rpm(http://mirror.centos.org/centos/6/os/x86_64/Packages/qt-4.6.2-20.el6.x86_64.rpm) y sencillo rpm -ivh qt-4.6.2-20.el6.x86_64.rpm , instaló sin ningún problema las librerías Qt en mi Centos 6.2.
Procedi a darle el make install y después de unos momentos me mostró un error:
mCAbout.cpp:15:34: error: private/qucomextra_p.h: No such file or directory
mCAbout.cpp:17:2: error: #error "This file was generated using the moc from 3.3.8b. It"
mCAbout.cpp:18:2: error: #error "cannot be used with the include files
from this version of Qt."
mCAbout.cpp:19:2: error: #error "(The moc has changed too much.)..
bueno para hacerla fácil perdí mas de 10 días buscando la fuente del error, instale y des-instale las Qt, el Centos, use varias versiones de instalacion desde la minima , hasta el servidor de aplicaciones , instalé nuevamente la versión 2.0 fuentes para compilar y la misma cosa, busque en Internet, cuando ya estaba casi por darme por vencido y olvidarme de todo este cuento del harbour, se me ocurrió buscar con comando locate el famoso comando moc , que me estaba mostrando el error y si señor tenia dos versiones, una en /usr/lib64/qt-3.3/bin, y otra en /usr/lib64/qt4/bin,
esto pensé debe ser que me está generando el problema , un simple vistaso al PATH con
el comando echo $PATH me confirmo que efectivamente el sistema tenia por defecto :
echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oficyna/bin
procedí a cambiar el PATH para el momento de compilacion por:
export PATH=/usr/lib64/qt4/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oficyna/bin
Aunque se puede cambiar de forma definifiva en /etc/profile.d/qt.sh , preferi no hacerlo porque
no se que otras dependencias pueda tener el PATH original, y despues de todo el cambio del PATH durante del proceso de compilación funciona correctamente y no lo necesite para mas nada.
Estos fueron los sitios que use para instalar los repositiorios de en Centos 6.2
http://dl.atrpms.net/el6-i386/atrpms/stable/atrpms-repo-6-5.el6.i686.rpm
http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
(Nota Probé con la versión 2.0 de Harbour y también me funcionó correctamente al hacer la asignación correcta del path)
Volví a mi script de compilación que estaba funcionado en la versión 2.0 en
Ubuntu y Mandriva
clear
date
echo '*********************************************************'
echo '* Compila harbour con hbmk2
echo '*
echo '* Konta
echo '*
echo '*********************************************************'
// Tocó comentar estas lineas sino no encuentra los include del programa
//export HB_INC_INSTALL=/usr/include/harbour
//export HB_LIB_INSTALL=/usr/lib64/harbour
ls -1 *.prg > sos1
sed 's/*/ /' sos1 > sos2.clp
hbmk2 -static -m -n0 -okonta.out -gtxwc @sos2.clp -lhbqt -lhbqtcore -lhbqtgui -lhbqtnetwork -lQtCore -lQtGui -lQtNetwork -lQtUiTools
**********************************************************
Tocó comentar estas lineas sino no encuentra los #include del programa y retirar ihbqt , que en la versión 3.0 no existe
Ejecute de nuevo el script de compilación de mi programa konta.out de nuevo el programa y me marco un error
"hbqt.ch" , no encontrado
Está vez , no pensaba perder mas tiempo y me fui a :
donde dice textual
- contrib/hbqt/hbqt.ch
- Deleted. Please use hbqtcore.ch, hbqtgui.ch instead.
; INCOMPATIBLE.
; NOTE: hbqt.ch was automatically including hbtrace.ch,
with per-component headers this is no longer true,
so if you need it you have to include it explicitly.
; NOTE: QT_PTROF() compatibility macro has been removed.
It was a dummy, so either remove it from your code
or readd the macro locally until then.
Pues bien fue a mi programa, he hice lo que recomiendan , cambiar
#include "hbqt.ch" por
#include "hbqtcore.ch"
#include hbqtgui.ch"
al final probé retirando el #include del problema . sin remplazarlo por nada y hasta la fecha
también me está funcionado la aplicación
De nuevo ejecute el script , esta vez , no marcó error sobre los # include pero si me indico que tenía errores
en el programa en lo relacionado con EVENT/SIGNAL
De nuevo a mirar el Changelog y efectivamente dice textual
2010-08-25 15:48 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbqt/qtcore/hbqt_misc.prg
+ Implemented: object local "Slots" and "Events" management.
Now no need to setup slots and events variable. These are
automatically created on demand.
EVENTS:
oWnd := QMainWindow():new()
Earlier:
pEvents := Qt_Events_New()
oWnd:installEventFilter( ::pEvents )
Qt_Events_Connect( ::pEvents, oWnd, QEventClose, {|| MsgBox( "Closing" ) } )
Now:
oWnd:connect( QEvent_Close, {|| MsgBox( "Closing" ) } )
SLOTS:
oBtn := QPushButton():new()
Earlier:
pSlots := Qt_Slots_New()
Qt_Slots_Connect( pSlots, oBtn, "clicked()", {|| ... } )
Now:
oBtn:connect( "clicked()", {|| ... } )
This implementation fixes very old demand to isolate this glitch.
* contrib/hbqt/tests/demoqt.prg
% Demonstrates the new Slots and Events management protocol.
Still a part of old proto is also retained for comparison.
Es decir que el modelo de SLOT/SIGNAL cambio a un nuevo modelo y que hay que cambiar el
programa o no funciona.
Un vistaszo comparativo como sugiere el ChangeLog , del demoqt.prg tanto en la versión 2.0 y el 3.0 me ayudo a clarificar como funciona el cambio en el modelo de eventos.
También el ChangeLog indica como debe hacerse , afortunadamente yo tengo todo el uso de de el sistema
de eventos y señales en un archivo separado que llamo sos_qt.prg, que presente en este mismo blog hace ya varios meses, y fue cosa de media hora cambiar todo el sistema y mis amigos ya tengo todo otra vez funcionado.
Ejemplo del cambio del modelo EVENT/SIGNAL
Qt_Connect_Signal( nBtn, QT_EVE_CLICKED , {|| elegido_ := "N" } )
cambio a:
nBtn : connect( QT_EVE_CLICKED , {|| elegido_ := "N" } )
Una de las cosas que hay que tenr en cuenta de la versión 2.0 a la 3.0 tiene
que ver con el modelo de uso de procedimientos sobre cargados en el anterior modelo
se usaba por ejemplo:
btn: addrow_1(param1)
btn: addrow_2(param1,param2)
btn:: addrow_3(paam1,param2,parmet3 )
.
en la actualidad ajustándose mas a la forma de sobre carga tipo C++ y java lo
procedimientos o métodos según prefieran están sobre cargados de forma "estándar"
así que para el anterior ejemplo todos los casos de uso serian
btn: addrow(param1)
btn: addrow(param1,param2)
btn: addrow(param3)
Algunas funciones se ajustaron mas al modelo de uso Qt por ejemplo
en QtDialog desapareció el setWindowTitle.
También se modifico el llamado de funciones del forma
btn:= funcion():new(parametro1)
a la mas convencional de Qt
btn:= funcion(parametro1)
En general ambas funcionan , pero hay casos en que es necesario que hacer el cambio pues
la versión 3.0 pone problema si no se hace, marcando un error de llamado de parámetros
ilegal como por ejemplo en el siguiente caso.
anterior
qTool1[items] := QAction() : new( ksosObj )
muestra error y no funciona
actual
qTool1[items] := QAction( ksosObj )
El siguiente mensaje de error
QGtkStyle was unable to detect the current GTK+ theme.
que se me presenta cuando ejecuto la aplicación
en modo super-usuario, se soluciono al ejecutar la aplicación en modo
de usuario normal (ya haba tocado el tema de DBUS y la des-configuaración
de los FONTS en Mandriva 2010 solucion de problema fonts
También se soluciono el problema de no encontraba el tipo de letra
courier y por lo tanto los informes que dependían de este tipo de letra
para permanecer alineados se deformaran.
Les dejo un interesante tutorial de las principales funciones de Qt en Harbour,
es para version 2.0 pero esta muy claro , y sobre todo tiene los ejemplos,
no olviden cambiar el modelo de eventos a la nueva versión 3.0
http://www.gruppoeratostene.com/harbour/hbqt-tutorial.pdf
en cuanto a la descripción de las funciones de Hbqt en Harbour
el mejor sitio de referencia es el de Qt en
https:/doc.trolltech.com/4.5
Haciendo el ajuste mental de la forma Harbour y la forma Qt claro,
pero un vez uno se familiarisa es en mi opinión una gran ayuda.
Comentarios
Publicar un comentario