Building a package does just what the docstring says, it runs the package’s deps/build.jl and the build.jl for any dependencies. In theory I guess a package author could put whatever they wanted in there but typically a build step is needed when a package has non-julia dependencies. The build.jl script could for instance download the source code of an open source C++ library and compile it. This is now less common in julia packages than it used to be, thanks to the Artifacts system. See e.g.:
http://pkgdocs.julialang.org/v1/artifacts/
Precompilation, however, is for julia code. For a proper explanation see the docs section on precompilation. For a super quick overly simplified version: You’ve probably heard that julia is a just-in-time compiled language. Code is only compiled to machine code at runtime. However, the compilation process has several steps, starting with the parsing of source code files, all the way down to optimizing the LLVM machine code generation. The basic idea of precompilation is that for julia modules, some of these steps can be done ahead of time, when you install or first use a package. So, speaking really loosely, precompilation performs a part of the compilation process that can be done ahead of time before runtime inputs are known. This partially compiled code is stored in your .julia directory and then accessed at runtime to speed up the just in time compilation process.