[OT] Automatizar número de build

[OT] Automatizar número de build

Postby José Luis Sánchez » Wed Jan 04, 2012 3:14 pm

Hola,
Estaba viendo un editor que me gusta mucho y en el 'acerca de' decía build 2139.

Me pregunto si hay alguna manera de automatizar el número de build de una aplicación, de manera que el propio make lleve la cuenta de cuantas veces hemos compilado los fuentes. Estoy dándole vueltas a la cabeza y no encuentro la manera, se me ocurre la manera de hacerlo a través de un ini, pero no dentro del propio exe, que es como me gustaría.

Saludos,
José Luis
User avatar
José Luis Sánchez
 
Posts: 556
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España

Re: [OT] Automatizar número de build

Postby RSalazarU » Thu Jan 05, 2012 12:45 am

Hola Jose:

Colocar el numero de Build en el EXE creo que es difícil automatizarlo.

Yo lo hago a través del creador de instaladores InnoSetup

- El numero de Build es la fecha de la compilación
- El innoSetup puede ver la fecha del EXE y crear un instalador con esa fecha
- Al ejecuta el instalador creado por el innoSetup, este coloca en el INI de la aplicación el número Build
- La aplicación lee del INI el numero de Build
- OJO: Cada vez que creo un instalador se crea una versión

Parte del ini seria
Code: Select all  Expand view  RUN
[Version]
Ejecutable=20111002
Dictionary=
 


- De esta forma le puedo preguntar al usuario que numero de Build esta usando

En mi pagina puedes ver los algunos instaladores y sus numero de "versión" http://sauro-sys.com/node/3

Atentamente,

Rolando
Desde Cochabamba, Bolivia.
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: [OT] Automatizar número de build

Postby Raymundo Islas M. » Thu Jan 05, 2012 2:53 am

Jose Luis, Rolando :

Realmente no es dificil anexar/integrar el build de nuestra aplicacion directamente en el propio ejecutable :twisted:

Image

En mi caso yo manejo 2 datos : Build y Control

Build : Por cada vez que compilo los fuentes, voy incrementando su valor.
Control : Por cade vez que compilo los fuentes, me toma fecha y hora.

Lo que hago es lo siguiente :
- Crea un archivo .prg con una funcion que retorne el Build/Control como cadena(s)
- Crea tu funcion que te genere y actualize tu nuevo Build/Control
- En la misma funcion borras el archivo .prg
- Y enseguida que genere el nuevo archivo .prg con los nuevos valores

Asi, en cada compilacion el programa toma los valores generados previamente.

Suena un poco confuso, pero me funciona al 100%

De hecho, este principio lo podemos usar para manejar varias cosillas mas en nuestras apps.

Saludos
FWH 10.6 + xHarbour + Borland 582
User avatar
Raymundo Islas M.
 
Posts: 592
Joined: Tue Mar 14, 2006 11:34 pm
Location: Acapulco, Gro. MEXICO

Re: [OT] Automatizar número de build

Postby FiveWiDi » Thu Jan 05, 2012 8:18 am

RSalazarU wrote:Hola Jose:

Colocar el numero de Build en el EXE creo que es difícil automatizarlo.

Yo lo hago a través del creador de instaladores InnoSetup

- El numero de Build es la fecha de la compilación
- El innoSetup puede ver la fecha del EXE y crear un instalador con esa fecha
- Al ejecuta el instalador creado por el innoSetup, este coloca en el INI de la aplicación el número Build
- La aplicación lee del INI el numero de Build
- OJO: Cada vez que creo un instalador se crea una versión

Parte del ini seria
Code: Select all  Expand view  RUN
[Version]
Ejecutable=20111002
Dictionary=
 


- De esta forma le puedo preguntar al usuario que numero de Build esta usando

En mi pagina puedes ver los algunos instaladores y sus numero de "versión" http://sauro-sys.com/node/3

Atentamente,

Rolando
Desde Cochabamba, Bolivia.


Buenos días Rolando,

Podrías compartir tu fichero ISS de Inno Setup para ver como realizas este proceso?

Gracias
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1190
Joined: Mon Oct 10, 2005 2:38 pm

Re: [OT] Automatizar número de build

Postby hmpaquito » Thu Jan 05, 2012 9:24 am

Jose Luis,

Creo que este codigo puede servir para lo que quieres; esta sin testear;
el unico inconveniente que le veo, pero es solucionable, es que las compilaciones con errores
tambien "suman" al contador de builds; para mi eso es correcto, pero entiendo que otras personas
no lo entiendan asi.

Code: Select all  Expand view  RUN

/*
  GenBuild.Prg

  Generacion de ExeBuild.Prg


  La primera vez la secuencia de creacion es:
     GenBuild.Prg-> GenBuild.Exe -> ExeBuild.Prg


  Funcionamiento:
     - En nuestro proyecto (.mak o similar) se a¤ade un .prg
       a la lista llamado ExeBuild.Prg
     - Se crea un GenBuild.Exe a partir de GenBuild.Prg
     - GenBuild.Exe debe ejecutarse antes de compilar: o bien
       se inserta en la ejecucion del make, o bien se inserta
       a un .bat que llama primero al GenBuild.Exe y luego al
       Make.Exe

  Posibles mejoras:
     - Cuando varios proyectos en misma carpeta, posibilidad de
       recibir un parametro con el nombre del exe o proyecto
       y añadir (automaticamente) a ExeBuild.Dbf una linea
       por cada exe o proyecto.
*/


FUNCTION GenBuild()
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild

IF !File("ExeBuild.Dbf")
   dbCreate("ExeBuild.Dbf",;
            {;
             {"BuildNumbe", "N", 9, 0};
            })
   SELECT 0
   USE ExeBuild
   Add_Rec(0)
ELSE
   SELECT 0
   USE ExeBuild
ENDIF

RLock()
nBuildNumber:= BuildNumbe+ 1
REPLACE BuildNumbe WITH nBuildNumber
UNLOCK
COMMIT

CLOSE ExeBuild

caExeBuild:= "{"+;
               LTrim(Str(nBuildNumber, 9, 0))+ ","+;
               DToC(dBuildNumber)+ ","+;
               cBuildTime;
              "}"

cExeBuild:= ;
   "/*                                                          "+;
   "   ExeBuild.Prg                                             "+;
   "                                                            "+;
   "   Devuelve Numero, Fecha y hora del Build                  "+;                                    "
   "
                                                           "+;
   "
  Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) "+;
   "
  En el proyecto (.mak) ha incluirse una mencion a         "+;
   "
  ExeBuild.Prg                                             "+;
   "
                                                           "+;
   "
*/                                                          "+;
   "
                                                           "+;
   "
FUNCTION ExeBuild()                                         "+;
   "
                                                           "+;
   "
RETURN "+ caExeBuild+ "                                     "+;
   "
"
MemoWrite("
ExeBuild", cExeBuild)

// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("
LogBuild.Txt")
   hLog:= FCreate("
LogBuild.Txt")
   FWrite(hLog, "
Log de builds")
   FWrite(hLog, "
-------------")
ELSE
   hLog:= FOpen("
LogBuild.Txt")
ENDIF
FWrite(hLog, "
Build "+ caExeBuild}
FClose(hLog)

RETURN NIL



Saludos
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: [OT] Automatizar número de build

Postby FiveWiDi » Thu Jan 05, 2012 11:06 am

Code: Select all  Expand view  RUN

/*
  Idea original en FiveTechsoft by hmpaquito » Thu Jan 05, 2012 9:24 am
  =====================================================================

  GenBuild.Prg

  Generacion de aExeBuild.Prg    // CGP


  La primera vez la secuencia de creacion es:
     GenBuild.Prg-> GenBuild.Exe -> aExeBuild.Prg       // CGP


  Funcionamiento:
     - En nuestro proyecto (.mak o similar) se a¤ade un .prg
       a la lista llamado aExeBuild.Prg                        // CGP
     - Se crea un GenBuild.Exe a partir de GenBuild.Prg
     - GenBuild.Exe debe ejecutarse antes de compilar: o bien
       se inserta en la ejecucion del make, o bien se inserta
       a un .bat que llama primero al GenBuild.Exe y luego al
       Make.Exe

  Posibles mejoras:
     - Cuando varios proyectos en misma carpeta, posibilidad de
       recibir un parametro con el nombre del exe o proyecto
       y añadir (automaticamente) a ExeBuild.Dbf una linea
       por cada exe o proyecto.
*/


FUNCTION GenBuild( nBuild, cPathPRG )
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild

IF !File("ExeBuild.Dbf")
   dbCreate("ExeBuild.Dbf",;
            {;
             {"BuildNumbe", "N", 9, 0};
            })
   SELECT 0
   USE ExeBuild
   Add_Rec(0)
ELSE
   SELECT 0
   USE ExeBuild
ENDIF

RLock()

nBuildNumber:= BuildNumbe + 1

//// CGP
If nBuild > 0
    nBuildNumber:= nBuild
EndIf
//// CGP

REPLACE BuildNumbe WITH nBuildNumber
UNLOCK
COMMIT

CLOSE ExeBuild

caExeBuild:= "{" + ;
             LTrim( Str( nBuildNumber, 9, 0) ) + "," + ;
             DToC( dBuildNumber ) + "," + ;
             cBuildTime;
             "}"

cExeBuild:= ;
   "/*                                                          " + Chr(13)+Chr(10) + ; // CGP
   "   aExeBuild.Prg                                            " + Chr(13)+Chr(10) + ;
   "                                                            " + Chr(13)+Chr(10) + ;
   "   Devuelve Array de Numero, Fecha y hora del Build         " + Chr(13)+Chr(10) + ; // CGP
   "                                                            " + Chr(13)+Chr(10) + ;
   "   Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) " + Chr(13)+Chr(10) + ;
   "   En el proyecto (.mak) ha incluirse una mencion a         " + Chr(13)+Chr(10) + ;
   "   aExeBuild.Prg                                            " + Chr(13)+Chr(10) + ; // CGP
   "                                                            " + Chr(13)+Chr(10) + ;
   "*/                                                          " + Chr(13)+Chr(10) + ;
   "                                                            " + Chr(13)+Chr(10) + ;
   "FUNCTION aExeBuild()                                        " + Chr(13)+Chr(10) + ; // CGP
   "                                                            " + Chr(13)+Chr(10) + ;
   "RETURN " + caExeBuild + Chr(13)+Chr(10) + ;
   ""

MemoWrite( cPathPRG + "aExeBuild" + ".PRG", cExeBuild)   // CGP

// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
   hLog:= FCreate("LogBuild.Txt")
   FWrite(hLog, "Log de builds")
   FWrite(hLog, "-------------")
ELSE
   hLog:= FOpen("LogBuild.Txt")
ENDIF
FWrite(hLog, "Build "+ caExeBuild}
FClose(hLog)

RETURN NIL
 


Hola hmpaquito,

He añadido alguna mejora; estan marcadas con // CGP.

-Añadido parámetro a GenBuild() para forzar un nBuild concreto.
-añadido parámetro a GenBuild() para indicar donde crear el PRG.
-Añadido salto de línea en la creación del PRG.
-Cambiado el nombre de ExeBuild() a aExeBuild(), ya que devuelve un Array.
-Añadido PRG al final del nombre del fichero creado.

Me gusta la idea, la usaré enseguida que pueda.

Gracias.
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1190
Joined: Mon Oct 10, 2005 2:38 pm

Re: [OT] Automatizar número de build

Postby hmpaquito » Thu Jan 05, 2012 12:40 pm

FiveWidi,

Buenas correcciones...
Lo de modificar el nombre del ejecutable o de la funcion: solo por hablar de algo: Algunos nombre de funcion las prefijo con el tipo que devolveran y en otros casos no. Imaginate que decidimos mañana que aExeBuild() devuelva un objeto, por ejemplo de la clase TPublic, con datas ¿ Tenemos entonces que renombrar la clase y pasearnos por todos los puntos donde la utilizamos y llamarla oExeBuild ? En general, a no ser que este mas o menos seguro de que el tipo a devolver no cambiara, no le pongo el tipo para evitar este inconveniente.

Te dejo una copia con algunas modificaciones que vienen con // PAQ

Code: Select all  Expand view  RUN

/*
  Idea original en FiveTechsoft by hmpaquito » Thu Jan 05, 2012 9:24 am
  =====================================================================

  GenBuild.Prg

  Generacion de aExeBuild.Prg    // CGP


  La primera vez la secuencia de creacion es:
     GenBuild.Prg-> GenBuild.Exe -> aExeBuild.Prg       // CGP


  Funcionamiento:
     - En nuestro proyecto (.mak o similar) se a¤ade un .prg
       a la lista llamado aExeBuild.Prg                        // CGP
     - Se crea un GenBuild.Exe a partir de GenBuild.Prg
     - GenBuild.Exe debe ejecutarse antes de compilar: o bien
       se inserta en la ejecucion del make, o bien se inserta
       a un .bat que llama primero al GenBuild.Exe y luego al
       Make.Exe

  Posibles mejoras:
     - Cuando varios proyectos en misma carpeta, posibilidad de
       recibir un parametro con el nombre del exe o proyecto
       y añadir (automaticamente) a ExeBuild.Dbf una linea
       por cada exe o proyecto.
*/


#Define CRLF Chr(13)+ Chr(130)       // PAQ
 
FUNCTION GenBuild( nBuildPar, cPathPrg )
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild

IF cPathPrg == NIL                  // PAQ
   cPathPrg:= ""
ENDIF

IF nBuild == NIL                    // PAQ Cuando parametro build entonces no graba en automatico
   IF !File("ExeBuild.Dbf")
      dbCreate("ExeBuild.Dbf",;
               {;
                {"BuildNumbe", "N", 9, 0};
              })
      SELECT 0
      USE ExeBuild
      Add_Rec(0)
   ELSE
      SELECT 0
      USE ExeBuild
   ENDIF
 
   RLock()

   nBuildNumber:= BuildNumbe + 1

   //// CGP
//   If nBuild > 0
//    nBuildNumber:= nBuild
//EndIf
////// CGP

   REPLACE BuildNumbe WITH nBuildNumber
   UNLOCK
   COMMIT
   CLOSE ExeBuild
ELSE
   nBuildNumber:= nBuildPar
ENDIF



caExeBuild:= "{" + ;
             LTrim( Str( nBuildNumber, 9, 0) ) + "," + ;
             DToC( dBuildNumber ) + "," + ;
             cBuildTime;
             "}"

cExeBuild:= ;
   "/*                                                          " + CRLF+;
   "   aExeBuild.Prg                                            " + CRLF+;
   "                                                            " + CRLF+;
   "   Devuelve Array de Numero, Fecha y hora del Build         " + CRLF+;
   "                                                            " + CRLF+;
   "   Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) " + CRLF+;
   "   En el proyecto (.mak) ha incluirse una mencion a         " + CRLF+;
   "   aExeBuild.Prg                                            " + CRLF+;
   "                                                            " + CRLF+;
   "*/                                                          " + CRLF+;
   "                                                            " + CRLF+;
   "FUNCTION aExeBuild()                                        " + CRLF+;
   "                                                            " + CRLF+;
   "RETURN " + caExeBuild                                         + CRLF+;
   ""

MemoWrite( cPathPRG + "aExeBuild" + ".PRG", cExeBuild)   // CGP

// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
   hLog:= FCreate("LogBuild.Txt")
   FWrite(hLog, "Log de builds")
   FWrite(hLog, "-------------")
ELSE
   hLog:= FOpen("LogBuild.Txt")
ENDIF
FWrite(hLog, "Build "+ caExeBuild}
FClose(hLog)

RETURN NIL
 

 
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: [OT] Automatizar número de build

Postby RSalazarU » Thu Jan 05, 2012 1:29 pm

Hola Jose:

Te paso un fichero completo ISS
Code: Select all  Expand view  RUN

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define DateExeFile GetFileDateTimeString('.\ChqueraXH32.exe', 'yymmdd', '_',':')
#define DateDictFile GetFileDateTimeString('.\Dictionary\Dictionary.add', 'yymmdd', '_',':')

[Setup]
AppName=ChqueraXH32
AppVerName=ChqueraXH32  1.5
DefaultDirName={pf}\SAURO\ChqueraXH32
DefaultGroupName=SAURO\ChqueraXH32
OutputDir=.\Instalar
OutputBaseFilename=SetupChqueraXH32_v.{#DateExeFile}.{#DateDictFile}
SetupIconFile=.\Icons\Boligrafo.ico

VersionInfoVersion=1
VersionInfoTextVersion=v.{#DateExeFile}.{#DateDictFile}
AppPublisher=Sauro Srl.
AppPublisherURL=http://www.sauro-sys.com/
AppSupportURL=http://www.sauro-sys.com/
AppUpdatesURL=http://www.sauro-sys.com/
VersionInfoCompany=SAURO SOFTWARE SRL.
VersionInfoCopyright=SAURO SOFTWARE
WizardImageFile=E:\Archivos de programa\Inno Setup 5\WizModernImage-IS.bmp
WizardSmallImageFile=E:\Archivos de programa\Inno Setup 5\WizModernSmallImage-IS.bmp
InternalCompressLevel=max

Compression=lzma/Max
SolidCompression=true
AllowNoIcons=true
WindowVisible=false
PrivilegesRequired=admin

[Messages]
AdminPrivilegesRequired=Este proceso requiere privilegiso de administrador.

[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: spanish; MessagesFile: compiler:Languages\Spanish.isl

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons};
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons};

[Files]
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

Source: ChqueraXH32.exe; DestDir: {app}
Source: ChqueraXH32.dll; DestDir: {app}; Flags: ignoreversion
Source: Recursos.dll; DestDir: {app}; Flags: ignoreversion
Source: ..\..\DLL\Mnto32.dll; DestDir: {app}; Flags: ignoreversion
Source: ..\..\DLL\Common.dll; DestDir: {app}; Flags: ignoreversion
Source: ..\..\DLL\User.dll; DestDir: {app}; Flags: ignoreversion
Source: Program.ch; DestDir: {app}; Flags: ignoreversion
Source: Chquera.ch; DestDir: {app}; Flags: ignoreversion
Source: ..\ContXH32\Contabilidad.ch; DestDir: {app}; Flags: ignoreversion
Source: ..\FIVEGEN\SYSTEM.ch; DestDir: {app}; Flags: ignoreversion
Source: whatsnew.txt; DestDir: {app}; Flags: ignoreversion

Source: DICTIONARY\*.dbf; DestDir: {app}\Dictionary; Excludes: ~*.*,DBName*.*,*.ADD,*.AI,*.AM; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\*.cdx; DestDir: {app}\Dictionary; Excludes: ~*.*,DBName*.*,*.ADD,*.AI,*.AM; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\*.fpt; DestDir: {app}\Dictionary; Excludes: ~*.*,DBName*.*,*.ADD,*.AI,*.AM; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\DICTIONARY.ADD; DestDir: {app}\Dictionary; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\DICTIONARY.AI; DestDir: {app}\Dictionary; Flags: ignoreversion; Tasks: ; Languages:
Source: DICTIONARY\DICTIONARY.AM; DestDir: {app}\Dictionary; Flags: ignoreversion; Tasks: ; Languages:

Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Axcws32.dll; DestDir: {app}; Flags: promptifolder
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Adsloc32.dll; DestDir: {app}; Flags: promptifolder
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Ace32.dll; DestDir: {app}; Flags: promptifolder
;Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Adslocal.cfg; DestDir: {app}; Flags: promptifolder
Source: ..\..\CFG\Adslocal.cfg; DestDir: {app}; Flags: promptifolder; DestName: Adslocal.cfg
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\ansi.chr; DestDir: {app}; Flags: promptifolder
Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\extend.chr; DestDir: {app}; Flags: promptifolder
;Source: D:\xHarbourBCC_121_Rv6714\Contrib\rdd_ads\ACESDK\Redistribute\Ads.ini; DestDir: {app}; Flags: ignoreversion onlyifdoesntexist
Source: ..\..\CFG\Ads.ini; DestDir: {app}; Flags: ignoreversion promptifolder;

[Icons]
Name: {group}\ChqueraXH32; Filename: {app}\ChqueraXH32.exe; WorkingDir: {app}; IconIndex: 0
Name: {group}\{cm:UninstallProgram,ChqueraXH32}; Filename: {uninstallexe}
Name: {userdesktop}\ChqueraXH32; Filename: {app}\ChqueraXH32.exe; Tasks: desktopicon; WorkingDir: {app}; IconIndex: 0
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\ChqueraXH32; Filename: {app}\ChqueraXH32.exe; Tasks: quicklaunchicon; WorkingDir: {app}; IconIndex: 0

[Run]
Filename: {app}\ChqueraXH32.exe; Description: {cm:LaunchProgram,ChqueraXH32}; Flags: nowait postinstall skipifsilent
Filename: {app}\whatsnew.txt; Description: Ver que hay de nuevo; Flags: postinstall shellexec skipifsilent

[INI]
Filename: {app}\ChqueraXH32.ini; Section: SYSTEM; Key: WND_MDI; String: .F.
Filename: {app}\ChqueraXH32.ini; Section: SYSTEM; Key: OUTLOOK2003; String: .T.
Filename: {app}\ChqueraXH32.ini; Section: Version; Key: Ejecutable; String: {#DateExeFile}
Filename: {app}\ChqueraXH32.ini; Section: Version; Key: Dictionary; String: {#DateDictFile}

[Registry]
Root: HKLM; Subkey: SOFTWARE\SAURO\FIVEWIN\ChqueraXH32; ValueType: string; ValueData: ChqueraXH32
Root: HKLM; Subkey: SOFTWARE\SAURO\FIVEWIN\ChqueraXH32; ValueType: string; ValueName: Fecha registro; ValueData: code:GetDateInstall( ); Flags: createvalueifdoesntexist

[Code]
function GetDateInstall( ): String;
begin
    Result := GetDateTimeString('
yymmdd', '_',':');
end;


Atentamente,

Rolando
Desde Cochabamba, Bolivia.
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: [OT] Automatizar número de build

Postby FiveWiDi » Thu Jan 05, 2012 1:42 pm

hmpaquito wrote:FiveWidi,

Buenas correcciones...
Lo de modificar el nombre del ejecutable o de la funcion: solo por hablar de algo: Algunos nombre de funcion las prefijo con el tipo que devolveran y en otros casos no. Imaginate que decidimos mañana que aExeBuild() devuelva un objeto, por ejemplo de la clase TPublic, con datas ¿ Tenemos entonces que renombrar la clase y pasearnos por todos los puntos donde la utilizamos y llamarla oExeBuild ? En general, a no ser que este mas o menos seguro de que el tipo a devolver no cambiara, no le pongo el tipo para evitar este inconveniente.

Te dejo una copia con algunas modificaciones que vienen con // PAQ

Code: Select all  Expand view  RUN

/*
  Idea original en FiveTechsoft by hmpaquito » Thu Jan 05, 2012 9:24 am
  =====================================================================

  GenBuild.Prg

  Generacion de aExeBuild.Prg    // CGP


  La primera vez la secuencia de creacion es:
     GenBuild.Prg-> GenBuild.Exe -> aExeBuild.Prg       // CGP


  Funcionamiento:
     - En nuestro proyecto (.mak o similar) se a¤ade un .prg
       a la lista llamado aExeBuild.Prg                        // CGP
     - Se crea un GenBuild.Exe a partir de GenBuild.Prg
     - GenBuild.Exe debe ejecutarse antes de compilar: o bien
       se inserta en la ejecucion del make, o bien se inserta
       a un .bat que llama primero al GenBuild.Exe y luego al
       Make.Exe

  Posibles mejoras:
     - Cuando varios proyectos en misma carpeta, posibilidad de
       recibir un parametro con el nombre del exe o proyecto
       y añadir (automaticamente) a ExeBuild.Dbf una linea
       por cada exe o proyecto.
*/


#Define CRLF Chr(13)+ Chr(130)       // PAQ
 
FUNCTION GenBuild( nBuildPar, cPathPrg )
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild

IF cPathPrg == NIL                  // PAQ
   cPathPrg:= ""
ENDIF

IF nBuild == NIL                    // PAQ Cuando parametro build entonces no graba en automatico
   IF !File("ExeBuild.Dbf")
      dbCreate("ExeBuild.Dbf",;
               {;
                {"BuildNumbe", "N", 9, 0};
              })
      SELECT 0
      USE ExeBuild
      Add_Rec(0)
   ELSE
      SELECT 0
      USE ExeBuild
   ENDIF
 
   RLock()

   nBuildNumber:= BuildNumbe + 1

   //// CGP
//   If nBuild > 0
//    nBuildNumber:= nBuild
//EndIf
////// CGP

   REPLACE BuildNumbe WITH nBuildNumber
   UNLOCK
   COMMIT
   CLOSE ExeBuild
ELSE
   nBuildNumber:= nBuildPar
ENDIF



caExeBuild:= "{" + ;
             LTrim( Str( nBuildNumber, 9, 0) ) + "," + ;
             DToC( dBuildNumber ) + "," + ;
             cBuildTime;
             "}"

cExeBuild:= ;
   "/*                                                          " + CRLF+;
   "   aExeBuild.Prg                                            " + CRLF+;
   "                                                            " + CRLF+;
   "   Devuelve Array de Numero, Fecha y hora del Build         " + CRLF+;
   "                                                            " + CRLF+;
   "   Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) " + CRLF+;
   "   En el proyecto (.mak) ha incluirse una mencion a         " + CRLF+;
   "   aExeBuild.Prg                                            " + CRLF+;
   "                                                            " + CRLF+;
   "*/                                                          " + CRLF+;
   "                                                            " + CRLF+;
   "FUNCTION aExeBuild()                                        " + CRLF+;
   "                                                            " + CRLF+;
   "RETURN " + caExeBuild                                         + CRLF+;
   ""

MemoWrite( cPathPRG + "aExeBuild" + ".PRG", cExeBuild)   // CGP

// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
   hLog:= FCreate("LogBuild.Txt")
   FWrite(hLog, "Log de builds")
   FWrite(hLog, "-------------")
ELSE
   hLog:= FOpen("LogBuild.Txt")
ENDIF
FWrite(hLog, "Build "+ caExeBuild}
FClose(hLog)

RETURN NIL
 

 


Me sigue gustando.
Gracias.
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1190
Joined: Mon Oct 10, 2005 2:38 pm

Re: [OT] Automatizar número de build

Postby fivewin » Fri Jan 06, 2012 8:01 pm

Hola,

Por favor, añadir al .rc

Code: Select all  Expand view  RUN
1 VERSIONINFO LOADONCALL MOVEABLE
FILEVERSION 2012, 0, 0, 0
PRODUCTVERSION 2012, 0, 0, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
{
BLOCK "StringFileInfo"
{
BLOCK "040904b0"
{
VALUE "CompanyName", "http://www.myweb.pt/\000"
VALUE "FileDescription", "Test sample\000"
VALUE "FileVersion", "2012\000"
VALUE "LegalCopyright", "(c) Me\000"
VALUE "LegalTrademarks", "(c) Me\000"
VALUE "ProductName", "Flota\000"
VALUE "ProductVersion", "2012\000"
}

}

BLOCK "VarFileInfo"
{
VALUE "Translation", 1033, 1200
}

}
fivewin
 
Posts: 4
Joined: Wed Jan 04, 2012 8:00 pm

Re: [OT] Automatizar número de build

Postby FiveWiDi » Sat Jan 07, 2012 12:00 am

Code: Select all  Expand view  RUN

/* Aquí empieza el programa principal.
   ----------------------------------*/

FUNCTION MAIN()

local programa := "Genbuild.PRG"

GenBuild( Arg( 1 ), Arg( 2 ) )

Return Nil
// Fi de la funció d'arrancada.

/* ************************************************************************************************* */
/* ************************************************************************************************* */

/*
  Idea original en FiveTechsoft by hmpaquito » Thu Jan 05, 2012 9:24 am
  =====================================================================

  GenBuild.Prg

  Generacion de aExeBuild.Prg    // CGP


  La primera vez la secuencia de creacion es:
     GenBuild.Prg-> GenBuild.Exe -> aExeBuild.Prg       // CGP


  Funcionamiento:
     - En nuestro proyecto (.mak o similar) se a¤ade un .prg
       a la lista llamado aExeBuild.Prg                        // CGP
     - Se crea un GenBuild.Exe a partir de GenBuild.Prg
     - GenBuild.Exe debe ejecutarse antes de compilar: o bien
       se inserta en la ejecucion del make, o bien se inserta
       a un .bat que llama primero al GenBuild.Exe y luego al
       Make.Exe

  Posibles mejoras:
     - Cuando varios proyectos en misma carpeta, posibilidad de
       recibir un parametro con el nombre del exe o proyecto
       y añadir (automaticamente) a ExeBuild.Dbf una linea
       por cada exe o proyecto.

  Ejemplo de uso en el BAT de compilación de la aplicación AMPA1011:
      c:\desarrol\utilidad\Genbuild 0 c:\desarrol\trabajo\AMPA1011\PRG\Arquitec\
       
*/


#Define CRLF Chr(13)+Chr(10)       // PAQ
 
FUNCTION GenBuild( nBuildPar, cPathPrg )
Local nBuildNumber, dBuildNumber:= Date(), cBuildTime:= Time()
Local hLog
Local cExeBuild, caExeBuild

IF nBuildPar == NIL .or. nBuildPar = ""   // CGP
    nBuildPar := 0
EndIf
IF cPathPrg == NIL        // PAQ
   cPathPrg := ""
ENDIF

IF nBuildPar = 0   // == NIL     // PAQ Cuando parametro build entonces no graba en automatico  // CGP
   IF !File("ExeBuild.Dbf")
      dbCreate("ExeBuild.Dbf",;
               {;
                {"BuildNumbe", "N", 9, 0};
              })
      SELECT 0
      USE ExeBuild
      //Add_Rec(0)    // CGP
      Append Blank    // CGP
   ELSE
      SELECT 0
      USE ExeBuild
   ENDIF
 
   RLock()

   nBuildNumber:= ExeBuild->BuildNumbe + 1   // CGP

   REPLACE BuildNumbe WITH nBuildNumber
   UNLOCK
   COMMIT
   CLOSE ExeBuild
ELSE
   nBuildNumber:= nBuildPar
ENDIF



////// CGP
caExeBuild:= "{ " + ;
             LTrim( Str( nBuildNumber, 9, 0) ) + ", " + ;
             "'" + DToS( dBuildNumber ) + "', " + ;
             "'" + cBuildTime + "'" + ;
             " }"

cExeBuild:= ;
   "/*                                                          " + CRLF+;
   "   aExeBuild.Prg                                            " + CRLF+;
   "                                                            " + CRLF+;
   "   Devuelve 3 datos del build en una Array con:             " + CRLF+;
   "       Numero (tipo entero, ej. 5)                          " + CRLF+;
   "       Fecha (tipo cadena AAAAMMDD, ej. '20120325' )        " + CRLF+;
   "       hora (tipo cadena HHMMSS, ej. '16:43:51')            " + CRLF+;
   "                                                            " + CRLF+;
   "   Creado automaticamente desde GenBuild.Exe (GenBuild.Prg) " + CRLF+;
   "   En el proyecto (.mak) ha incluirse una mencion a         " + CRLF+;
   "   aExeBuild.Prg                                            " + CRLF+;
   "                                                            " + CRLF+;
   "*/                                                          " + CRLF+;
   "                                                            " + CRLF+;
   "FUNCTION aExeBuild()"                                         + CRLF+;
   "RETURN " + caExeBuild                                         + CRLF+;
   "/* */"

MemoWrit( cPathPRG + "aExeBuild" + ".PRG", cExeBuild )   // CGP

// Grabamos un log secuencial de builds para tener info de
// todas las compilaciones.
IF !File("LogBuild.Txt")
   hLog:= FCreate("LogBuild.Txt")
   FWrite(hLog, "Log de builds" + CRLF )   // CGP
   FWrite(hLog, "-------------" + CRLF )   // CGP
ELSE
   hLog:= FOpen("LogBuild.Txt", 1)    // CGP
ENDIF
FSeek(hLog, 0, 2)  // CGP
FWrite(hLog, "Build "+ caExeBuild + CRLF )   // CGP
FClose(hLog)

RETURN NIL
 

Ahora incluso compila y funciona.

Faltaban algunos detalles que impedían su compilación.

Además la fecha que devuelve es una cadena formato AAAAMMDD para así evitar que el formato de fecha afecte la respuesta.

Ahora me gusta más.

Gracias.
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1190
Joined: Mon Oct 10, 2005 2:38 pm

Re: [OT] Automatizar número de build

Postby MarioG » Wed Feb 22, 2012 1:24 pm

Gente:
Dejo otra alternativa. Difiere de la de fivewidi en que genera/mantiene el archivo .rc que se incrusta en la aplicación
Code: Select all  Expand view  RUN
/***************
   Prog        : GenBuild.prg
   Autor       : eMeGe
   Módulo      : unico
   Inicio      : 16/02/2012
   Liberado    : 22/02/2012
   Versiones   : 1.00         Operable

   Idea original en: viewtopic.php?f=6&t=23215#p124598 » Jue Ene 05, 2012 6:24 am » by hmpaquito
   version optimizada » by FiveWiDi

   Proyecto:
   1) Se podría generar un solo GenBuild para todos nuestros proyectos,
   en lugar de un genBuild para cada proyecto entonces el .dbf podría ser así:
   dbCreate( scPathDB+cDBF+".dbf", ;
                   { ;
                     { "Aplicacion", "C",  8, 0 }, ;
                     { "BuildNro",   "N",  5, 0 } ;
                   } )
   con indice sobre campo "Aplicación" para realizar las busquedas y
   actualizar el Build en consecuencia

   2) Con el mismo criterio de la generación/mantenimiento del .rc
      se puede hacer el mantenimiento de archivos de instalacion
      Inno
   *****************************************************************
*/


#include "fivewin.ch"

// Estaticas
GLOBAL aStaticsMain[ 5 ]
#xtranslate saDatVers   => aStaticsMain\[1\]
#xtranslate saHeader    => aStaticsMain\[2\]
#xtranslate scPathDB    => aStaticsMain\[3\]
#xtranslate scAppName   => aStaticsMain\[4\]
#xtranslate snBldNumber => aStaticsMain\[5\]

PROCEDURE Main()

   // Camino
   DEFAULT scPathDB:= ".\"       // camino de archivos .dbf, .rc, .log

   // Aplicacion
   scAppName:= "
tuApp"

   // Genera/Actualiza Build
   SetBuild()

   // Cabecera
   saHeader:= { "
/*----------------------------------------------------", ;
                "   Autor.....: ", ;
                "   Correo-e..: ", ;
                "", ; // archivo de...
                "   COPYRIGHT.: (c) "+Str( Year(Date()),,,.T.)+" Tu Empresa", ;
                "------------------------------------------------------*/
" }

   // datos de la Versión
   saDatVers:= Hash( "
Version",         'FILEVERSION 0,17,1,12', ;
                     "
FileVersion",     '"0.017.0212.'+Str(snBldNumber,,,.T.)+'\000"', ;
                     "
FileDescription", '"Sistema de...\000"', ;
                     "
InternalName",    '"tuApp\000"', ;
                     "
LegalCopyright",  '"'+Str( Year(Date()),,,.T.)+' © Tu Empresa\000"', ;
                     "
ProductName",     '"'+Str( Year(Date()),,,.T.)+'  Tu Empresa\000"', ;
                     "
ProductVersion",  '"ßeta 0.017.0212 (Build '+Str(snBldNumber,,,.T.)+')\000"', ;
                     "
OriginalFilename",'"tuApp.exe\000"' )

   // Genera/Actualiza .rc
   SetRC()
   // Genera/Actualiza .log
   SetLog()

// Fin

// ------------------------------------------------------------------------- \\
//        Establecer próximo Build
//
PROCEDURE SetBuild()
local cDBF:= "
BD"+AfterAtNum( "mg", scAppName )    // mio; cambiar segun gusto

   IF !File( scPathDB+cDBF+"
.dbf")
      dbCreate( scPathDB+cDBF+"
.dbf", ;
                { ;
                  { "
BuildNro", "N",  5, 0 } ;
                } )
      SELECT 0
      USE ( scPathDB+cDBF )
      APPEND BLANK

   ELSE
      SELECT 0
      USE ( scPathDB+cDBF )

   ENDIF

   snBldNumber:= ( cDBF )->BuildNro +1

   RLock()                                // lo dejo por compatibilidad. Si se usa un genbuild.exe x aplicacion no es necesario
   REPLACE BuildNro WITH snBldNumber
   UNLOCK
   COMMIT
   CLOSE ( cDBF )

// Fin

// ------------------------------------------------------------------------- \\
//        Archivo app.rc
//
PROCEDURE SetRC()
local oRC, ;
      cArchRC:= scPathDB+scAppName+"
.rc", ;
      nX

   if !File( cArchRC )
      saHeader[4]:= "
  Archivo...: recursos"

      oRC:= TTxtFile():New( cArchRC )
      if oRC:Open()
         for nX:= 1 to Len( saHeader )
            oRC:Add( saHeader[nX] )
         next

         oRC:Add( '1 24 "
d:/bat/theme.man"' )         // corresponde a WindowsXP.Manifest
         oRC:Add( 'PryYo32 ICON "
tuApp.ico"' )        // ícono para la aplicación
         oRC:Add( 'VS_VERSION_INFO VERSIONINFO' )
         oRC:Add( saDatVers["
Version"] )
         oRC:Add( 'FILEFLAGSMASK 0x3F' )
         oRC:Add( 'FILEFLAGS 0x0' )
         oRC:Add( 'FILEOS VOS__WINDOWS32' )
         oRC:Add( 'FILETYPE VFT_APP' )
         oRC:Add( 'FILESUBTYPE VFT2_UNKNOWN'+CRLF )
         oRC:Add( 'BEGIN' )
         oRC:Add( '   BLOCK "
StringFileInfo"' )
         oRC:Add( '   BEGIN' )
         oRC:Add( '      BLOCK "
040904B0"' )
         oRC:Add( '      BEGIN' )
         oRC:Add( '         VALUE "
Author", "Ing. Mario González\000"' )                  // En la aplicación estos datos se recuperan con
         oRC:Add( '         VALUE "
CompanyName", "Ideas & Desarrollos\000"' )             // GetFileVersionInfo() - yo lo tengo en un fuente
         oRC:Add( '         VALUE "
FileVersion", '     +saDatVers["FileVersion"     ] )   // con referencia como de autor anónimo
         oRC:Add( '         VALUE "
FileDescription", ' +saDatVers["FileDescription" ] )
         oRC:Add( '         VALUE "
InternalName", '    +saDatVers["InternalName"    ] )
         oRC:Add( '         VALUE "
LegalCopyright", '  +saDatVers["LegalCopyright"  ] )
         oRC:Add( '         VALUE "
ProductName", '     +saDatVers["ProductName"     ] )
         oRC:Add( '         VALUE "
ProductVersion", '  +saDatVers["ProductVersion"  ] )
         oRC:Add( '         VALUE "
OriginalFilename", '+saDatVers["OriginalFilename"] )
         oRC:Add( '         VALUE "
SpecialBuild","Enlazado con xHarbour 1.2.1 Lic. GNU\000"' )
         oRC:Add( '      END' )
         oRC:Add( '   END'+CRLF )
         oRC:Add( '   BLOCK "
VarFileInfo"' )
         oRC:Add( '   BEGIN' )
         oRC:Add( '      VALUE "
Translation", 0x409, 0x4B0' )
         oRC:Add( '   END' )
         oRC:Add( 'END' )
      else
         MsgAlert( "
No se pudo crear "+cArchRC, "Atención" )
      end
   else
      oRC:= TTxtFile():New( cArchRC )

      oRC:GoTo( 10 )
      oRC:RepLine( saDatVers["
Version"] )
      oRC:GoTo( 23 )
      oRC:RepLine( '         VALUE "
FileVersion", '     +saDatVers["FileVersion"     ] )
      oRC:GoTo( 24 )
      oRC:RepLine( '         VALUE "
FileDescription", ' +saDatVers["FileDescription" ] )
      oRC:GoTo( 25 )
      oRC:RepLine( '         VALUE "
InternalName", '    +saDatVers["InternalName"    ] )
      oRC:GoTo( 26 )
      oRC:RepLine( '         VALUE "
LegalCopyright", '  +saDatVers["LegalCopyright"  ] )
      oRC:GoTo( 27 )
      oRC:RepLine( '         VALUE "
ProductName", '     +saDatVers["ProductName"     ] )
      oRC:GoTo( 28 )
      oRC:RepLine( '         VALUE "
ProductVersion", '  +saDatVers["ProductVersion"  ] )
      oRC:GoTo( 29 )
      oRC:RepLine( '         VALUE "
OriginalFilename", '+saDatVers["OriginalFilename"] )
   end
   oRC:Close()

// Fin

// ------------------------------------------------------------------------- \\
//        Archivo log
//
PROCEDURE SetLog()
local oLog, ;
      cArchLog:= scPathDB+"
GenBuild.log", ;
      nX

   if !File( cArchLog )
      saHeader[4]:= "
  Archivo...: registro de builds"

      oLog:= TTxtFile():New( cArchLog )
      if oLog:Open()
         for nX:= 1 to Len( saHeader )
            oLog:Add( saHeader[nX] )
         next

         oLog:Add( CRLF + ;
                   "
Build "+ ;
                   "
{ " + ;
                   Str( snBldNumber,,, .T. ) + "
, " + ;
                   "
'" + DtoC( Date() ) + "'" + ", " + ;
                   "
'" + Time()         + "'" + ;
                   "
}" )
      else
         MsgAlert( "
No se pudo crear "+cArchLog, "Atención" )
      end

   else
      oLog:= TTxtFile():New( cArchLog )
      oLog:GoTo( 8 )
      oLog:InsLine( "
Build " + ;
                    "
{ " + ;
                    Str( snBldNumber,,, .T. ) + "
, " + ;
                    "
'" + DtoC( Date() ) + "'" + ", " + ;
                    "
'" + Time()         + "'" + ;
                    "
}" )
   end
   oLog:Close()

// Fin

Saludos
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: [OT] Automatizar número de build

Postby MarioG » Thu Feb 23, 2012 3:26 pm

Me he dado cuenta que el fuente dejado no es muy practico en la actualización del .rc, ya que solo automatiza el nro. de Build. Si cambiamos de version se debe cambiar en el fuente.
Este código introduce la creación de un archivo .ini que contiene variables que se las cambia editandoló. De manera que el ejecutable ya no necesita cambios
Cualquier mejora es bienvenida
Code: Select all  Expand view  RUN
/***************
   Prog        : GenBuild.prg
   Autor       : eMeGe
   Módulo      : unico
   Inicio      : 16/02/2012
   Liberado    : 22/02/2012
   Versiones   : 1.10         Se introdujo el uso de archivo .ini; el que guarda
                              variables de la versión que permiten actualizarse
                              sin necesidad de recompilar el fuente.
                 1.00         Operable

   Idea original en: viewtopic.php?f=6&t=23215#p124598 » Jue Ene 05, 2012 6:24 am » by hmpaquito
   version optimizada » by FiveWiDi

   Proyecto:
   1) Se podría generar un solo GenBuild para todos nuestros proyectos,
   en lugar de un genBuild para cada proyecto entonces el .dbf podría ser así:
   dbCreate( scPathDB+cDBF+".dbf", ;
                   { ;
                     { "Aplicacion", "C",  8, 0 }, ;
                     { "BuildNro",   "N",  5, 0 } ;
                   } )
   con indice sobre campo "Aplicación" para realizar las busquedas y
   actualizar el Build en consecuencia

   2) Con el mismo criterio de la generación/mantenimiento del .rc
      se puede hacer el mantenimiento de archivos de instalacion
      Inno
   *****************************************************************
*/


#include "fivewin.ch"

// Estaticas
GLOBAL aStaticsMain[ 4 ]
#xtranslate shIni       => aStaticsMain\[1\]
#xtranslate saHeader    => aStaticsMain\[2\]
#xtranslate scPathDB    => aStaticsMain\[3\]
#xtranslate snBldNumber => aStaticsMain\[4\]

PROCEDURE Main()
local cIni:= "DatVersion.ini", ;
      hIni, ;
      cAnio:= Str( Year(Date()),,,.T.), ;
      cAppExe:= Space( 8 )

   // Camino
   DEFAULT scPathDB:= ".\"       // camino de archivos .dbf, .rc, .log


   // Genera/Actualiza Build
   SetBuild()

   // Cabecera
   saHeader:= "
/*----------------------------------------------------"     +CRLF+ ;
              "   Autor.....: Ing. Mario González"                         +CRLF+ ;
              "   Correo-e..: mario.r.gonzalez@gmail.com"                  +CRLF+ ;
              "   archivo   :"                                             +CRLF+ ;
              "   COPYRIGHT.: (c) "+cAnio+" Ideas & Desarrollos desde 1989"+CRLF+ ;
              "------------------------------------------------------*/
"

   // datos de la Versión
   if !File( scPathDB+cIni )
      msgGet( "
OBLIGATORIO!", "Nombre de la Aplicación", @cAppExe )

      shIni:= Hash()
      shIni["
MAIN" ]:= Hash()    // Obligatorio
      shIni["
Aplic"]:= Hash()
      shIni["
Aplic"]["Exe"    ]:= AllTrim( cAppExe )
      shIni["
Aplic"]["AppIcon"]:= 'AppIcon ICON "resbmp/"'

      shIni["
AppVer"]:= Hash()
      shIni["
AppVer"]["Version"         ]:= 'FILEVERSION 0,0,0,0'
      shIni["
AppVer"]["FileVersion"     ]:= ''
      shIni["
AppVer"]["FileDescription" ]:= ''
      shIni["
AppVer"]["InternalName"    ]:= ''
      shIni["
AppVer"]["LegalCopyright"  ]:= '"'+cAnio+' © Ideas & Desarrollos\000"'
      shIni["
AppVer"]["ProductName"     ]:= ''
      shIni["
AppVer"]["ProductVersion"  ]:= ''
      shIni["
AppVer"]["OriginalFilename"]:= ''

      HB_WriteIni( scPathDB+cIni, shIni, StrTran( saHeader, "
  archivo   :", "   archivo   : .ini" ) )
   else
      shIni := HB_ReadIni( scPathDB+cIni )
      shIni["
AppVer"]["FileVersion"     ] += Str(snBldNumber,,,.T.)+'\000"'
      shIni["AppVer"]["ProductVersion"  ] += " "+Str(snBldNumber,,,.T.)+'
)\000"'
   end

   // Genera/Actualiza .rc
   SetRC()
   // Genera/Actualiza .log
   SetLog()

// Fin

// ------------------------------------------------------------------------- \\
//        Establecer próximo Build
//
PROCEDURE SetBuild()
local cDBF:= "
BuildNro"

   IF !File( scPathDB+cDBF+"
.dbf")
      dbCreate( scPathDB+cDBF+"
.dbf", ;
                { ;
                  { "
BuildNro", "N",  5, 0 } ;
                } )
      SELECT 0
      USE ( scPathDB+cDBF )
      APPEND BLANK

   ELSE
      SELECT 0
      USE ( scPathDB+cDBF )

   ENDIF

   snBldNumber:= ( cDBF )->BuildNro +1

   RLock()                                // lo dejo por compatibilidad. Si se usa un genbuild.exe x aplicacion no es necesario
   REPLACE BuildNro WITH snBldNumber
   UNLOCK
   COMMIT
   CLOSE ( cDBF )

// Fin

// ------------------------------------------------------------------------- \\
//        Archivo .rc de igual nombre al de la aplicación
//
PROCEDURE SetRC()
local oRC, ;
      cArchRC:= scPathDB+shIni["
Aplic"]["Exe"]+".rc", ;
      nX

   if !File( cArchRC )
      oRC:= TTxtFile():New( cArchRC )
      if oRC:Open()
         oRC:Add( StrTran( saHeader, "
  archivo   :", "   archivo   : recursos" ) )

         oRC:Add( '1 24 "
d:/bat/theme.man"' )
         oRC:Add( shIni["
Aplic"]["AppIcon"] )
         oRC:Add( 'VS_VERSION_INFO VERSIONINFO' )
         oRC:Add( shIni["
AppVer"]["Version"] )
         oRC:Add( 'FILEFLAGSMASK 0x3F' )
         oRC:Add( 'FILEFLAGS 0x0' )
         oRC:Add( 'FILEOS VOS__WINDOWS32' )
         oRC:Add( 'FILETYPE VFT_APP' )
         oRC:Add( 'FILESUBTYPE VFT2_UNKNOWN'+CRLF )
         oRC:Add( 'BEGIN' )
         oRC:Add( '   BLOCK "
StringFileInfo"' )
         oRC:Add( '   BEGIN' )
         oRC:Add( '      BLOCK "
040904B0"' )
         oRC:Add( '      BEGIN' )
         oRC:Add( '         VALUE "
Author", "Ing. Mario González\000"' )
         oRC:Add( '         VALUE "
CompanyName", "Ideas & Desarrollos\000"' )
         oRC:Add( '         VALUE "
FileVersion", '     +shIni["AppVer"]["FileVersion"     ] )
         oRC:Add( '         VALUE "
FileDescription", ' +shIni["AppVer"]["FileDescription" ] )
         oRC:Add( '         VALUE "
InternalName", '    +shIni["AppVer"]["InternalName"    ] )
         oRC:Add( '         VALUE "
LegalCopyright", '  +shIni["AppVer"]["LegalCopyright"  ] )
         oRC:Add( '         VALUE "
ProductName", '     +shIni["AppVer"]["ProductName"     ] )
         oRC:Add( '         VALUE "
ProductVersion", '  +shIni["AppVer"]["ProductVersion"  ] )
         oRC:Add( '         VALUE "
OriginalFilename", '+shIni["AppVer"]["OriginalFilename"] )
         oRC:Add( '         VALUE "
SpecialBuild","Enlazado con xHarbour 1.2.1 Lic. GNU\000"' )
         oRC:Add( '      END' )
         oRC:Add( '   END'+CRLF )
         oRC:Add( '   BLOCK "
VarFileInfo"' )
         oRC:Add( '   BEGIN' )
         oRC:Add( '      VALUE "
Translation", 0x409, 0x4B0' )
         oRC:Add( '   END' )
         oRC:Add( 'END' )
      else
         MsgAlert( "
No se pudo crear "+cArchRC, "Atención" )
      end
   else
      oRC:= TTxtFile():New( cArchRC )

      oRC:GoTo( 8 )
      oRC:RepLine( shIni["
Aplic"]["AppIcon"] )
      oRC:GoTo( 10 )
      oRC:RepLine( shIni["
AppVer"]["Version"] )
      oRC:GoTo( 24 )
      oRC:RepLine( '         VALUE "
FileVersion", '     +shIni["AppVer"]["FileVersion"     ] )
      oRC:GoTo( 25 )
      oRC:RepLine( '         VALUE "
FileDescription", ' +shIni["AppVer"]["FileDescription" ] )
      oRC:GoTo( 26 )
      oRC:RepLine( '         VALUE "
InternalName", '    +shIni["AppVer"]["InternalName"    ] )
      oRC:GoTo( 28 )
      oRC:RepLine( '         VALUE "
ProductName", '     +shIni["AppVer"]["ProductName"     ] )
      oRC:GoTo( 29 )
      oRC:RepLine( '         VALUE "
ProductVersion", '  +shIni["AppVer"]["ProductVersion"  ] )
      oRC:GoTo( 30 )
      oRC:RepLine( '         VALUE "
OriginalFilename", '+shIni["AppVer"]["OriginalFilename"] )
   end
   oRC:Close()

// Fin

// ------------------------------------------------------------------------- \\
//        Archivo log
//
PROCEDURE SetLog()
local oLog, ;
      cArchLog:= scPathDB+"
GenBuild.log", ;
      nX

   if !File( cArchLog )
      oLog:= TTxtFile():New( cArchLog )
      if oLog:Open()
         oLog:Add( StrTran( saHeader, "
  archivo   :", "   archivo   : registros" ))
         oLog:Add( CRLF + ;
                   "
Build "+ ;
                   "
{ " + ;
                   Str( snBldNumber,,, .T. ) + "
, " + ;
                   "
'" + DtoC( Date() ) + "'" + ", " + ;
                   "
'" + Time()         + "'" + ;
                   "
}" )
      else
         MsgAlert( "
No se pudo crear "+cArchLog, "Atención" )
      end

   else
      oLog:= TTxtFile():New( cArchLog )
      oLog:GoTo( 8 )
      oLog:InsLine( "
Build " + ;
                    "
{ " + ;
                    Str( snBldNumber,,, .T. ) + "
, " + ;
                    "
'" + DtoC( Date() ) + "'" + ", " + ;
                    "
'" + Time()         + "'" + ;
                    "
}" )
   end
   oLog:Close()

// Fin

Aclaración: uso funciones xHarbour ( HB_WriteIni() y HB_ReadIni() )

Saludos
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 73 guests