I end up using "go list" to list dependencies, and rely on the makefile to 
cache builds, for the binary runs in docker and the host machine is a Mac, 
and cross compiling with race detector enable doesn't seem to easy in this 
case. Previously I had to give race detector up to use go build directly.

move-if-change sounds like a good approach, will come in handy when there 
is no need to cross compile, thanks for the tip.

On Thursday, April 16, 2020 at 4:09:27 AM UTC+8, Ian Lance Taylor wrote:
>
> On Wed, Apr 15, 2020 at 4:55 AM Glen Huang <hey...@gmail.com <javascript:>> 
> wrote: 
> > 
> > I have a makefile where upon a new go binary being built, it builds some 
> other stuff that is not go related. 
> > 
> > The go binary is unconditionally built with a FORCE prerequisite, so the 
> go build command always runs, but that command always updates the output 
> binary, which leads to downstream being unnecessarily built. 
> > 
> > Is there a way to tell go not to touch the output file if it builds 
> purely from the cache? 
> > 
> > Currently it prevents me from using a makefile, and I don't really feel 
> like sidestepping go's cache system by manually listing all go files and 
> have the makefile functions as a cache, besides, it's really difficult to 
> correctly list dependencies if the module is big and the binary being built 
> only depends on a subset. 
>
> Updating the binary is intentional, so that `go build` has consistent 
> behavior. 
>
> The way to handle this in a Makefile is to use the move-if-change 
> dance, which looks more or less like 
>
> real-target: stamp-target; @true 
> stamp-target: ... 
>     go build -o temporary-target ... 
>     if cmp temporary-target real-target; then \ 
>         rm temporary-target; \ 
>     else \ 
>         mv temporary-target real-target 
>     fi 
>     touch stamp-target 
>
> With this technique stamp-target will be rebuilt if any of its 
> dependencies change, and real-target will be rebuilt only if the build 
> generated a file that was different in some way. 
>
> Ian 
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/31a4ac61-69d7-4891-8b54-67fb22e082ce%40googlegroups.com.

Reply via email to