2010-07-07 17:13 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)

* INSTALL
  * contrib/make.hbs
    + Added standalone mode. The goal is to emulate GNU Make's
      nice in-place build feature for contribs hbmk2 make files.
      Run with 'hbrun ../make.hbs [clean] [install]'
      (install mode's installation phase doesn't work yet)
    + Added contrib type autodetection.
    * HB_ADDONS_LIB, HB_ADDONS_BIN merged into HB_BUILD_ADDONS,
      now the type is autodetected.
    % Move hbmk2 cmdline to HBMK_OPTION only on MS-DOS hosts.
    + Added *nix script header.
    + Updated TODO list.
    ; NOTE: Most tasks are ready now regarding make system 
            migration in contrib area from GNU Make to hbmk2.

  * config/postinst.hbs
    + Added native .hbl generation logic which doesn't require
      hbi18n executable. (not used yet)

  * bin/hbxpatch.hbs
  * contrib/make.hbs
    + Added svn:executable flag.
This commit is contained in:
Viktor Szakats
2010-07-07 15:18:24 +00:00
parent 14122cb345
commit 41ae1afb6c
5 changed files with 261 additions and 45 deletions

View File

@@ -16,6 +16,30 @@
The license applies to all entries newer than 2009-04-28.
*/
2010-07-07 17:13 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* INSTALL
* contrib/make.hbs
+ Added standalone mode. The goal is to emulate GNU Make's
nice in-place build feature for contribs hbmk2 make files.
Run with 'hbrun ../make.hbs [clean] [install]'
(install mode's installation phase doesn't work yet)
+ Added contrib type autodetection.
* HB_ADDONS_LIB, HB_ADDONS_BIN merged into HB_BUILD_ADDONS,
now the type is autodetected.
% Move hbmk2 cmdline to HBMK_OPTION only on MS-DOS hosts.
+ Added *nix script header.
+ Updated TODO list.
; NOTE: Most tasks are ready now regarding make system
migration in contrib area from GNU Make to hbmk2.
* config/postinst.hbs
+ Added native .hbl generation logic which doesn't require
hbi18n executable. (not used yet)
* bin/hbxpatch.hbs
* contrib/make.hbs
+ Added svn:executable flag.
2010-07-07 15:40 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* src/vm/extend.c
* include/hbapicdp.h

View File

@@ -654,10 +654,8 @@ HARBOUR
external libraries.
- HB_EXTERNALLIBS=[<list>] Build space separated <list> of external
libraries. Build all if left empty (default).
- HB_ADDONS_LIB=<list> Build space separated <list> of additional
library .hbp projects.
- HB_ADDONS_BIN=<list> Build space separated <list> of additional
executable .hbp projects.
- HB_BUILD_ADDONS=<list> Build space separated <list> of additional .hbp
projects.
- HB_COMPILER_VER=[<ver>] Set C compiler version. This is used with msvc
and mingw/cygwin targets currently.
<ver> format:

0
harbour/bin/hbxpatch.hbs Normal file → Executable file
View File

View File

@@ -96,10 +96,10 @@ PROCEDURE Main()
FOR EACH tmp IN Directory( "utils" + hb_ps() + hb_osFileMask(), "D" )
IF "D" $ tmp[ F_ATTR ] .AND. !( tmp[ F_NAME ] == "." ) .AND. !( tmp[ F_NAME ] == ".." )
FOR EACH cFile IN Directory( "utils" + hb_ps() + tmp[ F_NAME ] + hb_ps() + "*.po" )
FOR EACH aFile IN Directory( "utils" + hb_ps() + tmp[ F_NAME ] + hb_ps() + "*.po" )
mk_hb_processRun( PathSepToSelf( GetEnv( "HB_HOST_BIN_DIR" ) ) + hb_ps() + "hbi18n" +;
" -q -g -o" + PathSepToSelf( GetEnv( "HB_BIN_INSTALL" ) ) + hb_ps() + FN_ExtSet( cFile[ F_NAME ], ".hbl" ) +;
" " + PathSepToSelf( "utils" + hb_ps() + tmp[ F_NAME ] + hb_ps() + cFile[ F_NAME ] ) )
" -q -g -o" + PathSepToSelf( GetEnv( "HB_BIN_INSTALL" ) ) + hb_ps() + FN_ExtSet( aFile[ F_NAME ], ".hbl" ) +;
" " + PathSepToSelf( "utils" + hb_ps() + tmp[ F_NAME ] + hb_ps() + aFile[ F_NAME ] ) )
NEXT
ENDIF
NEXT
@@ -150,6 +150,24 @@ PROCEDURE Main()
RETURN
STATIC FUNCTION mk_hbl( cIn, cOut )
LOCAL cErrorMsg
LOCAL aTrans
aTrans := __i18n_potArrayLoad( cIn, @cErrorMsg )
IF aTrans != NIL
IF hb_MemoWrit( cOut, hb_i18n_SaveTable( __i18n_hashTable( __i18n_potArrayToHash( aTrans, .F. ) ) ) )
OutStd( "! Created " + cOut + " <- " + cIn + hb_eol() )
RETURN .T.
ELSE
OutErr( "! Error: Cannot create file: " + cOut + hb_eol() )
ENDIF
ELSE
OutErr( "! Error: Loading translation: " + cIn + " (" + cErrorMsg + ")" + hb_eol() )
ENDIF
RETURN .F.
STATIC FUNCTION mk_hb_processRun( cCommand )
OutStd( cCommand + hb_eol() )

252
harbour/contrib/make.hbs Normal file → Executable file
View File

@@ -1,3 +1,4 @@
#!/usr/bin/hbrun --hb:gtcgi
/*
* $Id$
*/
@@ -12,10 +13,15 @@
/* TODO:
1. error handling / reporting / feedback
2. solve the automatic in-dir make clean/install/rebuild workflow
2. clean this source to avoid redundancy
3. solve stdalone install and HB_BUILD_CONTRIB_DLL support
4. hbmk2 location detection in standalone mode
(move hbmk2 to core lib?)
5. gnumake mode: automatically decide about build order,
based on dependencies (implibs -> libs[TODO!] -> exes)
*/
/* #pragma warninglevel=3 */
#pragma warninglevel=3
/* TOFIX: Ugly hack to avoid #include "directry.ch" */
#define F_NAME 1 /* File name */
@@ -27,12 +33,170 @@
#define _ACT_INC_INST 3
#define _ACT_INC_REBUILD_INST 4
STATIC s_lStdAlone
STATIC s_lTest
STATIC s_lMigr
PROCEDURE Main( ... )
IF Empty( GetEnv( "HB_HOST_BIN_DIR" ) )
StandAlone( ... )
ELSE
GNUMake( ... )
ENDIF
RETURN
/*
Workflow translation for standalone operation:
GNU Make parameter nAction hbmk2 options
-- -------------- -------------- ---------------------- -------------------------
#1 clean clean _ACT_CLEAN -clean
#2 install install _ACT_INC_INST -inc -instpath=
#3 clean install clean install _ACT_INC_REBUILD_INST -inc -instpath= -rebuild
#4 _ACT_INC -inc
*/
PROCEDURE StandAlone( ... )
LOCAL aParams
LOCAL aLibs
LOCAL aFile
LOCAL cType
LOCAL cBase := ""
LOCAL cProject
LOCAL cBaseOptions
LOCAL cOptionsPre
LOCAL cOptionsPost
LOCAL cTargetDir
LOCAL nAction
LOCAL tmp
s_lTest := .F.
aLibs := {}
FOR EACH aFile IN Directory( "*.hbi" )
AAdd( aLibs, aFile[ F_NAME ] )
NEXT
FOR EACH aFile IN Directory( "*.hbp" )
AAdd( aLibs, aFile[ F_NAME ] )
NEXT
IF Empty( Len( aLibs ) )
RETURN
ENDIF
aParams := hb_AParams()
DO CASE
CASE AScan( aParams, "clean" ) > 0 .AND. ;
AScan( aParams, "install" ) > 0 .AND. ;
AScan( aParams, "install" ) > AScan( aParams, "clean" )
nAction := _ACT_INC_REBUILD_INST
CASE AScan( aParams, "clean" ) > 0
nAction := _ACT_CLEAN
CASE AScan( aParams, "install" ) > 0
nAction := _ACT_INC_INST
OTHERWISE
nAction := _ACT_INC
ENDCASE
IF nAction == _ACT_EXIT
ErrorLevel( 0 )
RETURN
ENDIF
SetCancel( .F. )
/* Converting build options to hbmk2 options */
cBaseOptions := "-quiet -lang=en -width=0 -q0"
IF GetEnv( "HB_BUILD_MODE" ) == "cpp"
cBaseOptions += " -cpp=yes"
ELSEIF GetEnv( "HB_BUILD_MODE" ) == "c"
cBaseOptions += " -cpp=no"
ENDIF
IF GetEnv( "HB_BUILD_DEBUG" ) == "yes"
cBaseOptions += " -debug"
ENDIF
IF ! Empty( GetEnv( "HB_BUILD_NAME" ) )
cBaseOptions += " -build=" + GetEnv( "HB_BUILD_NAME" )
ENDIF
FOR EACH tmp IN aParams
IF !( tmp $ "install|clean" )
cBaseOptions += " " + tmp
ENDIF
NEXT
hb_setenv( "HB_HOST_BIN_DIR", hb_DirBase() + ".." + hb_ps() + "bin" )
FOR EACH cProject IN aLibs
cType := hbmk2_project_type( cBase + cProject )
cProject := StrTran( cProject, "\", "/" )
cOptionsPre := cBaseOptions
cOptionsPost := ""
SWITCH cType
CASE "hblib"
CASE "hbimplib"
cTargetDir := "${HB_LIB}"
EXIT
CASE "hbdyn"
cTargetDir := "${HB_DYN}"
IF GetEnv( "HB_BUILD_SHARED" ) == "yes"
cOptionsPre += " -shared"
ENDIF
EXIT
CASE "hbexe"
cTargetDir := "${HB_BIN}"
IF GetEnv( "HB_BUILD_SHARED" ) == "yes"
cOptionsPre += " -shared"
ENDIF
EXIT
ENDSWITCH
IF cType == "hrb"
LOOP
ENDIF
IF nAction == _ACT_CLEAN
cOptionsPre += " -clean"
ELSE
cOptionsPre += " -inc"
IF nAction == _ACT_INC_REBUILD_INST
cOptionsPre += " -rebuild"
ENDIF
ENDIF
call_hbmk2( cBase + cProject, cTargetDir, cOptionsPre, cOptionsPost, .F. )
NEXT
ErrorLevel( 0 )
RETURN
/*
Workflow translation from GNU Make to hbmk2:
GNU Make parameter HB_MAKECMDGOALS nAction hbmk2 options
-- -------------- ---------- ---------------- ---------------------- -------------------------
#1 clean clean clean _ACT_CLEAN -clean
#2 install install install _ACT_INC_INST -inc -instpath=
#3 clean install clean clean install _ACT_CLEAN -clean
install clean install _ACT_INC_REBUILD_INST -inc -instpath= -rebuild
#4 install clean install install clean _ACT_INC_INST -inc -instpath=
clean install clean _ACT_CLEAN -clean
#5 all _ACT_INC -inc
*/
PROCEDURE GNUMake( ... )
LOCAL cBase := ""
LOCAL cRoot := "../"
@@ -125,7 +289,8 @@ PROCEDURE Main( ... )
"hbide/hbide.hbp" } /* uses: hbxbp, hbqt */
LOCAL aAll
LOCAL hItem
LOCAL aList
LOCAL cType
LOCAL cProject
LOCAL cProjectDir
@@ -146,7 +311,6 @@ PROCEDURE Main( ... )
LOCAL tmp
LOCAL nAction
s_lStdAlone := Empty( "HB_HOST_BIN_DIR" )
s_lMigr := "migr" $ hb_cmdLine()
IF s_lMigr
@@ -165,21 +329,6 @@ PROCEDURE Main( ... )
"hbnetio/utils/hbnetio.hbp" }
ENDIF
/*
Workflow translation from GNU Make to hbmk2:
GNU Make parameter HB_MAKECMDGOALS nAction hbmk2 options
-- -------------- ---------- ---------------- ---------------------- -------------------------
#1 clean clean clean _ACT_CLEAN -clean
#2 install install install _ACT_INC_INST -inc -instpath=
#3 clean install clean clean install _ACT_CLEAN -clean
install clean install _ACT_INC_REBUILD_INST -inc -instpath= -rebuild
#4 install clean install install clean _ACT_INC_INST -inc -instpath=
clean install clean _ACT_CLEAN -clean
#5 all _ACT_INC -inc
*/
/* Determine the mode of operation */
s_lTest := "test" $ hb_cmdLine()
@@ -292,20 +441,21 @@ PROCEDURE Main( ... )
/* Start building */
aAll := {;
{ "type" => "implib", "list" => aImpLibs },;
{ "type" => "lib" , "list" => aLibsPass0 },;
{ "type" => "lib" , "list" => aLibsPass1 },;
{ "type" => "lib" , "list" => aLibsPass2 },;
{ "type" => "lib" , "list" => aLibsPass3 },;
{ "type" => "bin" , "list" => aUtils },;
{ "type" => "lib" , "list" => hb_ATokens( GetEnv( "HB_ADDONS_LIB" ),, .T. ) },;
{ "type" => "bin" , "list" => hb_ATokens( GetEnv( "HB_ADDONS_BIN" ),, .T. ) } }
aImpLibs,;
aLibsPass0,;
aLibsPass1,;
aLibsPass2,;
aLibsPass3,;
aUtils,;
hb_ATokens( GetEnv( "HB_BUILD_ADDONS" ),, .T. ) }
FOR EACH hItem IN aAll
FOR EACH cProject IN hItem[ "list" ]
FOR EACH aList IN aAll
FOR EACH cProject IN aList
IF ! Empty( cProject )
cType := hbmk2_project_type( cBase + cProject )
cProject := StrTran( cProject, "\", "/" )
IF ( tmp := At( "/", cProject ) ) > 0
@@ -322,13 +472,20 @@ PROCEDURE Main( ... )
cOptionsPre := cBaseOptions
cOptionsPost := ""
SWITCH hItem[ "type" ]
CASE "lib"
CASE "implib"
SWITCH cType
CASE "hblib"
CASE "hbimplib"
cTargetDir := "${_HB_L_}"
cInstallDirVar := "_HB_LIB_INSTALL"
EXIT
CASE "bin"
CASE "hbdyn"
cTargetDir := "${_HB_D_}"
cInstallDirVar := "_HB_DYN_INSTALL"
IF GetEnv( "HB_BUILD_SHARED" ) == "yes"
cOptionsPre += " -shared"
ENDIF
EXIT
CASE "hbexe"
cTargetDir := "${_HB_B_}"
cInstallDirVar := "_HB_BIN_INSTALL"
IF GetEnv( "HB_BUILD_SHARED" ) == "yes"
@@ -337,6 +494,10 @@ PROCEDURE Main( ... )
EXIT
ENDSWITCH
IF cType == "hrb"
LOOP
ENDIF
IF nAction == _ACT_CLEAN
cOptionsPre += " -clean"
ELSE
@@ -347,9 +508,9 @@ PROCEDURE Main( ... )
IF nAction == _ACT_INC_INST .OR. ;
nAction == _ACT_INC_REBUILD_INST
IF ! Empty( GetEnv( cInstallDirVar ) ) .AND. ;
( ! ( hItem[ "type" ] == "implib" ) .OR. GetEnv( "HB_BUILD_IMPLIB" ) == "yes" )
( ! ( cType == "hbimplib" ) .OR. GetEnv( "HB_BUILD_IMPLIB" ) == "yes" )
cOptionsPre += " -instpath=${" + cInstallDirVar + "}/"
IF hItem[ "type" ] == "lib"
IF cType == "hblib"
cOptionsPre += " -instpath=inc:${_HB_INC_INSTALL}/"
ENDIF
ENDIF
@@ -359,7 +520,7 @@ PROCEDURE Main( ... )
call_hbmk2( cBase + cProject, cTargetDir, cOptionsPre, cOptionsPost, .F. )
/* Highly experimental */
IF hItem[ "type" ] == "lib" .AND. GetEnv( "HB_BUILD_CONTRIB_DLL" ) == "yes" .AND. ;
IF cType == "hblib" .AND. GetEnv( "HB_BUILD_CONTRIB_DLL" ) == "yes" .AND. ;
hb_FileExists( FN_ExtSet( cBase + cProject, ".hbc" ) )
cInstallDirVar := "_HB_DYN_INSTALL"
@@ -405,9 +566,13 @@ STATIC FUNCTION call_hbmk2( cProject, cTargetDir, cOptionsPre, cOptionsPost, lDy
/* Keeping cmdline as short as possible. Also making sure that user settings
do not interfere with the std build process. */
hb_setenv( "HBMK_OPTIONS", cOptionsPre )
#if defined( __PLATFORM__DOS )
hb_setenv( "HBMK_OPTIONS", cOptionsPre )
cOptionsPre := ""
#endif
nErrorLevel := mk_hb_processRun( PathSepToSelf( GetEnv( "HB_HOST_BIN_DIR" ) ) + hb_ps() + "hbmk2" +;
" " + cOptionsPre +;
" " + cProject +;
cOptionsPost +;
" -workdir=" + cTargetDir + "/${hb_work}/" + cName + iif( lDyn, "${hb_workdynsub}", "" ) +;
@@ -425,6 +590,17 @@ STATIC FUNCTION mk_hb_processRun( cCommand )
RETURN iif( s_lTest, 0, hb_processRun( cCommand ) )
STATIC FUNCTION hbmk2_project_type( cFileName )
LOCAL cFile := MemoRead( cFileName )
IF "-hblib" $ cFile ; RETURN "hblib"
ELSEIF "-hbimplib" $ cFile ; RETURN "hbimplib"
ELSEIF "-hbdyn" $ cFile ; RETURN "hbdyn"
ELSEIF "-gh" $ cFile ; RETURN "hrb"
ENDIF
RETURN "hbexe"
STATIC FUNCTION FN_ExtSet( cFileName, cExt )
LOCAL cDir, cName