Files
harbour-core/harbour/contrib/makefile.prg
Viktor Szakats 9ddccee5ca 2010-06-26 19:29 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbqt/utils/hbqtui.prg
  * contrib/hbqt/utils/hbqtui.hbp
    - Deleted HBQT dependency. It's not needed for this tool.

  * contrib/makefile.prg
    + Rearranged build order to satisfy dependencies.
2010-06-26 17:30:17 +00:00

298 lines
9.4 KiB
Plaintext

/*
* $Id$
*/
/*
* Copyright 2009 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
5. hbmk2 fix to create work dir before calling out plugin
*/
#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 aLibPass1 := {;
"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 aLibsPass2 := {;
"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" ,;
"hbtip/hbtip.hbp" ,;
"hbtip/hbtipssl.hbp" ,; /* uses: hbssl */
"hbtpathy/hbtpathy.hbp" ,;
"hbwin/hbwin.hbp" ,;
"hbxpp/hbxpp.hbp" ,;
"hbziparc/hbziparc.hbp" ,; /* uses: hbmzip */
"rddbmcdx/hbbmcdx.hbp" ,;
"xhb/xhb.hbp" ,; /* uses: hbct, hbtip, hbwin */
"gtwvg/gtwvg.hbp" } /* uses: hbwin */
LOCAL aUtils := {;
"hbnetio/utils/netiosrv.hbp" ,; /* uses: hbnetio */
"hbqt/utils/hbqtui.hbp" ,;
"hbide/hbide.hbp" } /* uses: hbxbp, hbqt */
LOCAL aAll := {;
aImpLibs ,;
aLibsPass1 ,;
aLibsPass2 ,;
aUtils,;
hb_ATokens( GetEnv( "HB_ADDONS_LIB" ),, .T. ),;
hb_ATokens( GetEnv( "HB_ADDONS_BIN" ),, .T. ) }
LOCAL aAllType := {;
"implib" ,;
"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 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" ) )
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 )