BX24 and PowerShell for managing a build process
I have been doing some BX24 development again lately. I have also been reading a lot about the new shell support that Microsoft has pre-released called PowerShell (formerly known as Monad). Well since I have been using the same batch files and VBScript files to manage my build process for BasicX source since 2001 I thought it might be time to look at another alternative.
I need to be able to do the following:- Perform command line compiles of the BX24 project
- Allow for the source to reside anywhere on the hard drive and still be able to compile.
- Initiate a compile of all BX24 projects so I do not have to do them one at a time
- Parse the BasicX.err file to determine if the compiler found errors
- Launch an editor that shows the BasicX.err file only when an error exists
- Be able to manage some registry entries specific to the BasicX IDE
- Have a limited set of scripts that do not require any changes to support the build process
- Allow for multiple project files to co-exist in the same folder. This means I need to save off the BasicX.err file into another file if I want to preserve what the results where from the compile.
After reading some about PowerShell it was very apparent that it would support anything I needed to do. The main huddle I needed to over come was learning the syntax that revolved around PowerShell. Fortunately it is based on the .Net framework so the majority of it was fairly easy to adjust to.
Since I already had a VBScript file that did most of the above tasks I started dissecting what it did first. The last time I touched this script was in 2001. The script did the pieces around changing the registry entries and launching the compiler but it had no support for parsing the error file and managing many project files. Here is the script that I ended up with:
param ([string]$WorkingDirectory)
# Define some script variables$chip_type="BX24"
# Save the current dirrectory so we can return to it
Push-Location
# If a working directory was passed in lets change to it
If ($WorkingDirectory){Set-Location $WorkingDirectory}
# Get the project files to process
$projectFiles = Get-ChildItem *.bxp
foreach ($project in $projectFiles){$project_file = $project.name.split(".")[0]
# Use the current directory as the working directory
$work_dir = $project.DirectoryName
# Set some registry entries for the basicx IDE
$configEntry = "hkcu:\software\vb and vba Program Settings\basicx\config"
Set-ItemProperty ($configEntry) -Name Chip_Type -value
$chip_typeSet-ItemProperty ($configEntry) -Name Work_Dir -value
$work_dir
# determine from the registry where the basicx executable is installed
$program_dir = Get-ItemProperty ($configEntry) -Name Install_Directory
# Map the P drive to the basicx install directory for convieniance
if (Test-Path p:) {}else {subst P: $program_dir.Install_Directory}
# Remove the error file if it exists
if (Test-Path basicx.err){del basicx.err}
if (Test-Path ($project_file + ".err")){del ($project_file + ".err")}
# Launch the compiler
P:\basicx.exe $project_file /c
# Wait for the compiler to finish
$processToWatch = Get-Process basicx$processToWatch.WaitForExit()
# Unmap P: drive
if (Test-Path p:){subst P: /d}
# Check for errors and launch the error file if some do exist
$CompileResult = get-content basicx.err
If (($CompileResult -match "Error in module").Length -gt 0){notepad basicx.err}
# Copy the error file off so it does not get overwritten when multiple
# projects are being compiled in a single directory
copy-item basicx.err -destination ($project_file + ".err")}
# Restore the original location
Pop-Location
Well that was pretty painless. I basically had a script that managed processing all BasicX project files in a given folder. Next I needed to have another script that found all the project folders for a given folder. This also meant processing projects in sub folders. This higher level script would launch the script above to do the compile. I ended up with the following script:
# Save the current dirrectory so we can return to it
Push-LocationSet-Location ..\
# Get a list of all projects
$project_Files = Get-ChildItem -recurse -include *.bxp | sort $_.DirectoryName$lastDir=""
foreach($project in $project_Files)
{
# Since we can have multiple projects in a folder and we send the
# working folder to the build script we want to skip folders we already
# processed
if ($lastdir -ne $project.DirectoryName)
{./tools/build $project.DirectoryName $lastDir = $project.DirectoryName}}
Pop-Location
Well that too was pretty easy. I am beginning to really respect the power of PowerShell. I can do so much more than what I was able to do with VBScript and do it easier. Later I will but together a sample BX24 project showing how I use these scripts and the folder structure I place them in.
Comments
Comments are closed