Skip to content

Commit 734a6cc

Browse files
authored
Merge pull request moby#5276 from slonopotamus/darwin
Add stub implementations to make buildkitd buildable for Darwin
2 parents b1abc62 + 64f4631 commit 734a6cc

File tree

7 files changed

+243
-101
lines changed

7 files changed

+243
-101
lines changed

cmd/buildkitd/main_containerd_worker.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
//go:build linux || windows || freebsd
2-
// +build linux windows freebsd
3-
41
package main
52

63
import (

executor/oci/spec_darwin.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package oci
2+
3+
import (
4+
"github.com/containerd/containerd/mount"
5+
"github.com/containerd/containerd/oci"
6+
"github.com/containerd/continuity/fs"
7+
"github.com/docker/docker/pkg/idtools"
8+
"github.com/moby/buildkit/solver/pb"
9+
"github.com/opencontainers/runtime-spec/specs-go"
10+
"github.com/pkg/errors"
11+
)
12+
13+
func withProcessArgs(args ...string) oci.SpecOpts {
14+
return oci.WithProcessArgs(args...)
15+
}
16+
17+
func generateMountOpts(_, _ string) []oci.SpecOpts {
18+
return nil
19+
}
20+
21+
func generateSecurityOpts(mode pb.SecurityMode, _ string, _ bool) ([]oci.SpecOpts, error) {
22+
return nil, nil
23+
}
24+
25+
func generateProcessModeOpts(mode ProcessMode) ([]oci.SpecOpts, error) {
26+
return nil, nil
27+
}
28+
29+
func generateIDmapOpts(idmap *idtools.IdentityMapping) ([]oci.SpecOpts, error) {
30+
if idmap == nil {
31+
return nil, nil
32+
}
33+
return nil, errors.New("no support for IdentityMapping on Darwin")
34+
}
35+
36+
func generateRlimitOpts(ulimits []*pb.Ulimit) ([]oci.SpecOpts, error) {
37+
if len(ulimits) == 0 {
38+
return nil, nil
39+
}
40+
return nil, errors.New("no support for POSIXRlimit on Darwin")
41+
}
42+
43+
// tracing is not implemented on Darwin
44+
func getTracingSocketMount(_ string) *specs.Mount {
45+
return nil
46+
}
47+
48+
// tracing is not implemented on Darwin
49+
func getTracingSocket() string {
50+
return ""
51+
}
52+
53+
func cgroupV2NamespaceSupported() bool {
54+
return false
55+
}
56+
57+
func sub(m mount.Mount, subPath string) (mount.Mount, func() error, error) {
58+
src, err := fs.RootPath(m.Source, subPath)
59+
if err != nil {
60+
return mount.Mount{}, nil, err
61+
}
62+
m.Source = src
63+
return m, func() error { return nil }, nil
64+
}

snapshot/localmounter_darwin.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package snapshot
2+
3+
import (
4+
"os"
5+
6+
"github.com/containerd/containerd/mount"
7+
"github.com/pkg/errors"
8+
"golang.org/x/sys/unix"
9+
)
10+
11+
func (lm *localMounter) Mount() (string, error) {
12+
lm.mu.Lock()
13+
defer lm.mu.Unlock()
14+
15+
if lm.mounts == nil && lm.mountable != nil {
16+
mounts, release, err := lm.mountable.Mount()
17+
if err != nil {
18+
return "", err
19+
}
20+
lm.mounts = mounts
21+
lm.release = release
22+
}
23+
24+
if len(lm.mounts) == 1 && lm.mounts[0].Type == "bind" {
25+
ro := false
26+
for _, opt := range lm.mounts[0].Options {
27+
if opt == "ro" {
28+
ro = true
29+
break
30+
}
31+
}
32+
if !ro {
33+
return lm.mounts[0].Source, nil
34+
}
35+
}
36+
37+
dir, err := os.MkdirTemp("", "buildkit-mount")
38+
if err != nil {
39+
return "", errors.Wrap(err, "failed to create temp dir")
40+
}
41+
42+
if err := mount.All(lm.mounts, dir); err != nil {
43+
os.RemoveAll(dir)
44+
return "", errors.Wrapf(err, "failed to mount %s: %+v", dir, lm.mounts)
45+
}
46+
lm.target = dir
47+
return dir, nil
48+
}
49+
50+
func (lm *localMounter) Unmount() error {
51+
lm.mu.Lock()
52+
defer lm.mu.Unlock()
53+
54+
if lm.target != "" {
55+
if err := mount.UnmountRecursive(lm.target, unix.MNT_FORCE); err != nil {
56+
return err
57+
}
58+
os.RemoveAll(lm.target)
59+
lm.target = ""
60+
}
61+
62+
if lm.release != nil {
63+
return lm.release()
64+
}
65+
66+
return nil
67+
}

source/git/source_darwin.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package git
2+
3+
import "golang.org/x/sys/unix"
4+
5+
var reexecSysProcAttr = unix.SysProcAttr{
6+
Setpgid: true,
7+
}

source/git/source_freebsd.go

Lines changed: 4 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,8 @@
11
package git
22

3-
import (
4-
"context"
5-
"os"
6-
"os/exec"
7-
"os/signal"
8-
"syscall"
9-
"time"
3+
import "golang.org/x/sys/unix"
104

11-
"github.com/docker/docker/pkg/reexec"
12-
"golang.org/x/sys/unix"
13-
)
14-
15-
const (
16-
gitCmd = "umask-git"
17-
)
18-
19-
func init() {
20-
reexec.Register(gitCmd, gitMain)
21-
}
22-
23-
func gitMain() {
24-
// Need standard user umask for git process.
25-
unix.Umask(0022)
26-
27-
// Reexec git command
28-
cmd := exec.Command(os.Args[1], os.Args[2:]...) //nolint:gosec // reexec
29-
cmd.SysProcAttr = &unix.SysProcAttr{
30-
Setpgid: true,
31-
Pdeathsig: unix.SIGTERM,
32-
}
33-
cmd.Stdout = os.Stdout
34-
cmd.Stderr = os.Stderr
35-
cmd.Stdin = os.Stdin
36-
37-
// Forward all signals
38-
sigc := make(chan os.Signal, 1)
39-
done := make(chan struct{})
40-
signal.Notify(sigc)
41-
go func() {
42-
for {
43-
select {
44-
case sig := <-sigc:
45-
if cmd.Process == nil {
46-
continue
47-
}
48-
switch sig {
49-
case unix.SIGINT, unix.SIGTERM, unix.SIGKILL:
50-
_ = unix.Kill(-cmd.Process.Pid, sig.(unix.Signal))
51-
default:
52-
_ = cmd.Process.Signal(sig)
53-
}
54-
case <-done:
55-
return
56-
}
57-
}
58-
}()
59-
60-
err := cmd.Run()
61-
close(done)
62-
if err != nil {
63-
if exiterr, ok := err.(*exec.ExitError); ok {
64-
switch status := exiterr.Sys().(type) {
65-
case unix.WaitStatus:
66-
os.Exit(status.ExitStatus())
67-
case syscall.WaitStatus:
68-
os.Exit(status.ExitStatus())
69-
}
70-
}
71-
os.Exit(1)
72-
}
73-
os.Exit(0)
74-
}
75-
76-
func runWithStandardUmask(ctx context.Context, cmd *exec.Cmd) error {
77-
cmd.Path = reexec.Self()
78-
cmd.Args = append([]string{gitCmd}, cmd.Args...)
79-
if err := cmd.Start(); err != nil {
80-
return err
81-
}
82-
waitDone := make(chan struct{})
83-
go func() {
84-
select {
85-
case <-ctx.Done():
86-
_ = unix.Kill(-cmd.Process.Pid, unix.SIGTERM)
87-
go func() {
88-
select {
89-
case <-waitDone:
90-
case <-time.After(10 * time.Second):
91-
_ = unix.Kill(-cmd.Process.Pid, unix.SIGKILL)
92-
}
93-
}()
94-
case <-waitDone:
95-
}
96-
}()
97-
err := cmd.Wait()
98-
close(waitDone)
99-
return err
5+
var reexecSysProcAttr = unix.SysProcAttr{
6+
Setpgid: true,
7+
Pdeathsig: unix.SIGTERM,
1008
}

source/git/source_unix_nolinux.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
//go:build unix && !linux
2+
3+
package git
4+
5+
import (
6+
"context"
7+
"os"
8+
"os/exec"
9+
"os/signal"
10+
"syscall"
11+
"time"
12+
13+
"github.com/docker/docker/pkg/reexec"
14+
"golang.org/x/sys/unix"
15+
)
16+
17+
const (
18+
gitCmd = "umask-git"
19+
)
20+
21+
func init() {
22+
reexec.Register(gitCmd, gitMain)
23+
}
24+
25+
func gitMain() {
26+
// Need standard user umask for git process.
27+
unix.Umask(0022)
28+
29+
// Reexec git command
30+
cmd := exec.Command(os.Args[1], os.Args[2:]...) //nolint:gosec // reexec
31+
cmd.SysProcAttr = &reexecSysProcAttr
32+
cmd.Stdout = os.Stdout
33+
cmd.Stderr = os.Stderr
34+
cmd.Stdin = os.Stdin
35+
36+
// Forward all signals
37+
sigc := make(chan os.Signal, 1)
38+
done := make(chan struct{})
39+
signal.Notify(sigc)
40+
go func() {
41+
for {
42+
select {
43+
case sig := <-sigc:
44+
if cmd.Process == nil {
45+
continue
46+
}
47+
switch sig {
48+
case unix.SIGINT, unix.SIGTERM, unix.SIGKILL:
49+
_ = unix.Kill(-cmd.Process.Pid, sig.(unix.Signal))
50+
default:
51+
_ = cmd.Process.Signal(sig)
52+
}
53+
case <-done:
54+
return
55+
}
56+
}
57+
}()
58+
59+
err := cmd.Run()
60+
close(done)
61+
if err != nil {
62+
if exiterr, ok := err.(*exec.ExitError); ok {
63+
switch status := exiterr.Sys().(type) {
64+
case unix.WaitStatus:
65+
os.Exit(status.ExitStatus())
66+
case syscall.WaitStatus:
67+
os.Exit(status.ExitStatus())
68+
}
69+
}
70+
os.Exit(1)
71+
}
72+
os.Exit(0)
73+
}
74+
75+
func runWithStandardUmask(ctx context.Context, cmd *exec.Cmd) error {
76+
cmd.Path = reexec.Self()
77+
cmd.Args = append([]string{gitCmd}, cmd.Args...)
78+
if err := cmd.Start(); err != nil {
79+
return err
80+
}
81+
waitDone := make(chan struct{})
82+
go func() {
83+
select {
84+
case <-ctx.Done():
85+
_ = unix.Kill(-cmd.Process.Pid, unix.SIGTERM)
86+
go func() {
87+
select {
88+
case <-waitDone:
89+
case <-time.After(10 * time.Second):
90+
_ = unix.Kill(-cmd.Process.Pid, unix.SIGKILL)
91+
}
92+
}()
93+
case <-waitDone:
94+
}
95+
}()
96+
err := cmd.Wait()
97+
close(waitDone)
98+
return err
99+
}

util/network/netproviders/network_nobridge.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
//go:build freebsd || windows
2-
// +build freebsd windows
1+
//go:build !linux
2+
// +build !linux
33

44
package netproviders
55

0 commit comments

Comments
 (0)