[Gambas-user] Multi-purpose SHELL process in gambas2-2.0.0

M0E Lnx m0e.lnx at ...626...
Fri Feb 29 21:39:49 CET 2008


Hello again fellow gambasian coders...

I'm kinda stuck and require your expertise on a problem I'm having...
I've been trying this for a couple of days, with the same results,
trying to see if anyone's got a good suggestiongthat might help me

Here is the idea.
This application is supposed to build software from source. From that
we gather that there are several steps to be taken from extracting the
source, to installing the resulting binaries.
In the previous versions of this application, I used one(1) process
for each step of the build process (up to 4). This is sort of messy
and hard to track, but I made it work.
In an effort to consolidate the code, and offer better error checking
and more accurary, I'm trying to have ONLY ONE(1) process and have
functions to tell the process what to do.

It almost works, But i'm having problems where it's not triggering the
right sequence, and it seems to not be executing all of the code in
the process_kill() event.

Please look at this piece of code...

'Gambas class file
PUBLIC hBuildProc AS Process
PUBLIC iBuildState AS Integer ' Enumerated build state (0 - 5)
PUBLIC sBuildType AS String PRIVATE sShellCmd AS String

PUBLIC SUB process_read()
DIM iReturnvalue AS Integer
DIM sLine AS String
READ #LAST, sLine, -256
' Insert the buffer read into the text area for the user to see
FrmBuildView.taTerm.pos = Len(FrmBuildView.taTerm.text)
FrmBuildView.taTerm.Insert(sLine)
END

PUBLIC SUB process_error(errormessage AS String)
FrmBuildView.taTerm.pos = Len(FrmBuildView.taTerm.text)
FrmBuildView.taTerm.Insert(errormessage)
END


PUBLIC SUB Process_kill()
DIM iRetval AS Integer
DIM iNextStepNum AS Integer

iRetval = ME.QUICK_ERROR_CHECK(FrmBuildView.taTerm.text, "FAILED")

SELECT CASE iRetval
CASE 1 ' Error was found
  MdlMain.WRITE_TO_BUILD_LOG("Error detected in the build process... aborting")

    FrmBuildView.tmProgress.Enabled = FALSE
    ME.TOGGLE_CANCEL_BUTTON(FALSE)
    STOP EVENT
CASE 0 ' All clear... go to the next step

     SELECT CASE ME.iBuildState
        CASE 0 ' extraction is done
          ME.GUESS_SRC_TYPE(ClsGlobal.sTMP_DIR &/ ClsBuildVars.sName &
"-" & ClsBuildVars.sVersion)
        CASE ELSE
        'iNextStepNum = ME.iBuildState + 1
          SELECT CASE ME.sBuildType
            CASE "GNU"
                'WHILE iBuildState < 4
                IF ibuildstate < 4
              ME.BUILD_C(ClsBuildVars.sName, ClsBuildVars.sVersion,
ClsBuildVars.sSlackDesc, ME.iBuildState + 1)
                'WEND
                END IF
          END SELECT

    END SELECT

END SELECT

END


PUBLIC FUNCTION BUILD_C(sName AS String, sVer AS String, sPkgDescPath
AS String, iBuildStep AS Integer)

  'Assumes GNU style build will be used (determined by the type of source found)

  DIM sArch AS String = ClsBuildVars.sArch
  DIM sRel AS String = ClsBuildVars.sRel
  DIM sTag AS String = ClsBuildVars.sTag
  DIM sConfig AS String = ClsBuildVars.sConfig
  DIM sCFLAGS AS String = ClsBuildVars.sCFLAGS
  DIM sPkgType AS String = ClsBuildVars.sType
  DIM sFullPackageName AS String = sName & "-" & sVer & "-" & sArch &
"-" & sRel & sTag & "." & sPkgType
  DIM sTmpSpace AS String = ClsGlobal.sTMP_DIR
  DIM sBuildDir AS String = sTmpSpace &/ sName & "-" & sVer &/ "build"
  'DIM sShellCmd AS String
  DIM sPKG AS String = sBuildDir &/ "PKG"
  DIM sLackDescDest AS String = sPKG &/ "install"

  'message.Info(iBuildStep)

  SELECT CASE iBuildStep

    'CASE 0 ' Guess

    CASE 1 ' Configure the source
        IF IsDir(sBuildDir) = FALSE THEN
          PRINT "Creating build directory"
          TRY MKDIR sBuildDir
        END IF
        MdlMain.WRITE_TO_BUILD_LOG("Begin configure process...")
    sShellCmd = "cd " & sBuildDir & " && ../configure " & sConfig & "
CFLAGS=\'" & sCFLAGS & "\' || echo \'FAILED\'"
      FrmBuildView.PbBuildProg.value = 0.25
    'RETURN
    CASE 2 ' Run make
      MdlMain.WRITE_TO_BUILD_LOG("Run make")
    sShellCmd = "cd " & sBuildDir & " && make || echo \'FAILED\'"
    FrmBuildView.PbBuildProg.value = 0.50
    'RETURN
    CASE 3 ' make install
        MdlMain.WRITE_TO_BUILD_LOG("Run make install")
        IF IsDir(sPkg) = FALSE THEN
          MKDIR sPKG
        END IF

    ' insert the slack-desc into the package
      IF IsDir(sLackDescDest) = FALSE THEN
        MKDIR sLackDescDest
      END IF
        ME.INSERT_DESC(ClsBuildVars.sSlackDesc, sLackDescDest)
    sShellCmd = "cd " & sBuildDir & " && make DESTDIR=" & sPKG & "
install || echo \'FAILED\'"

    FrmBuildView.PbBuildProg.value = 0.75
    'RETURN
    CASE 4
      MdlMain.WRITE_TO_BUILD_LOG("Package built source")
    ME.PACKAGE(sBuildDir &/ "PKG")
    CASE 101 ' on error
    sShellCmd = ""
    STOP EVENT
    RETURN



  END SELECT

EXECUTE_PROCESS(iBuildStep)


END



PUBLIC FUNCTION QUICK_ERROR_CHECK(sRawText AS String, sMatch AS
String) AS Integer
IF InStr(sRawText, sMatch) > 0 THEN
FrmBuildView.tmProgress.Enabled = FALSE   ' Found an error, stop the timer
RETURN 1
ELSE
RETURN 0
END IF
END

______________________ END OF MODULE _______________________________

Whew!.. that was a lot of code.

Basically, in a nutshell, what this is supposed to do is this
I have a function that assigns a different value to a variable
(sShellCmd) every time it is ran (the value is based on the results of
the previous step)
After this variable is assigned the new value, the same function
triggers the process.
When the process ends (using the process_kill() event for this), I run
an error check (using the QUICK_ERROR_CHECK function avobe) This
function decides wether the process will continue or not.


PLEASE HELP
You are more than welcome to checkout the full source code and take a
look at how everything works (or at least is supposed to work)
together.
svn co http://vpackager.googlecode.com/svn/branches/1.0.11/trunk
or browse it online... Here is a link to the FULL MODULE
http://code.google.com/p/vpackager/source/browse/branches/1.0.11/trunk/MdlBuild.module

Again, Using gambas-2.2.0.0
Thanks




More information about the User mailing list