<# .Synopsis Build script for Packer. .Description Build script for Packer for all supported platforms and architectures. By default the following OSs and architectures are targeted. OS: * linux * darwin * windows * freebsd * openbsd Architecture: * 386 * amd64 * arm If the environment variable PACKER_DEV is defined, then the OS and architecture of the go binary in the path is used. The built binary is stamped with the current version number of Packer, the latest git commit, and +CHANGES if there are any outstanding changes in the current repository, e.g. Packer v0.10.1.dev (3c736322ba3a5fcb3a4e92394011a2e56f396da6+CHANGES) The build artifacts for the current OS and architecture are copied to bin and $GOPATH\bin. .Example .\scripts\build.ps1 #> # This script builds the application from source for multiple platforms. # Get the parent directory of where this script is. $DIR = [System.IO.Path]::GetDirectoryName($PSScriptRoot) # Change into that directory Push-Location $DIR | Out-Null # Get the git commit $GIT_COMMIT = $(git.exe rev-parse HEAD) git.exe status --porcelain | Out-Null if ($LastExitCode -eq 0) { $GIT_DIRTY = "+CHANGES" } # If its dev mode, only build for ourself if (Test-Path env:PACKER_DEV) { $XC_OS=$(go.exe env GOOS) $XC_ARCH=$(go.exe env GOARCH) } elseif (-not (Test-Path env:XC_ARCH)) { $XC_ARCH="386 amd64 arm" $XC_OS="linux darwin windows freebsd openbsd" } # Delete the old dir echo "==> Removing old directory..." Remove-Item -Recurse -ErrorAction Ignore -Force "bin\" Remove-Item -Recurse -ErrorAction Ignore -Force "pkg\" New-Item -Type Directory -Name bin | Out-Null # Delete the old dir echo "==> Building..." gox.exe ` -os="${XC_OS}" ` -arch="${XC_ARCH}" ` -ldflags "-X github.com/hashicorp/packer/version.GitCommit=${GIT_COMMIT}${GIT_DIRTY}" ` -output "pkg/{{.OS}}_{{.Arch}}/packer" ` . if ($LastExitCode -ne 0) { exit 1 } # Move all the compiled things to the $GOPATH/bin $GOPATH=$(go.exe env GOPATH) # Copy our OS/Arch to the bin/ directory echo "==> Copying binaries for this platform..." Get-ChildItem ".\pkg\$(go env GOOS)_$(go env GOARCH)\" ` |? { !($_.PSIsContainer) } ` |% { Copy-Item $_.FullName "bin\" Copy-Item $_.FullName "${GOPATH}\bin\" } # Done! echo "`r`n==> Results:" Get-ChildItem bin\