Usando el comando HBMK2 de Harbour

Usando HBMK2    ( traduccion de un email de Massimo Belgrano – Harbour Italy )

hbmk2 es una herramienta que permite compilar un ejemplo o un proyecto completo
El uso basico de esta herramienta es :
hbmk2 ac_test
hbmk2 ac_test.prg
Despues de este comando ud tiene  ac_test.exe creado  (ac_test en caso de linux )
Ud  puede ejecutarlo inmediatamente  simplemente usando
Hbmk2 ac_test -run

Hbmk2 es independiente de la plataforma y el compilador que ud use.

Please also try the recommended way with hbmk2, it does 
a similar job to your manual Makefile, but it’s portable, works 

for all future test programs and just one line.

If hbmk2 doesn’t work for you for some reason, post your -trace output

Como compilar varios  .PRG y librerias ?

hbmk2 test1 test2 testn -lmylib1 -lmylib2 -lmylibn
hbmk2 test1.prg test2.prg testn.prg mylib1.lib mylib2.lib mylibn.lib

Como crear una libreria ?

hbmk2 myprg1.PRG myprg2.prg myrc.rc  -b -m  –hblib -omiolib.lib

Como obtener informacion adicional al compilar con hbmk2 ?

hbmk2 test1 test2 testn -lmylib1 -lmylib2 -lmylibn

hbmk2 ac_test -info -trace 

Que es hbmk2 ?

«hbmk2» trata de generar una archivo ejecutable a partir de su  archivo .prg . 
Es tambien un simple equivalente al cl.bat de la distibucion CA-CLIPPER.

HBMK2 acepta los siquientes modificadores ( switches):

-o<outputfilename>      # output file name
-static                 # link with static Harbour libs
-fullstatic             # link with all static libs
-shared                 # link with shared libs (default)
-mt                     # link with multi-thread libs
-gt<hbgt>               # link with <hbgt> GT driver, can be repeated to
                        # link with more GTs. The first one will be
                        #      the default at runtime
-l<libname>             # link with <libname> library
-L<libpath>             # additional path to search for libraries
-fmstat                 # link with the memory statistics lib
-nofmstat               # do not link with the memory statistics lib (default)
-[no]strip              # strip (no strip) binaries
-main=<main_func>       # set the name of main program function/procedure.
                        # if not set then ‘MAIN’ is used or if it doesn’t
                        # exist the name of first public function/procedure
                        # in first linked object module (link)

Como  usar  compilacion incremental ?

hbmk2 test1 test2 testn -lmylib1 -lmylib2 -lmylibn -rebuild              

 Por defecto el sistema operativo habilita el modo de compilacion incremental , osea solo las partes modificados
de su proyecto seran recompiladas.
Si ud desea una recompilacion completa el modificador 
 -rebuild  lo permite

Como usar un archivo de configuracion de  libreria  (hbc)?

El archivo .hbc contiene las librerias usadas por el proyecto

Tipicamente existe una plantilla para cada libreria que permite incluir todas las

referencias necesarias vea por ejemplo:

Ud puede usar  el archivo .hbc agregandolo a la linea de comando de  hbmk2
Tambien lo puede usar dentro de un archivo .hbp agregando una linea con el path donde reside el archivo .hbc
# $Id: hbxbp.hbc 11447 2009-06-20 02:41:38Z vszakats $

Como usar un archivo de proyecto (.hbp)?

Ud simplemente puede usar :
hbmk2 hbide.hbp
El archivo .hbp  contiene  todos los comandos de la linea de comandos
# $Id: hbide.hbp 13463 2010-01-04 10:15:18Z vouchcac $
-w3 -es2 -gc3
# Trick to make it link using default Harbour builds

Que es

Is a default setting applied to all source compiled in this directory

Como obtener ayuda ?

hbmk2 – help

Harbour Make (hbmk2) 2.0.1dev (Rev. 13476)
Copyright (c) 1999-2010, Viktor Szakats
Translation (it-IT): (add your name here)
  hbmk2 [options] [<script[s]>] <src[s][.prg|.c|.obj|.o|.rc|.res|.po|.pot|.hbl|@.clp|.d]>
  -o<outname>        output file name
  -l<libname>        link with <libname> library. <libname> should be without
                     path, extension and ‘lib’ prefix (unless part of libname).
  -L<libpath>        additional path to search for libraries
  -i<p>|-incpath=<p> additional path to search for headers
  -static|-shared    link with static/shared libs
  -mt|-st            link with multi/single-thread VM
  -gt<name>          link with GT<name> GT driver, can be repeated to link with
                     more GTs. First one will be the default at runtime
  -hblib             create static library
  -hbdyn             create dynamic library
  -gui|-std          create GUI/console executable
  -main=<mainfunc>   override the name of starting function/procedure
  -fullstatic        link with all static libs
  -[full|fix]shared  create shared Harbour binaries without/with absolute dir
                     reference to Harbour library (default: ‘fullshared’ when
                     Harbour is installed on system location, ‘fixshared’
                     otherwise) (fix/full option in *nix only)
  -nulrdd[-]         link with nulrdd
  -[no]debug         add/exclude C compiler debug info. For Harbour level
                     debug, use Harbour option -b as usual
  -[no]optim         toggle C compiler optimizations (default: on)
  -[no]cpp[=def]     force C/C++ mode or reset to default
  -[no]map           create (or not) a map file
  -[no]implib        create (or not) an import library (in -hbdyn mode)
  -[no]strip         strip (no strip) binaries
  -[no]trace         show commands executed
  -[no]beep          enable (or disable) single beep on successful exit, double
                     beep on failure
  -[no]ignore        ignore errors when running compiler tools (default: off)
  -nohblib[-]        do not use static core Harbour libraries when linking
  -nolibgrouping[-]  disable library grouping on gcc based compilers
  -nomiscsyslib[-]   don’t add extra list of system libraries to default
                     library list
  -traceonly         show commands to be executed, but don’t execute them
  -[no]warn[=lev]    set C compiler warning level
                     <lev> can be: yes, no, def (default: yes)
  -[no]compr[=lev]   compress executable/dynamic lib (needs UPX)
                     <lev> can be: min, max, def
  -[no]run           run/don’t run output executable
  -vcshead=<file>    generate .ch header file with local repository
                     information. SVN, CVS, Git, Mercurial, Bazaar and Fossil
                     are currently supported. Generated header will define
                     macro _HBMK_VCS_TYPE_ with the name of detected VCS and
                     _HBMK_VCS_ID_ with the unique ID of local repository
  -tshead=<file>     generate .ch header file with timestamp information.
                     Generated header will define macros _HBMK_BUILD_DATE_,
                     _HBMK_BUILD_TIME_, _HBMK_BUILD_TIMESTAMP_ with the
                     date/time of build
  -icon=<file>       set <file> as application icon. <file> should be a
                     supported format on the target platform (experimental)
  -instpath=<path>   copy target to <path>. if <path> is a directory, it should
                     end with path separator. can be specified multiple times
  -nohbc             do not process .hbc files in current directory
  -stop              stop without doing anything
  -echo=<text>       echo text on screen
  -bldf[-]           inherit all/no (default) flags from Harbour build
  -bldf=[p][c][l]    inherit .prg/.c/linker flags (or none) from Harbour build
  -inctrypath=<p>    additional path to autodetect .c header locations
  -prgflag=<f>       pass flag to Harbour
  -cflag=<f>         pass flag to C compiler
  -resflag=<f>       pass flag to resource compiler (Windows only)
  -ldflag=<f>        pass flag to linker (executable)
  -aflag=<f>         pass flag to linker (static library)
  -dflag=<f>         pass flag to linker (dynamic library)
  -runflag=<f>       pass flag to output executable when -run option is used
  -jobs=<n>          start n compilation threads (multiprocess platforms only)
  -inc               enable incremental build mode
  -[no]head[=<m>]    control source header parsing (in incremental build mode)
                     <m> can be: native, full, partial (default), off
  -rebuild           rebuild all (in incremental build mode)
  -clean             clean (in incremental build mode)
  -workdir=<dir>     working directory for incremental build mode
                     (default: .hbmk/plat/comp)
  -hbl[=<output>]    output .hbl filename. %{hb_lng} macro is accepted in
  -lng=<languages>   list of languages to be replaced in %{hb_lng} macros in
                     .pot/.po filenames and output .hbl/.po filenames. Comma
                     separared list:
  -po=<output>       create/update .po file from source. Merge it with previous
                     .po file of the same name
  -[no]minipo        don’t (or do) add Harbour version number and source file
                     reference to .po (default: add them)
  -rebuildpo         recreate .po file, thus removing all obsolete entries in
  -target=<script>   specify a new build target. <script> can be .prg (or no
                     extension) or .hbm file (available on command line only)
  -target            marks beginning of options belonging to a new build target
                     (available on command line only)
  -alltarget         marks beginning of common options belonging to all targets
                     (available on command line only)
  -hbrun             run target
  -hbraw             stop after running Harbour compiler
  -hbcmp|-clipper    stop after creating the object files
                     create link/copy hbmk2 to hbcmp/clipper for the same
  -hbcc              stop after creating the object files and accept raw C
                     create link/copy hbmk2 to hbcc for the same effect
  -hblnk             accept raw linker flags
  -hb10              enable Harbour 1.0.x compatibility mode (experimental)
  -xhb               enable xhb mode (experimental)
  -hbc               enable pure C mode (experimental)
  -exospace          emulate Clipper compatible linker behavior
                     create link/copy hbmk2 to rtlink/blinker/exospace for the
                     same effect
  -hbmake=<file>     convert hbmake project file to .hbp file (experimental)
  -xbp=<file>        convert .xbp (xbuild) project file to .hbp file
  -xhp=<file>        convert .xhp (xMate) project file to .hbp file
  –hbdirbin         output Harbour binary directory
  –hbdirdyn         output Harbour dynamic library directory
  –hbdirlib         output Harbour static library directory
  –hbdirinc         output Harbour header directory
  -plat[form]=<plat> select target platform.
  -comp[iler]=<comp> select C compiler.
                     Special value:
                      – bld: use original build settings (default on *nix)
  -build=<name>      use a specific build name
  -lang=<lang>       override default language. Similar to HB_LANG envvar.
  –version          display version header only
  -pause             force waiting for a key on exit in case of failure (with
                     alternate GTs only)
  -info              turn on informational messages
  -quiet             suppress all screen messages
  – <script> can be <@script> (.hbm format), <script.hbm>, <script.hbp> (marks
    a new target) or <script.hbc>.
  – Multiple -l, -L and <script> parameters are accepted.
  – Regular Harbour compiler options are also accepted.
  – hbmk.cfg option file in hbmk2 directory is always processed if it exists.
    On *nix platforms ~/.harbour, /etc/harbour, <base>/etc/harbour, <base>/etc
    are checked (in that order) before the hbmk2 directory. The file format is
    the same as .hbc.
  – hbmk.hbm make script in current directory is always processed if it exists.
  – .hbc config files in current dir are automatically processed.
  – .hbc options (they should come in separate lines): libs=[<libname[s]>],
    hbcs=[<.hbc file[s]>], gt=[gtname], syslibs=[<libname[s]>],
    prgflags=[Harbour flags], cflags=[C compiler flags], resflags=[resource
    compiler flags], ldflags=[linker flags], libpaths=[paths], sources=[source
    files], incpaths=[paths], inctrypaths=[paths], instpaths=[paths],
    cpp=[yes|no|def], warn=[yes|no|def], compr=[yes|no|def|min|max],
    head=[off|partial|full|native], skip=[yes|no], echo=<text>
    Lines starting with ‘#’ char are ignored
  – Platform filters are accepted in each .hbc line and with several options.
    Filter format: {[!][<plat>|<comp>|<keyword>]}. Filters can be combined
    using ‘&’, ‘|’ operators and grouped by parantheses. Ex.: {win}, {gcc},
    {linux|darwin}, {win&!pocc}, {(win|linux)&!watcom}, {unix&mt&gui},
    -cflag={win}-DMYDEF, -stop{dos}, -stop{!allwin},
    {allpocc|allgcc|allmingw|unix}, {allmsvc}, {x86|x86_64|ia64|arm},
  – Certain .hbc lines (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=,
    inctrypaths=, instpaths=, echo=) and corresponding command line parameters
    will accept macros: ${hb_root}, ${hb_dir}, ${hb_name}, ${hb_plat},
    ${hb_comp}, ${hb_build}, ${hb_cpu}, ${hb_bin}, ${hb_lib}, ${hb_dyn},
    ${hb_inc}, ${<envvar>}. libpaths= also accepts %{hb_name} which translates
    to the name of the .hbc file under search.
  – Options accepting macros also support command substitution. Enclose command
    inside «, and, if the command contains space, also enclose in double
    quotes. F.e. «-cflag=`wx-config –cflags`», or
    ldflags={unix&gcc}»`wx-config –libs`».
  – Defaults and feature support vary by platform/compiler.
  – Options can also be specified in environment variable HBMK_OPTIONS
Supported <comp> values for each supported <plat> value:
  – linux  : gcc, clang, icc, watcom, sunpro, open64
  – darwin : gcc, clang, icc
  – win    : mingw, msvc, bcc, watcom, icc, pocc, cygwin, xcc,
  –          mingw64, msvc64, msvcia64, iccia64, pocc64
  – wce    : mingwarm, mingw, msvcarm, poccarm
  – os2    : gcc, gccomf, watcom
  – dos    : djgpp, watcom
  – bsd    : gcc
  – hpux   : gcc
  – beos   : gcc
  – sunos  : gcc, sunpro

Usando La funcion HB_SendMail() de HBTip

Este es una ejemplo de como utilizar la funcion HB_SendMail ( ) de la lIbreria HBTIP  de Harbour , muy util por cierto.

Es valido tanto en linux como en windows y esta escrito en modo consola

El ejemplo fue creado por Marco Braida de  


Se puede descargar el prg listo desde esta direccion :  DescargaTestMail


#include «»
#include «»

// Compile with command: hbmk2 testmail.prg -lhbtip -rebuild

procedure main

   local cServer       :=      «»                  // Required. IP or domain name of the mail server
   local nPort         :=      25                              // Optional. Port used my email server
   local cFrom         :=      «»       // Required. Email address of the sender
   local xTo           :=      «»       // Required. Character string or array of email addresses to send the email to
   local xCC           :=      «»                              // Optional. Character string or array of email adresses for CC (Carbon Copy)
   local xBCC          :=      «»                              // Optional. Character string or array of email adresses for BCC (Blind Carbon Copy)
   local cBody         :=      «Please ignore only a test…»  // Optional. The body message of the email as text, or the filename of the HTML message to send.
   local cSubject      :=      «Test from Harbour»             // Optional. Subject of the sending email
   local aFiles        :=      {}                              // Optional. Array of files attachments to the email to send {{«a»},{«b»}}
   local cUser         :=      «pop3username»                  // Required. User name for the POP3 server
   local cPass         :=      «pop3userpassword»              // Required. User password for the POP3 server
   local cPopServer    :=      «»                  // Required. POP3 server name or address
   local nPriority     :=      3                               // Optional. Email priority: 1=High,3=Normal (Standard), 5=Low
   local lRead         :=      .f.                             // Optional. If set to .T., a confirmation request is send. Standard setting is .F.
   local bTrace        :=      .f.                             // Optional. If set to .T., a log file is created (smtp-<nNr>.log). Standard setting is NIL.
                                                               // If a block is passed, it will be called for each log event with the message a string, no param on session close.
   local lPopAuth      :=      .f.                             // Optional. Do POP3 authentication before sending mail.
   local lNoAuth       :=      .t.                             // Optional. Disable Autentication methods
   local nTimeOut      :=      1000                            // Optional. Number os ms to wait default 20000 (20s)
   local cReplyTo      :=      «»       // Optional. mail address to reply to
   local lTLS          :=      .F.                             // Optional. Set to .t. if you want/need to use Transport Layer Security default to .F.
   local cSMTPPass     :=      «»                              // Optional. Character string password for SMTP server if needed
   local cCharset      :=      «»                              // Character set to be used, default to «ISO-8859-1»
   local cEncoding     :=      «»                              // Optional. Encode option to be used, default to «quoted-printable»

 ? «Sending mail…»
  if  hb_SendMail( cServer, nPort, cFrom, xTo, xCC , xBCC , cBody, cSubject, aFiles, cUser, cPass, cPopServer, nPriority, lRead, bTrace,lPopAuth,lNoAuth, nTimeOut, cReplyTo, lTLS , cSMTPPass, cCharset, cEncoding )
       ? «An email was sent…»
      alert(«Cannot contact the mail server «,»Please verify parameter or the connection…»)




Harbour: COMO instalar en LINUX

Como descargar la ultima version de SVN de Harbour del repositorio de Sourceforge y compilarlo

    ( LINUX )



 Una vez que tengas linux funcionando , te recomiendo ubuntu 9.10 ultima version estable, deberas tener acceso a usuario administrador

esto que quiere decir ? que puedas utilizar el comando SUDO  o sea  poder ejecutar comandos desde una terminal linux 

como si fueras el administrador del sistema .

Si instalaste linux vos mismo y sos el primer usuario , eso quiere decir que tu usuario deberia tener acceso a super user a traves del comando sudo

y tu clave sera la autorizacion para el mismo.


para probar y con uma pc donde tengas linux ya instalado con acceso a internet podrias intentar instalar con un comando los paquetes de

software necesarios para compilar harbour en tu sistema

probemos el siguiente comando:


sudo apt-get update; sudo apt-get install wget cvs rcs build-essential ncurses-dev libslang2-dev tk8.3-dev unixodbc-dev subversion libncurses-dev libx11-dev libgpm-dev firebird2.1-dev libfreeimage-dev libmysqlclient15-dev libpq-dev libqt3-mt-dev liballegro4.2-dev wine dosemu-freedos mingw32 zlib1g-dev libpcre3-dev libncurses-dev libslang2-dev libx11-dev libgpmg1-dev unixodbc-dev libcurl4-gnutls-dev firebird2.1-dev libgd2-xpm-dev libsqlite3-dev libqt4-dev
 Estos comandos se deben ejecutar en una terminal que en ubuntu se puede abrir desde : Aplicaciones -> Accesorios -> Terminal
Este comando te pedira tu clave y luego de pedirte el ok tratara de descargar e instalar las ultimas versiones de los mismos , esto preparara tu sistema
para poder  descargar y compilar HARBOUR.
Luego es  necesario ejecutar el siguiente comando:
svn co harbour_svn

 Donde Harbour_svn es la carpeta que se creara y donde seran descargados los fuentes actualizados de harbour.
Una vez que veas que este proceso finalizo , podemos comensar la compilacion .
Si es la primera vez  podemos saltear el primer paso ( sudo make clean) , pero cuando recompiles
porque bajaste una actualizacion seran necesarios todos los pasos.
Ejecutar :  cd harbour_svn    ( o el directorio que hayas creado )
      luego:    cd harbour
                     sudo make clean
                     sudo make all
                     sudo make install
Cada comando llevara un tiempo en ejecutarse y el make all es el que mas tiempo te llevara .
una vez que hagas el make install tu sistema estara listo para probar compilar un ejemplo
para ello abris un editor de textos de tu preferencia y pones el siguiente codigo:
Cabe aclarar que este codigo fue tomado de la pagina de nuestro amigo Italiano Marco Braida 
function main()
do while .t.
clear screen
@ 3,3 say "CIAO MONDO" color "w/r"
@ 4,3 say "Sono harbour ;-)" color "w/b"
@ 5,3 say "Vuoi terminare... ? "
@ row(), col()+1 get dummy picture "@K!"
if dummy=="S"
clear screen
@ 8,10 say "Ok non vuoi terminare"
return nil

// -----------------------------
function quadro(ri,ci,rf,cf)
@ ri,ci clear to rf,cf
return nil
 Este codigo debera ser guardado como hello.prg   y luego lo compilaremos desde la terminal linux
usando el siguiente comando:


                                                             hbmk2 -lgpm -static hello.prg

Cabe destacar que deberemos estar en el directorio donde guardamos el archivo PRG
luego ejecutamos desde la terminal    ./hello
y tendremos nuestro primer programa harbour en linux funcionado.
En la carpeta tests dentro de la carpeta harbour , encontraran un monton de ejemplos basicos de programacion y 
en la carpeta contrib , un monton de librerias que pueden ser utiles a la hora de intentar desarrllar algun proyecto , incluidas 
varias librerias para desarrollo de programas en modo grafico.
El sitio web de Harbour Oficial puede servir como punto de partida de informacion y acceso a las listas de correo de usuarios y desarrolladores.
Espero que les sirva y les haya gustado

Harbour : El nuevo Clipper ?



 Qué es Harbour ?

Harbour es un compilador libre (gratis !) inter-plataforma para el lenguaje xBase, a menudo referido como Clipper (el lenguaje que es implementado por el compilador
Especificamente Harbour esta diseñado para ser tan cercano al 100% de compatibilidad con CA-Clipper (MR) como sea humanamente posible.

La versión que se eligió para lograr tal compatibilidad es la versión 5.2e internacional.
Esto no quiere decir que los agregados encontrados en la versión 5.3 no se pondrán dentro de Harbour, esto simplemente refleja el hecho que muchos programadores de Clipper ven a la versión 5.2e como la «última mejor» implementación de Clipper.

De ahora en más siempre que se haga referencia a CA-Clipper (MR) y no se indique otra cosa estaremos hablando de esta versión (C52).

Aunque se han agregado algunas funciones básicas pertenecientes a la versión 5.3, que no alteran el diseño del compilador y que ya estaban disponibles en lenguaje C y eran ampliamente utilizadas.

Si las extensiones al lenguaje son importantes para Ud. por favor siéntase libre para contribuir al proyecto.
El compilador de Harbour cumple la misma función que CLIPPER.EXE (MR).
Tiene la ventaja que puede generar código de lenguaje C, siendo así virtualmente compatible con miles de librerías y programas.
Se está trabajando en la opción de generar ejecutables para cada una de las plataformas.

archivos PRG —> archivos «C»———> archivos ejecutables
archivos PRG ——————————> archivos ejecutables

Viene acompañado de librerías que contienen funciones equivalentes a las que acompañan a CA-Clipper 5.2e Inernacional.

Harbour se entrega con todo el codigo fuente (99% ANSI C) y archivos make, y bat, así todo lo que se necesita hacer para tenerlo corriendo en su plataforma, es construirlo y conectarlo a la interfaz correcta.

Hay archivos binarios precompilados si Ud. desea testear el compilador y no ir a través de los pasos para construirlo.

Por qué desarrollar Harbour ?

CA-Clipper (MR) ha sido desde sus comienzos la herramienta preferida por miles de programadores.
Hay probablemente más razones para desarrollar harbour que los desarrolladores que hay de Harbour.
Para obtener un mejor entendimiento sobre por qué el software libre es desarrollado Ud. podra querer leer

«The Cathedral and the Bazaar» (en español).

Algunas de las causas que motivaron el desarrollo de Harbour fueron:

  • La desaparición de la posibilidad de nuevas versiones de CA-Clipper por discontinuación del producto.
  • La dificultad de una migración fácil desde CA-Clipper bajo D.O.S. hacia un entorno windows.
  • Las distintas empresas que ofrecen alternativas de migración, han adaptado el lenguaje de manera tal que se hace necesario el aprendizaje de práctimente un nuevo lenguaje de programación.
  • La falta de soporte real de la compa�ia propietaria ante conocidos bugs.

Que plataformas son soportadas por Harbour ?

Actualmente, Harbour esta en su version 1.01 , y puede crear ejecutables para correr en forma nativa en las siguientes plataformas:

  • Linux (todas las distribuciones)
  • DOS
  • Win 3.x
  • Win 9x, Win ME
  • Win NT 4.x, 5.x, Win 2000
  • OS/2

Quién esta desarrollando Harbour ?

Mucha gente. Hay un pequeño grupo de personas quienes pueden ser llamados el «equipo de desarrollo del núcleo de Harbour», (graciosamente llamada la tripulación) pero la cantidad de personas que esta contribuyendo al proyecto esta aumentando continuamente.
Cualquiera que lo desee puede unirse al equipo de desarrollo y, si Ud. tiene algo que ofrecer al proyecto será más que bienvenido. Cualquiera que desee consultar la lista de desarrolladores lo puede hacer en el sitio Web de Harbour y mirar en «tripulación».

Estado actual de Harbour

Para más información acerca del estado actual del proyecto harbour o si Ud. desea unirse para su desarrollo, chequee en el sitio Web (en inglés) el cual tiene información actualizada acerca de los últimos cambios.