Comment 0 for bug 1884558

Revision history for this message
Ian Johnson (anonymouse67) wrote :

I have a go program which does not require any dynamic library dependencies, and as such I would like to link it statically and use the `base: base` for this snap, so I have tried this:

```
parts:
  etrace:
    build-environment:
      - CGO_ENABLED: "0"
    plugin: go
    source: .
```

but it still produces a dynamically linked executable against libc, because snapcraft internally does this command always:

```
Building etrace
go build -o /root/parts/etrace/install/bin ./...
go build -ldflags -linkmode=external -o /root/parts/etrace/install/bin ./...
# github.com/anonymouse64/etrace/cmd/etrace
loadinternal: cannot find runtime/cgo
```

which completes, but gives me this:

```
$ ldd ./squashfs-root/bin/etrace
        linux-vdso.so.1 (0x00007ffd91f77000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3d02414000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3d02624000)
```

which I can't use with the bare base snap. What works instead is to do this manually:

```
    override-build: |
      mkdir -p $SNAPCRAFT_PART_INSTALL/bin
      cd $SNAPCRAFT_PART_SRC
      go build -o $SNAPCRAFT_PART_INSTALL/bin ./...
```

It would be nice if snapcraft either:

1. automatically detected that CGO_ENABLED=0 was set in the build-environment and didn't manually link things
2. automatically detected that the built binaries from go build -o ./bin ./... were not dynamically linked at all and skipped the final link step
3. had a property or otherwise first-class mechanism to specify that a go part built with the go plugin should be statically compiled (perhaps an option to the plugin yaml, etc.), this could also potentially replace setting the build-environment for CGO_ENABLED=0 as well