In this blog post we will talk about how to compile Go programs for multiple operating systems.
When we want to compile Go program we are using go build command. We already saw how to use it in my previous blog posts. But let’s make a recap here.
go build [-o output] [build flags] [packages]
The command is
go build with optional arguments like
-o for output, or build flags or packages.
When we build main package, the compiled program name will be same as the first source file.
go build hello.go
This command will compile program with name
Now if we want to name our compiled program differently we would use
Let’s say that we want to call our program
greetings instead of
hello. We would execute this command.
go build -o greetings.exe hello.go
On Mac OS and Linux just omit
.exe suffix, so it will be:
go build -o greetings hello.go
This will create an executable file named
Go give us possibility to build programs for multiple platforms (Windows, Linux, Mac OS, Solaris and more) without using that platform. For example, I can build Linux and Mac OS executable files on my Windows machine.
To build a program for some platform we need to know two things:
To find out those two values for our current running platform. We can use
go env command. This command will help us to examine the values of Go environment variables.
When we run this command we will see a big list of environment variables.
We are just interested in two of them. One is
GOOS which stands for Go Operating System, and the other one is
GOARCH and stand for Go Architecture. I just want to mention that
GOARCH variables default to the values of
GOHOSTARCH respectively. The values for
GOHOSTARCH will be automatically determined by our host OS and architecture.
To just see values for those two variables we can run this command:
go env GOOS GOARCH
And we will see those values.
On this example we can see that
GOOS = windows so I am running Windows OS, and
GOARCH = amd64 is a generic name for x86-64 bit architecture.
To see all possible platform/architecture combinations, that Go can build programs for, we can use
go tool command for that. Command is:
go tool dist list
This will output a list of currently supported platforms and architectures for installed Go version on your machine. This list may change with future versions of Go.
In this list we can see that output is formatted like
GOOS/GOARCH combination. So first value is operating system and second is processor architecture.
Now that we know our current
GOARCH values and all possible ones. Let’s see how we can use them to build Go programs for different platforms.
We can see
GOARCH values for three main operating systems:
MacOS is based on Darwin operating system so value for
Example file that we will use to compile is “Hello World”. You can find code here.
Navigate to your code directory in your terminal.
To compile program for Windows we will run
go build command with next options:
GOOS=windows GOARCH=amd64 go build -o hello-win.exe hello.go
Also because I am on Windows machine and my default values for
GOARCH are same as one specified in command, we can omit them. And in that case Go would use
GOHOSTARCH values to build a program. We can see that now in our project directory we have new
Next let’s compile same program for Linux with Intel 80386 microprocessor. Command is:
GOOS=linux GOARCH=386 go build -o hello-linux hello.go
Same here, we can see that new file
hello-linux was built.
And now to compile program for Mac OS with Apple Silicon which uses
ARM64 architecture. We will execute this command:
GOOS=darwin GOARCH=arm64 go build -o hello-mac hello.go
Once again we can see
hello-mac file inside our directory.
If you are on Linux or Mac OS, you can use the
file command to get more information about files that we just created.
To use it type file than name of the file you want to examine. Here we can see the outputs for our built files.