Files
harbour-core/harbour/contrib/makefile.prg
Viktor Szakats 0d75628529 2010-06-28 10:45 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* external/patchup.prg
    * Changed gtcgi force option to be the more portable-style one.

  * contrib/hbqt/utils/hbqtui.prg
    + Added error message
    ; TOFIX: This tool needs serious ruggedizing to be ready for
             production environment. It just fails to give _any_
             on screen feedback about what's happening, or what
             fails. This means that the caller will fail in various
             ways depending on how hbqtui failed. It also doesn't
             return anything via errorlevel. Pritpal can you look
             at it?

  * contrib/Makefile
  * contrib/makefile.prg
    + Added experimental call out from GNU Make to Harbour
      contrib make orchestrator script.
2010-06-28 08:45:41 +00:00

309 lines
9.7 KiB
Plaintext

/*
* $Id$
*/
/*
* Copyright 2010 Viktor Szakats (harbour.01 syenar.hu)
* See COPYING for licensing terms.
*/
/* TODO:
1. error handling / reporting / feedback
2. copy headers and other stuff (hbide)
3. add .dll generation for contrib libs
4. first do all the 'clean's
*/
#pragma warninglevel=3
/* TOFIX: Ugly hack to avoid #include "directry.ch" */
#define F_NAME 1 /* File name */
#define F_ATTR 5 /* File attribute */
#define _PS_ hb_osPathSeparator()
STATIC s_lTest
PROCEDURE Main( ... )
LOCAL cBase := "contrib/"
LOCAL aImpLibs := {;
"gtalleg/gtalleg.hbi" ,;
"hbblat/hbblat.hbi" ,;
"hbcairo/hbcairo.hbi" ,;
"hbcurl/hbcurl.hbi" ,;
"hbfbird/hbfbird.hbi" ,;
"hbfimage/hbfimage.hbi" ,;
"hbgd/hbgd.hbi" ,;
"hbhpdf/hbhpdf.hbi" ,;
"hbmysql/hbmysql.hbi" ,;
"hbpgsql/hbpgsql.hbi" ,;
"hbssl/hbssl.hbi" ,;
"rddads/rddads.hbi" ,;
"sddfb/sddfb.hbi" ,;
"sddmy/sddmy.hbi" ,;
"sddoci/sddoci.hbi" ,;
"sddpg/sddpg.hbi" }
LOCAL aLibsPass1 := {;
"hbblink/hbblink.hbp" ,;
"hbbz2/hbbz2.hbp" ,;
"hbclipsm/hbclipsm.hbp" ,;
"hbcomm/hbcomm.hbp" ,;
"hbct/hbct.hbp" ,;
"hbfoxpro/hbfoxpro.hbp" ,;
"hbfship/hbfship.hbp" ,;
"hbgt/hbgt.hbp" ,;
"hbmemio/hbmemio.hbp" ,;
"hbmisc/hbmisc.hbp" ,;
"hbmzip/hbmzip.hbp" ,;
"hbnetio/hbnetio.hbp" ,;
"hbnf/hbnf.hbp" ,;
"hbodbc/hbodbc.hbp" ,;
"hbsms/hbsms.hbp" ,;
"hbsqlit3/hbsqlit3.hbp" ,;
"hbtpathy/hbtpathy.hbp" ,;
"hbwin/hbwin.hbp" ,;
"hbxpp/hbxpp.hbp" ,;
"rddbmcdx/hbbmcdx.hbp" }
LOCAL aLibsPass2 := {;
"gtalleg/gtalleg.hbp" ,;
"gtalleg/gtallegs.hbp" ,;
"hbblat/hbblat.hbp" ,;
"hbcairo/hbcairo.hbp" ,;
"hbcups/hbcups.hbp" ,;
"hbcurl/hbcurl.hbp" ,;
"hbcurl/hbcurls.hbp" ,;
"hbfbird/hbfbird.hbp" ,;
"hbfimage/hbfimage.hbp" ,;
"hbgd/hbgd.hbp" ,; /* uses: hbct */
"hbhpdf/hbhpdf.hbp" ,;
"hbmysql/hbmysql.hbp" ,;
"hbpgsql/hbpgsql.hbp" ,;
"hbqt/hbqt.hbp" ,;
"hbqt/hbqtcore.hbp" ,;
"hbqt/hbqtcores.hbp" ,;
"hbqt/hbqtgui.hbp" ,;
"hbqt/hbqtguis.hbp" ,;
"hbqt/hbqtnetwork.hbp" ,;
"hbqt/hbqtnetworks.hbp" ,;
"hbqt/hbqts.hbp" ,;
"hbssl/hbssl.hbp" ,;
"hbssl/hbssls.hbp" ,;
"hbxbp/hbxbp.hbp" ,; /* uses: hbqt */
"rddads/rddads.hbp" ,;
"rddsql/rddsql.hbp" ,;
"sddfb/sddfb.hbp" ,; /* uses: rddsql */
"sddmy/sddmy.hbp" ,; /* uses: rddsql */
"sddoci/sddoci.hbp" ,; /* uses: rddsql */
"sddodbc/sddodbc.hbp" ,; /* uses: rddsql */
"sddpg/sddpg.hbp" ,; /* uses: rddsql */
"sddsqlt3/sddsqlt3.hbp" } /* uses: rddsql */
LOCAL aLibsPass3 := {;
"gtwvg/gtwvg.hbp" ,; /* uses: hbwin */
"hbtip/hbtip.hbp" ,;
"hbtip/hbtipssl.hbp" ,; /* uses: hbssl */
"hbziparc/hbziparc.hbp" ,; /* uses: hbmzip */
"xhb/xhb.hbp" } /* uses: hbct, hbtip, hbwin */
LOCAL aUtils := {;
"hbnetio/utils/netiosrv.hbp" ,; /* uses: hbnetio */
"hbqt/utils/hbqtui.hbp" ,; /* uses: hbqt */
"hbide/hbide.hbp" } /* uses: hbxbp, hbqt */
LOCAL aAll := {;
aImpLibs ,;
aLibsPass1 ,;
aLibsPass2 ,;
aLibsPass3 ,;
aUtils,;
hb_ATokens( GetEnv( "HB_ADDONS_LIB" ),, .T. ),;
hb_ATokens( GetEnv( "HB_ADDONS_BIN" ),, .T. ) }
LOCAL aAllType := {;
"implib" ,;
"lib" ,;
"lib" ,;
"lib" ,;
"bin" ,;
"lib" ,;
"bin" }
LOCAL chunk
LOCAL cProject
LOCAL cProjectDir
LOCAL cType
LOCAL cInstallDirVar
LOCAL cTargetDir
LOCAL cOptions := ""
LOCAL lBuildName
LOCAL cFilter := GetEnv( "HB_CONTRIBLIBS" )
LOCAL aFilter
LOCAL lFilterNegative
LOCAL aParams := hb_AParams()
LOCAL tmp
IF Len( aParams ) == 1 .AND. aParams[ 1 ] == "TEST"
OutStd( "! New contrib make orchestrator test run: OK" + hb_osNewLine() )
ErrorLevel( 0 )
RETURN
ENDIF
IF Empty( GetEnv( "HB_PLATFORM" ) ) .OR. ;
Empty( GetEnv( "HB_COMPILER" ) ) .OR. ;
Empty( GetEnv( "HB_HOST_BIN_DIR" ) )
ErrorLevel( 9 )
RETURN
ENDIF
IF cFilter == "no"
ErrorLevel( 0 )
RETURN
ENDIF
SetCancel( .F. )
/* Converting build options to hbmk2 options */
IF GetEnv( "HB_BUILD_MODE" ) == "cpp"
cOptions += " -cpp=yes"
ELSEIF GetEnv( "HB_BUILD_MODE" ) == "c"
cOptions += " -cpp=no"
ENDIF
IF GetEnv( "HB_BUILD_DEBUG" ) == "yes"
cOptions += " -debug"
ENDIF
IF ! Empty( GetEnv( "HB_BUILD_NAME" ) )
cOptions += " -build=" + GetEnv( "HB_BUILD_NAME" )
lBuildName := .T.
ELSE
lBuildName := .F.
ENDIF
FOR EACH tmp IN aParams
tmp := Lower( tmp )
NEXT
s_lTest := AScan( aParams, "test" ) > 0
/* Parse filter */
aFilter := iif( Empty( cFilter ), {}, hb_ATokens( cFilter,, .T. ) )
IF Len( aFilter ) >= 1 .AND. aFilter[ 1 ] == "no"
hb_ADel( aFilter, 1, .T. )
lFilterNegative := .T.
ELSE
lFilterNegative := .F.
ENDIF
/* Start building */
FOR EACH chunk, cType IN aAll, aAllType
FOR EACH cProject IN chunk
IF ! Empty( cProject )
cProject := StrTran( cProject, "\", "/" )
IF ( tmp := At( "/", cProject ) ) > 0
cProjectDir := Left( cProject, tmp - 1 )
ELSE
cProjectDir := ""
ENDIF
IF Empty( aFilter ) .OR. ;
iif( lFilterNegative,;
AScan( aFilter, {| tmp | tmp == cProjectDir } ) == 0,;
AScan( aFilter, {| tmp | tmp == cProjectDir } ) > 0 )
SWITCH cType
CASE "lib"
CASE "implib"
cTargetDir := "lib/${hb_plat}/${hb_comp}" + iif( lBuildName, "/${hb_build}", "" )
cInstallDirVar := "HB_LIB_INSTALL_"
EXIT
CASE "bin"
cTargetDir := "bin/${hb_plat}/${hb_comp}" + iif( lBuildName, "/${hb_build}", "" )
cInstallDirVar := "HB_BIN_INSTALL_"
EXIT
ENDSWITCH
IF AScan( aParams, "clean" ) > 0
call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -clean", .F. )
ENDIF
IF AScan( aParams, "install" ) > 0 .AND. ;
! Empty( GetEnv( cInstallDirVar ) ) .AND. ;
( ! ( cType == "implib" ) .OR. GetEnv( "HB_BUILD_IMPLIB" ) == "yes" )
call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -instpath=${" + cInstallDirVar + "}", .F. )
ELSEIF !( Len( aParams ) == 1 .AND. aParams[ 1 ] == "clean" )
call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -inc", .F. )
ENDIF
IF cType == "lib" .AND. GetEnv( "HB_BUILD_CONTRIB_DLL" ) == "yes" .AND. ;
hb_FileExists( FN_ExtSet( cBase + cProject, ".hbc" ) )
cInstallDirVar := "HB_BIN_INSTALL_"
IF AScan( aParams, "clean" ) > 0
call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -clean", .T. )
ENDIF
IF AScan( aParams, "install" ) > 0 .AND. ;
! Empty( GetEnv( cInstallDirVar ) ) .AND. ;
( ! ( cType == "implib" ) .OR. GetEnv( "HB_BUILD_IMPLIB" ) == "yes" )
call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -instpath=${" + cInstallDirVar + "}", .T. )
ELSEIF !( Len( aParams ) == 1 .AND. aParams[ 1 ] == "clean" )
call_hbmk2( cBase + cProject, cTargetDir, cOptions + " -inc", .T. )
ENDIF
ENDIF
ELSE
/* OutStd( hb_StrFormat( "'%s' project skipped" + hb_osNewLine(), cProject ) ) */
ENDIF
ENDIF
NEXT
NEXT
ErrorLevel( 0 )
RETURN
STATIC FUNCTION call_hbmk2( cProject, cTargetDir, cOptions, lDyn )
LOCAL nErrorLevel
LOCAL cDir, cName
hb_FNameSplit( cProject, @cDir, @cName )
/* TOFIX: Add -implib option. It collides with static lib so needs to be resolved. */
nErrorLevel := mk_hb_processRun( GetEnv( "HB_HOST_BIN_DIR" ) + _PS_ + "hbmk2" +;
" -quiet -lang=en -width=1000 -q0" + cOptions +;
" " + cProject +;
iif( lDyn, " -hbdyn -nohblib- " + FN_ExtSet( cProject, ".hbc" ), "" ) +;
" -workdir=" + cTargetDir + "/${hb_work}/" + cName + "${hb_workdynsub}" +;
" -o" + cTargetDir + "/" )
IF nErrorLevel != 0
OutStd( hb_StrFormat( "'%s' returned status: %s" + hb_osNewLine(), cProject, hb_ntos( nErrorLevel ) ) )
RETURN .F.
ENDIF
RETURN .T.
STATIC FUNCTION mk_hb_processRun( cCommand )
OutStd( cCommand + hb_osNewLine() )
RETURN iif( s_lTest, 0, hb_processRun( cCommand ) )
STATIC FUNCTION FN_ExtSet( cFileName, cExt )
LOCAL cDir, cName
hb_FNameSplit( cFileName, @cDir, @cName )
RETURN hb_FNameMerge( cDir, cName, cExt )